目录
三、话题之RCLPY实现
ROS2的API一致性保持的很好,使得实现不同版本的发布订阅比较简单。
1.创建功能包和节点
依托RCLCPP实现中创建的工作空间,创建新的功能包
cd chapt3_ws/src/
ros2 pkg create example_topic_rclpy --build-type ament_python --dependencies rclpy
创建节点文件
cd example_topic_rclpy/example_topic_rclpy
touch topic_subscribe_02.py
touch topic_publisher_02.py
编写代码源文件topic_publisher_02.py,创建节点,编写发布者
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
class NodePublisher02(Node):
def __init__(self,name):
super().__init__(name)
self.get_logger().info("大家好,我是%s!" % name)
self.command_publisher_ = self.create_publisher(String,"command", 10)
self.timer = self.create_timer(0.5, self.timer_callback)
def timer_callback(self):
"""
定时器回调函数
"""
msg = String()
msg.data = 'backup'
self.command_publisher_.publish(msg)
self.get_logger().info(f'发布了指令:{msg.data}') #打印一下发布的数据
def main(args=None):
rclpy.init(args=args) # 初始化rclpy
node = NodePublisher02("topic_publisher_02") # 新建一个节点
rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
rclpy.shutdown() # 关闭rclpy
编写代码源文件topic_subscribe_02.py,创建节点,编写订阅者
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
class NodeSubscribe02(Node):
def __init__(self,name):
super().__init__(name)
self.get_logger().info("大家好,我是%s!" % name)
# 创建订阅者
self.command_subscribe_ =
self.create_subscription(String,"command",self.command_callback,10)
def command_callback(self,msg):
speed = 0.0
if msg.data=="backup":
speed = -0.2
self.get_logger().info(f'收到[{msg.data}]命令,发送速度{speed}')
def main(args=None):
rclpy.init(args=args) # 初始化rclpy
node = NodeSubscribe02("topic_subscribe_02") # 新建一个节点
rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
rclpy.shutdown() # 关闭rclpy
修改setup.py,这段配置是声明一个ROS2的节点,声明后使用colcon build才能检测到,然后将其添加到install目录下
entry_points={
'console_scripts': [
"topic_publisher_02 = example_topic_rclpy.topic_publisher_02:main",
"topic_subscribe_02 = example_topic_rclpy.topic_subscribe_02:main"
],
},
2.运行测试
在工作空间目录下,编译,运行发布节点
colcon build --packages-select example_topic_rclpy
source install/setup.bash
ros2 run example_topic_rclpy topic_publisher_02
在工作空间目录下,运行订阅节点
source install/setup.bash
ros2 run example_topic_rclpy topic_subscribe_02
RQT可视化工具观察