ROS与Python入门教程-发布信息
ROS与Python入门教程-发布信息
说明
- 这一节介绍更多关于发布信息的高级功能
方法
- 简化书写,如:
pub.publish(String(str))
- 可变更为:
pub.publish(str)
rospy已经知道你使用std_msgs.msg.String,会自动帮你实例化这个类
如果消息有多个参数的,你必需按在.msg文件定义的顺序来指定。例如:std_msgs/ColorRGBA
$ rosmsg show std_msgs/ColorRGBA
float32 r
float32 g
float32 b
float32 a
- 如下代码会依次初始化r g b 和a作为参数
pub.publish(0.1, 0.2, 0.3, 0.4)
- 这样很方便,但是也很脆弱,如果增加ColorRGBA字段,就需要找到所有相关的python代码,重新更改,增加参数。
- 幸运的是,有一个更强大的方式指定字段和你忽略任何字段(忽略的字段,分配默认值)。你只需使用Python关键字参数来指定您希望分配字段。其余的是分配的默认值(数值为零,数组的空列表,字符串的空字符串):
pub.publish(a=1.0)
- 上面代码发布一个ColorRGBA消息,设置a=1.0,其他 (r, g, b)都指定为0.
编写talker_color节点
- 在beginner_tutorials/scripts目录,talker_color.py节点
$ roscd beginner_tutorials/scripts
$ touch talker_color.py
$ chmod +x talker_color.py
$ rosed beginner_tutorials talker_color.py
- 手工输入如下代码:
#!/usr/bin/env python
import rospy
from std_msgs.msg import ColorRGBA
def talker():
#pub = rospy.Publisher('chatter', String)
pub = rospy.Publisher('chatter_color', ColorRGBA)
rospy.init_node('talker_color')
while not rospy.is_shutdown():
pub.publish(a=1.0)
rospy.sleep(1.0)
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException: pass
编写listener_color节点
- 在beginner_tutorials/scripts目录,listener_color.py节点
$ roscd beginner_tutorials/scripts
$ touch listener_color.py
$ chmod +x listener_color.py
$ rosed beginner_tutorials listener_color.py
- 手工输入如下代码:
#!/usr/bin/env python
import rospy
from std_msgs.msg import ColorRGBA
def callback(data):
rospy.loginfo(rospy.get_name()+ "I heard r=%s g=%s b=%s a=%s", data.r, data.g, data.b, data.a)
def listener():
rospy.init_node('listener_color', anonymous=True)
rospy.Subscriber("chatter_color", ColorRGBA, callback)
rospy.spin()
if __name__ == '__main__':
listener()
测试
- 新打开终端,启动roscore
$ roscore
- 新打开终端,启动talker_color.py
$rosrun beginner_tutorials talker_color.py
- 新打开终端,启动listener_color.py
$rosrun beginner_tutorials listener_color.py
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号