rospy 自定义msg以及如何publish

3 篇文章 0 订阅
1 篇文章 0 订阅

本文环境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。

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值