Rossum--ROSjava的消息发送

From:http://blog.csdn.net/f_season/article/details/9180061

通过前面一篇Android上ROS开发——android_core创建一个android应用 应该已经懂了怎么把消息发布给某主题,但是由于发送消息的格式不同,代码有些许改动。虽然通过eclipse可以自己琢磨出如何处理某消息格式下的数据,或者直接google ROS的格式,但是找起来还是有点麻烦,我这还是详细讲解下。

首先是最基本最简单的发送std_msg格式:

[java]  view plain copy
  1. package rosjava.wtf.pocketsphinx.version1;  
  2.   
  3. import org.ros.concurrent.CancellableLoop;  
  4. import org.ros.namespace.GraphName;  
  5. import org.ros.node.AbstractNodeMain;  
  6. import org.ros.node.ConnectedNode;  
  7. import org.ros.node.topic.Publisher;  
  8.   
  9. public class TalkChnString extends AbstractNodeMain {  
  10.   
  11.         
  12.   @Override  
  13.   public GraphName getDefaultNodeName() {  
  14.     return GraphName.of("rosjava_tutorial_pubsub/talkerchnstring");  
  15.   }  
  16.   
  17.   @Override  
  18.   public void onStart(final ConnectedNode connectedNode) {  
  19.     final Publisher<std_msgs.String> publisher =  
  20.         connectedNode.newPublisher("chatter", std_msgs.String._TYPE);  
  21.     // This CancellableLoop will be canceled automatically when the node shuts  
  22.     // down.  
  23.     connectedNode.executeCancellableLoop(new CancellableLoop() {  
  24.           
  25.       @Override  
  26.       protected void setup() {  
  27.       }  
  28.   
  29.       @Override  
  30.       public void loop() throws InterruptedException {  
  31.           std_msgs.String chnstr = publisher.newMessage();  
  32.         chnstr.setData( IsrActivity.tmpchnstring );  
  33.         if(PocketSphinxROS.sendchnstring)  
  34.         {  
  35.         publisher.publish(chnstr);  
  36.       PocketSphinxROS.sendchnstring = false;  
  37.         }  
  38.        Thread.sleep(500);  
  39.       }  
  40.     });  
  41.   }  
  42. }  
这里可以看出,我们取出IsrAcitivity.tmpchnstring中的字符串,通过PocketSphinxROS.sendchnstring控制单次发布给chatter主题。

[java]  view plain copy
  1. package rosjava.wtf.pocketsphinx.version1;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.Arrays;  
  5. import java.util.List;  
  6.   
  7. import org.ros.concurrent.CancellableLoop;  
  8. import org.ros.namespace.GraphName;  
  9. import org.ros.node.AbstractNodeMain;  
  10. import org.ros.node.ConnectedNode;  
  11. import org.ros.node.topic.Publisher;  
  12.   
  13. import android.R.string;  
  14.   
  15. import sensor_msgs.JointState;  
  16.   
  17. public class TalkServo extends AbstractNodeMain {  
  18.       
  19.     public static double[] vel= {0.5,0.5};  
  20.     public static double[] pos= {-0.17,0.75};  
  21.   
  22.     String[] s = {"pan","tilz"};   
  23.     ArrayList<String> list = new ArrayList<String>(Arrays.asList(s));  
  24.       
  25.   @Override  
  26.   public GraphName getDefaultNodeName() {  
  27.     return GraphName.of("rosjava_tutorial_pubsub/talkerserver");  
  28.   }  
  29.   
  30.   @Override  
  31.   public void onStart(final ConnectedNode connectedNode) {  
  32.       final Publisher<JointState> publisher =  
  33.                connectedNode.newPublisher("joint_states""sensor_msgs/JointState");  
  34.     // This CancellableLoop will be canceled automatically when the node shuts  
  35.     // down.  
  36.     connectedNode.executeCancellableLoop(new CancellableLoop() {  
  37.           
  38.       @Override  
  39.       protected void setup() {  
  40.       }  
  41.   
  42.       @Override  
  43.       public void loop() throws InterruptedException {  
  44.             JointState joint = (JointState) publisher.newMessage();  
  45.         if(PocketSphinxROS.sendservo)  
  46.         {  
  47.             joint.setName(list);  
  48.             joint.setVelocity(vel);  
  49.             joint.setPosition(pos);  
  50.             publisher.publish(joint);  
  51.         }  
  52.        Thread.sleep(100);  
  53.       }  
  54.     });  
  55.   }  
  56. }  
