0.自学资料及连接
b站:鱼香ros 《ROS 2机器人开发从入门到实践》课程介绍
ros2官网 https://docs.ros.org/en/humble/Tutorials.html
1.什么是ros
ROS(机器人操作系统,Robot Operating System),是专为机器人软件开发所设计出来的一套电脑操作系统架构。它是一个开源的元级操作系统(后操作系统),提供类似于操作系统的服务,包括硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间消息传递、程序发行包管理,它也提供一些工具和库用于获取、建立、编写和执行多机融合的程序。
2.ros2-humble安装
一键安装指令
wget http://fishros.com/install -O fishros && . fishros
3.启用turtlesim及尝试rqt
turtlesim为海龟作图,turtlesim包里存在topic、service、action等的使用,是理解ros核心组件的好工具
rqt是ros2的GUI工具。rqt里做的所有操作都可以在命令行完成,但rqt提供了一个更友好的操作ros2元素的方式。
Step1: 启动turtlesim节点 ros2 run turtlesim turtlesim_node
Step2: 启动turtle_teleop_key节点 ros2 run turtlesim turtle_teleop_key
Step3: 启动rqt rqt
尝试看node graph,service,topic
4.节点(Node)
ROS中的每个节点应该负责的是单一的模块化任务,每个节点可以通过topic、service、action或param从其他节点发送和接收数据。

ros2运行可执行文件的指令 ros2 run <package_name> <executable_name>
运行turtlesim ros2 run turtlesim turtlesim_node
查看正在运行的节点 ros2 node list
查看节点信息 ro2 node info <node_name>
Remapping (暂且不讲)
To be continued.
5.创建一个节点(Python)
import rclpy
from rclpy.node import Node
def main(args=None):
rclpy.init(args=args) #初始化工作,分配资源
node = Node('my_node')
node.get_logger().info('Hello, ROS 2!')
rclpy.spin(node)
rclpy.shutdown()
if __name__ == '__main__':
main()
但一般我们会用面向对象的思想创建一个节点子类对象
import rclpy
from rclpy.node import Node
class MyNode(Node):
def __init__(self, name):
super().__init__(name)
self.get_logger().info('Hello, ROS 2!')
def main(args=None):
rclpy.init(args=args)
node = MyNode('my_node')
rclpy.spin(node)
rclpy.shutdown()
if __name__ == '__main__':
main()
6.话题(Topic)
Topic通信机制
一个节点可以向任意数量的话题发送信息(即一个节点可以有多个发布者),同时也可以从多个节点接收信息(即一个节点可以有多个订阅者)。同一个话题也可以被多个订阅者订阅。发布者和订阅者是由节点创造出来的,发布者和订阅者必定在节点对象中。


相关指令
查看话题列表 ros2 topic list
查看话题中的数据 ros2 topic echo <topic_name>
查看话题信息 ros2 topic info <topic_name>
turtlesim演示
Step 1: Step1: 启动turtlesim节点 ros2 run turtlesim turtlesim_node
Step2: 启动turtle_teleop_key节点 ros2 run turtlesim turtle_teleop_key
Step3: 启动rqt rqt
大概率出现以下界面

查看/turtle1/cmd_vel中的数据 ros2 topic echo /turtle1/cmd_vel
尝试操作海龟
ros2 interface show
每个话题都有其消息类型,发布者发布到这个话题的消息类型和订阅者接收该话题的消息类型应当是一致的
查看/turtle1/cmd_vel的消息类型 ros2 topic info /turtle1/cmd_vel
确认到该话题的消息类型为geometry_msgs/msg/Twist
查看该消息类型的具体内容ros2 interface show geometry_msgs/msg/Twist
手动pub(仅作认识)
指令 ros2 topic pub <topic_name> <msg_type> '<args>'
其中'<args>'要符合yaml语法
7.创建发布者、订阅者
创建发布者

重点关注前两个参数:
msg_type 消息类型
topic 话题名称
qos是服务质量,一般设置为10
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class MyNode(Node):
def __init__(self, name):
super().__init__(name)
self.publisher_ = self.create_publisher(String, 'chatter', 10)
timer_period = 1
self.timer = self.create_timer(timer_period, self.timer_callback)
self.get_logger().info('Hello, ROS 2!')
self.i = 0
def timer_callback(self):
msg = String()
msg.data = f'Hello, ROS 2!{self.i}'
self.get_logger().info(f'Publishing: "{msg.data}"')
self.publisher_.publish(msg)
self.i += 1
def main(args=None):
rclpy.init(args=args)
node = MyNode('publisher_node')
rclpy.spin(node)
rclpy.shutdown()
if __name__ == '__main__':
main()
创建订阅者

重点关注前三个参数:
msg_type消息类型
topic话题名
callback回调函数
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class MyNode(Node):
def __init__(self, name):
super().__init__(name)
self.subscription = self.create_subscription(String,'chatter',self.listener_callback,10)
def listener_callback(self, msg):
self.get_logger().info('I heard: "%s"' % msg.data)
def main(args=None):
rclpy.init(args=args)
node = MyNode('subscriber_node')
rclpy.spin(node)
rclpy.shutdown()
if __name__ == '__main__':
main()
Task:
创建一个测温系统由一个节点发布含温度的话题并每10s更新一次数据,数据由18.0℃ – 30.0℃随机取一个温度值。并由另一个节点接收温度并展示出来。
Tips:
随机温度
temp = round(random.uniform(18.0, 30.0), 1)
消息类型
from std_msgs.msg import Float32