ros 定义自己的消息---Python
来源:互联网 发布:阿里云服务器做git 编辑:程序博客网 时间:2024/06/04 18:45
在实际应用中,我们可能想发布自己的消息类型,就像众所周知的Twist类型或者航向信息Odometry一样,那么到底如何定制自己想要的消息类型?本文楼主以自己调试过程中监控机器人左右轮速度来进行演示。
如果你之前创建过消息已经有了上面两句就不用再添加了。在程序中使用自己已经定义的消息:
car_speed = Num() #注意 消息的使用car_speed.leftspeed = a car_speed.rightspeed = b这里贴一个自己的完整程序在下面,这个程序里包含了Lz自己写的串口模块,这里贴出来只是让大家知道怎么调用自定义的msg。
注意每次新建的py文件都要使用在新的终端中,用下面的命令使程序可执行。
然后再在一个新的终端中,运行:输入我们的topic,就可一使用rqt_plot绘制曲线了。
文章内容包括:消息的定制和使用,以及使用rqt_plot来绘制曲线,建议大家先阅读官网教程,一些细节事项也可参见这个自定义消息msg。
首先在你的package创建msg文件夹,然后新建一个空白文档,命名为Num.msg,将下面的左右轮速度复制进去,保存。当然你可以按照官网方式在终端里输入指令来执行上的流程。
这里我定义来一个左右轮速度的如下:
- float32 leftspeed
- float32 rightspeed</span>
如果你想定义为数组类型的,如下:
- float32[] leftspeed
- 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文件里添加:
- <build_depend>message_generation</build_depend>
- <run_depend>message_runtime</run_depend>
然后在 CMakeLists.txt文件的find_packag里添加一些必要的语句,这个参见前面提到的官网教程。
最主要的是在add_message_files里添加上你自定义的消息。
- ## Generate messages in the 'msg' folder
- add_message_files(
- FILES
- Num.msg
- carOdom.msg
- )
如果都完成以后,新开一个终端,输入一下指令,编译一下:
- cd ~/catkin_ws
- 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。
程序如下:
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- import roslib;roslib.load_manifest('beginner_tutorials')
- import rospy
- from beginner_tutorials.msg import Num #beginner_tutorials 为自己建立的package,放在catkin_ws/src下
- import serial_lisenning as COM_ctr #这是楼主自己写的串口模块,已经封装好,模块里是开线程不断读取串口
- import glob
- def talker():
- rec_data = COM_ctr.SerialData( datalen = 2) #启动监听COM 线程
- allport = glob.glob('/dev/ttyU*')
- port = allport[0]
- baud = 115200
- openflag = rec_data.open_com(port, baud)
- pub = rospy.Publisher('car_speed', Num) #topic
- rospy.init_node('talker', anonymous=True)
- r = rospy.Rate(1000) # 1000hz
- while not rospy.is_shutdown():
- all_data = []
- if rec_data.com_isopen():
- all_data = rec_data.next() #接收的数据组
- if all_data != []:
- car_speed = Num() #注意 消息的使用
- car_speed.leftspeed = all_data[0][0]
- car_speed.rightspeed = all_data[1][0]
- print car_speed.leftspeed, car_speed.rightspeed
- pub.publish(car_speed)
- r.sleep()
- if openflag:
- rec_data.close_lisen_com()
- if __name__ == '__main__':
- try:
- talker()
- except rospy.ROSInterruptException: pass
注意每次新建的py文件都要使用在新的终端中,用下面的命令使程序可执行。
- chmod +x your_code.py
运行roscore以后,再开一个新的终端,运行:
- rosrun beginner_tutorials bluetooth_msg.py
- rqt_plot
阅读全文
0 0
- ros 定义自己的消息---Python
- 在ROS中定义并使用自己的消息类型
- ROS:定制自己的消息类型msg
- ROS:定制自己的消息类型msg
- ROS:定制自己的消息类型msg
- ros定制自己的消息类型
- ros定义msg消息
- MFC中添加自己定义的消息
- ROS消息的创建
- Python Qt定义自己的对话框
- caffe 定义自己的python层
- python基础--调用自己定义的类
- [ROS]LaserScan消息的学习
- ROS-python实现简单的消息发布器和订阅器
- python下导入自己定义的模块的方法
- python 中导入自己定义的模块路径
- ROS 中sensor_msgs/Image 消息的格式
- ROS的geometry_msgs/PoseWithCovarianceStamped Message 消息格式
- ie7兼容问题
- mybatis generator自动生成代码 相对路径式配置
- 第10周项目1 (1)层次遍历算法的验证
- 环境问题
- Swift【优化Swift项目编译时间】
- ros 定义自己的消息---Python
- vue项目使用axios发送请求让ajax请求头部携带cookie
- 如何选择最佳前端框架
- (三)项目模块划分以及资源管理
- Vue填坑之路
- XC7VX690T-2FFG1761_PCIe 系列之二
- spring mvc开发接收日期字段表单提交,自动转换成Date类型为什么报错?
- malloc的简单使用-c语言程序
- node.js下mongoose简单操作实例