本文环境Ubuntu16.04 +ROS kinetic +python2.7环境实现
rospy自定义msg,其步骤与ros C++步骤一致,这个不清楚的同学可以自行搜索一下如何添加。
主要步骤有三点
1、添加msg文件夹以及.msg文件
2、修改package.xml
3、修改CMakeLsits.txt
我的工程中目录结构如图所示
本文的重点是如何填充数据以及发送
填充数据有疑问,根据一些博主的例子尝试发现会报错,由于自定义的msg也会生成对应的py文件,基本上是以_Frame.py(以上图工程为例)文件格式存在。各位有兴趣可以自行研读其中有关于 __init__(*args, **kwds)中两个参数的意义
这是我Frame.msg中定义的数据
Header header
uint32 id
bool is_rtr
bool is_extended
bool is_error
uint8 dlc
uint8[8] data
header = std_msgs.msg.Header()
self.canNhPub.publish(header,self.rFrame.getId(),self.rFrame.getIsRtr(),self.rFrame.getIsExtend(),self.rFrame.getIsError(),self.rFrame.getDlc(),self.rFrame.getData())
如上图所示,self.canNhPub对应于你的rospy.Publisher生成的对象。也就是
canNhPub = rospy.Publisher('received_messages', Frame, queue_size=10)
publish后面的参数对应于Frame.msg文件中定义的数据,切记要顺序一致,且位数不能少,最后一个是8位的列表,就必须传长度为8的列表。如此就可以正常发布了!
对了不要忘记导包
from can_net_bridge.msg import Frame #can_net_bridge为你的包名 msg就是msg文件夹 Frame就是你的 .msg文件名字
import std_msgs.msg #构造Header需要
以下是尝试的其他行不通的方式
后面有部分博主给出的例子是要用Frame()对象赋值参数值设置即:
self.canNhPub.publish(Frame(header,self.rFrame.getId(),self.rFrame.getIsRtr(),self.rFrame.getIsExtend(),self.rFrame.getIsError(),self.rFrame.getDlc(), self.rFrame.getData()))
或者
header = std_msgs.msg.Header()
myFrame = Frame()
myFrame.data = [0]*8
myFrame.dlc = 1
myFrame.header = std_msgs.msg.Header()
myFrame.id = 1
myFrame.is_error = False
myFrame.is_extended = False
myFrame.is_rtr = False
self.canNhPub.publish(myFrame)
等方法,但是很难过,并不行,起码我这边是没有运行成功的,通过查看源码,找到提示的错误信息是由mesage.py中这一行抛出
raise TypeError('Invalid number of arguments, args should be %s' % str(self.__slots__) + ' args are' + str(args))
顺带提一句,你的自定义msg生成的py文件是继承了message.py 的,构造是要先构造message,在超级权限下添加打印信息 看了args的(也就是__init__(*args, **kwds))中的args的长度,发现以上两种不行的方法得到的args长度均为1,而要求的长度是7,也就是msg所需元素的个数。
所以直接按照顺序把参数写入参数列表即可正常发布topic上的message。