本文基于以下系统版本:Ubuntu20.04 + ROS2 Foxy
环境配置教程:Ububtu 20.04.6 LTS 安装 ROS2和Gazebo仿真环境
本文实现的任务如下:
- 编写一个基于python的ROS2工作包,命名为
package1
- 创建一个名为
mySubscriber
的节点,并用该节点通过/myTopic/topic_a
话题发布字符串Learning ROS2
,并使用print()
向终端输出发送的内容- 创建一个名为
myPublisher
的节点,并用该节点订阅/myTopic/topic_a
话题,接收上一个话题发布的字符串,并使用self.get_logger().info()
向ROS2的运行日志输出收到的内容- 使用ROS2的CLI tools查看正在运行的节点和话题,并输出话题的数据
具体步骤如下:
- 创建工作空间
mkdir -p ~/my_ws/src
- 创建功能包
# 首先进入工作目录
cd ~/my_ws/src
# 创建Python功能包
ros2 pkg create --build-type ament_python package1
- 编译功能包
cd ~/my_ws
# 注意:编译语句应在工作空间根目录下执行
colcon build
source install/local_setup.bash
- 编写节点代码
此处代码参考 古月居ROS2教程
# 发布者节点,文件名为publishNodeTest.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class PublisherNode(Node):
def __init__(self, name):
super().__init__(name)
self.pub = self.create_publisher(String, "/myTopic/topic_a", 10) # 参数依次为:消息类型、话题名、队列长度
self.timer = self.create_timer(2, self.timer_callback) # 参数2表示每隔2秒执行一次
def timer_callback(self):
msg = String()
msg.data = 'Learning ROS2'
self.pub.publish(msg)
print('published:' ,msg.data)
def main(args=None):
rclpy.init(args=args)
node = PublisherNode("myPublisher")
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
# 订阅者节点,文件名为subscribeNodeTest.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class SubscriberNode(Node):
def __init__(self, name):
super().__init__(name)
self.sub = self.create_subscription(String, "/myTopic/topic_a", self.listener_callback, 10) # 参数依次为:消息类型、话题名、队列长度
def listener_callback(self, msg): # 当收到话题的数据时,执行此函数的操作
self.get_logger().info('received: %s' % msg.data) #向ROS2的日志写入收到的数据
def main(args=None):
rclpy.init(args=args)
node = SubscriberNode("mySubscriber")
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
- 向setup.py添加以上程序的入口
entry_points={
'console_scripts': [
# 在setup.py对应位置添加以下两行即可
'mysub = package1.subscribeNodeTest:main',
'mypub = package1.publishNodeTest:main',
],
},
说明:此处左值mysub为自己设定的executable名称,后续使用“ros2 run 包名 executable名称”指令即可执行对应python代码。右值为“包名.python代码源文件名:main”的形式。包名或源文件名需自行修改。
- 编译执行
colcon build
source install/local_setup.bash
# 在新的终端运行编写的包时,同样要执行source语句
- 效果展示
分别启动两个节点后,各自的终端应显示如下信息:
以上两个节点运行时,在第三个终端执行ros2 topic list
和ros2 node list
,可以看到正在运行的话题和节点,并可通过ros2 topic echo 话题名
将话题数据显示在终端,如图所示
个人记录备忘,如有疏漏之处,欢迎讨论指出