这篇代码发送控制舵机信息到joint_states主题,重点来说明下舵机信息sensor_msgs/JointState的格式。官方说明该消息的格式是:
[java]  view plain copy
  1. Header header  
  2.   
  3. string[] name  
  4. float64[] position  
  5. float64[] velocity  
  6. float64[] effor  


name就是舵机名,position就是舵机需要运动到的位置,velocity是舵机运动的速度,本质就是控制运动延迟。3个以数组形式一一对应,比如上面代码所示,舵机pan对应速度0.5,姿态-0.17。这样我们就可以通过处理这3个数据(这里是list,vel,pos)发送控制舵机的命令了。要说明的是这里和PC上ROS C++开发不一样,name需要放到ArrayList<String>中。

[java]  view plain copy
  1. package rosjava.wtf.pocketsphinx.version1;  
  2.   
  3. import geometry_msgs.Twist;  
  4. import org.ros.concurrent.CancellableLoop;  
  5. import org.ros.namespace.GraphName;  
  6. import org.ros.node.AbstractNodeMain;  
  7. import org.ros.node.ConnectedNode;  
  8. import org.ros.node.topic.Publisher;  
  9.   
  10. public class TalkParam extends AbstractNodeMain {  
  11.   
  12.       public static String tmpstring="WTF";  
  13.       public static float LX,LY,LZ,AX,AY,AZ;  
  14.         
  15.   @Override  
  16.   public GraphName getDefaultNodeName() {  
  17.     return GraphName.of("rosjava_tutorial_pubsub/talker");  
  18.   }  
  19.   
  20.   @Override  
  21.   public void onStart(final ConnectedNode connectedNode) {  
  22.       final Publisher<Twist> publisher =  
  23.                connectedNode.newPublisher("cmd_vel""geometry_msgs/Twist");  
  24.     // This CancellableLoop will be canceled automatically when the node shuts  
  25.     // down.  
  26.     connectedNode.executeCancellableLoop(new CancellableLoop() {  
  27.           
  28.       @Override  
  29.       protected void setup() {  
  30.       }  
  31.   
  32.       @Override  
  33.       public void loop() throws InterruptedException {  
  34.             Twist cmd = publisher.newMessage();  
  35.         if(PocketSphinxROS.send)  
  36.         {  
  37.         cmd.getLinear().setX(LX);  
  38.         cmd.getLinear().setY(LY);  
  39.         cmd.getLinear().setZ(LZ);  
  40.         cmd.getAngular().setX(AX);  
  41.         cmd.getAngular().setY(AY);  
  42.         cmd.getAngular().setZ(AZ);  
  43.         publisher.publish(cmd);  
  44.         }  
  45.        Thread.sleep(100);  
  46.       }  
  47.     });  
  48.   }  
  49. }  
这一篇代码讲述控制机器人运动(电机)的消息发布。这里使用geometry_msgs/Twist格式发布到cmd_vel主题。这里消息参数分为6个,线性运动的三个轴数据,角运动的三个轴数据。默认机器人正方向为线性X轴方向,头顶向上为Z轴。官方定义:

[java]  view plain copy
  1. Vector3  linear  
  2. Vector3  angular  

比如前进:

[java]  view plain copy
  1. TalkParam.AX=0;  
  2. TalkParam.AY=0;  
  3. TalkParam.AZ=0;  
  4. TalkParam.LX=0.4f;  
  5. TalkParam.LY=0;  
  6. TalkParam.LZ=0;  
后退则给LX负值。

左转:(这里的左转是原地左转,因为你也看到,没有给线速度)这里AZ表示绕Z轴转动。

[java]  view plain copy
  1. TalkParam.AX=0;  
  2. TalkParam.AY=0;  
  3. TalkParam.AZ= 0.6f;  
  4. TalkParam.LX=0;  
  5. TalkParam.LY=0;  
  6. TalkParam.LZ=0;  
右转则给负值。具体速度大小相关于机器人电机参数和底层参数,所以具体机器人具体测试。

以上给出的是机器人常用到的几种消息发送格式,你也可以找到官方提供的其他消息格式,当然你也可以自己定义所发送消息的格式。


by:season

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值