ROS最重要的特性之一就是多语言的支持,可以使用C++、Python等语言进行程序的开发,ROS2会继续强化这个特性,对更多语言提供丰富的支持。
这里我们尝试ROS2当中的Python编程,实现话题和服务通信。
在进行操作前,请先参考以下链接,完成ROS 2的安装和例程编译:
一、话题通信
代码编译后,在终端设置环境变量,并使用如下命令运行listener和talker:
$ ros2 run demo_nodes_py listener
$ ros2 run demo_nodes_py talker
运行成功后,可以看到如下效果:
以上talker和listener的具体实现,我们可以来分析下代码,分析内容请见代码中的注释:
talker.py
# 引用python接口
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class Talker(Node):
def __init__(self):
super().__init__('talker')
self.i = 0
# 创建一个Publisher,发布名为chatter的topic,消息类型为String
self.pub = self.create_publisher(String, 'chatter')
# 设置定时器,周期调用定时器回调函数timer_callback
timer_period = 1.0
self.tmr = self.create_timer(timer_period, self.timer_callback)
def timer_callback(self):
# 创建String类型的消息
msg = String()
msg.data = 'Hello World: {0}'.format(self.i)
self.i += 1
self.get_logger().info('Publishing: "{0}"'.format(msg.data))
# 发布消息
self.pub.publish(msg)
def main(args=None):
# ROS节点初始化
rclpy.init(args=args)
# 创建节点及发布器
node = Talker()
# 循环
rclpy.spin(node)
# 销毁节点,退出程序
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
listener.py
# 引用python接口
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class Listener(Node):
def __init__(self):
super().__init__('listener')
# 创建一个subscriber,订阅名为chatter的topic
# 消息类型是String,回调函数为chatter_callback
self.sub = self.create_subscription(String, 'chatter', self.chatter_callback)
def chatter_callback(self, msg):
# 将收到的消息数据打印出来
self.get_logger().info('I heard: [%s]' % msg.data)
def main(args=None):
# ROS节点初始化
rclpy.init(args=args)
# 创建节点及订阅器
node = Listener()
# 循环查询消息队列&#x