ROS:定制自己的消息类型msg

转载自:https://blog.csdn.net/heyijia0327/article/details/41654963

在实际应用中,我们可能想发布自己的消息类型,就像众所周知的Twist类型或者航向信息Odometry一样,那么到底如何定制自己想要的消息类型?本文楼主以自己调试过程中监控机器人左右轮速度来进行演示。

     文章内容包括:消息的定制和使用,以及使用rqt_plot来绘制曲线,建议大家先阅读官网教程,一些细节事项也可参见这个自定义消息msg

    首先在你的package创建msg文件夹,然后新建一个空白文档,命名为Num.msg,将下面的左右轮速度复制进去,保存。当然你可以按照官网方式在终端里输入指令来执行上的流程。

这里我定义来一个左右轮速度的如下:

 
  1. float32 leftspeed

  2. float32 rightspeed</span>

如果你想定义为数组类型的,如下:

 
  1. float32[] leftspeed

  2. float32[] rightspeed

注意这里的数组使用的是无长度限制的,也就是方扩号内没有东西。在使用的时候,不能够直接用数组赋值那样去做,它实际上是一个向量,往里面填充数据应使用c++中vector的push_back、resize之类的函数。详细内容可参看该ros answer,该例程使用push_back填充数据.也可以参见官方教程中laserscan的发布,laserscan消息中的ranges就是这样一个向量,在程序中laserscan是使用的resize先设定容器大小,再往里填充数据的.

  36     scan.ranges.resize(num_readings);//使用resize设定激光点的多少
  37     scan.intensities.resize(num_readings);
  38     for(unsigned int i = 0; i < num_readings; ++i){
  39       scan.ranges[i] = ranges[i];    //再往里面填数据
  40       scan.intensities[i] = intensities[i];
  41     }

定义完以后,注意在package.xml文件里添加:

 
  1. <build_depend>message_generation</build_depend>

  2. <run_depend>message_runtime</run_depend>

如果你之前创建过消息已经有了上面两句就不用再添加了。

然后在 CMakeLists.txt文件的find_packag里添加一些必要的语句,这个参见前面提到的官网教程。
最主要的是在add_message_files里添加上你自定义的消息。

 
  1. ## Generate messages in the 'msg' folder

  2. add_message_files(

  3. FILES

  4. Num.msg

  5. carOdom.msg

  6. )

如果都完成以后,新开一个终端,输入一下指令,编译一下:

 
  1. cd ~/catkin_ws

  2. catkin_make

在程序中首先使用下面的语句引进该消息msg类型

from  beginner_tutorials.msg import Num       #beginner_tutorials 为自己建立的package,放在catkin_ws/src下

在程序中使用自己已经定义的消息:
car_speed = Num() #注意 消息的使用car_speed.leftspeed = a  car_speed.rightspeed = b

 

这里贴一个自己的完整程序在下面,这个程序里包含了Lz自己写的串口模块,这里贴出来只是让大家知道怎么调用自定义的msg。

程序如下:

 
  1. #!/usr/bin/env python

  2. # -*- coding: utf-8 -*-

  3. import roslib;roslib.load_manifest('beginner_tutorials')

  4. import rospy

  5. from beginner_tutorials.msg import Num       #beginner_tutorials 为自己建立的package,放在catkin_ws/src下

  6.  
  7. import serial_lisenning as COM_ctr            #这是楼主自己写的串口模块,已经封装好,模块里是开线程不断读取串口

  8. import glob

  9.  
  10. def talker():

  11. rec_data = COM_ctr.SerialData( datalen = 2) #启动监听COM 线程

  12. allport = glob.glob('/dev/ttyU*')

  13. port = allport[0]

  14. baud = 115200

  15. openflag = rec_data.open_com(port, baud)

  16.  
  17. pub = rospy.Publisher('car_speed', Num)    #topic

  18. rospy.init_node('talker', anonymous=True)

  19. r = rospy.Rate(1000) # 1000hz

  20. while not rospy.is_shutdown():

  21. all_data = []

  22. if rec_data.com_isopen():

  23. all_data = rec_data.next() #接收的数据组

  24.  
  25. if all_data != []:

  26. car_speed = Num()                  #注意 消息的使用

  27. car_speed.leftspeed = all_data[0][0]

  28. car_speed.rightspeed = all_data[1][0]

  29. print car_speed.leftspeed, car_speed.rightspeed

  30. pub.publish(car_speed)

  31. r.sleep()

  32.  
  33. if openflag:

  34. rec_data.close_lisen_com()

  35.  
  36. if __name__ == '__main__':

  37. try:

  38. talker()

  39. except rospy.ROSInterruptException: pass


注意每次新建的py文件都要使用在新的终端中,用下面的命令使程序可执行。

chmod +x  your_code.py

运行roscore以后,再开一个新的终端,运行:

rosrun beginner_tutorials bluetooth_msg.py

然后再在一个新的终端中,运行:

rqt_plot

输入我们的topic,就可一使用rqt_plot绘制曲线了。

猜你喜欢

转载自blog.csdn.net/weixin_39123145/article/details/81984771