创建ROS2工作空间并使用话题实现节点通信——ROS2入门系列

本文基于以下系统版本:Ubuntu20.04 + ROS2 Foxy
环境配置教程:Ububtu 20.04.6 LTS 安装 ROS2和Gazebo仿真环境

本文实现的任务如下:

  1. 编写一个基于python的ROS2工作包,命名为package1
  2. 创建一个名为mySubscriber的节点,并用该节点通过/myTopic/topic_a话题发布字符串Learning ROS2,并使用print()向终端输出发送的内容
  3. 创建一个名为myPublisher的节点,并用该节点订阅/myTopic/topic_a话题,接收上一个话题发布的字符串,并使用self.get_logger().info()向ROS2的运行日志输出收到的内容
  4. 使用ROS2的CLI tools查看正在运行的节点和话题,并输出话题的数据

具体步骤如下:

  1. 创建工作空间
mkdir -p ~/my_ws/src
  1. 创建功能包
# 首先进入工作目录
cd ~/my_ws/src
# 创建Python功能包
ros2 pkg create --build-type ament_python package1
  1. 编译功能包
cd ~/my_ws
# 注意:编译语句应在工作空间根目录下执行
colcon build
source install/local_setup.bash
  1. 编写节点代码
    此处代码参考 古月居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()
  1. 向setup.py添加以上程序的入口
entry_points={
    'console_scripts': [
    	# 在setup.py对应位置添加以下两行即可
        'mysub = package1.subscribeNodeTest:main', 
        'mypub = package1.publishNodeTest:main',
    ],
},

说明:此处左值mysub为自己设定的executable名称,后续使用“ros2 run 包名 executable名称”指令即可执行对应python代码。右值为“包名.python代码源文件名:main”的形式。包名或源文件名需自行修改。

  1. 编译执行
colcon build
source install/local_setup.bash
# 在新的终端运行编写的包时,同样要执行source语句
  1. 效果展示
    分别启动两个节点后,各自的终端应显示如下信息:
    在这里插入图片描述
    以上两个节点运行时,在第三个终端执行ros2 topic listros2 node list,可以看到正在运行的话题和节点,并可通过ros2 topic echo 话题名将话题数据显示在终端,如图所示
    在这里插入图片描述

个人记录备忘,如有疏漏之处,欢迎讨论指出

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值