note03
话题:
话题Topic:ROS2 中用于节点之间通信的命名通道
每个话题有一个唯一的名称,节点可以通过话题名称发布或订阅消息
消息:话题传输的数据称为消息;
订阅发布模式:
- 一个节点发布数据到某个话题上,另外一个节点就可以通过订阅话题拿到数据
消息接口:
-
ROS2帮我们在数据传递时做好了消息的序列化和反序列化(,而且ROS2的消息序列化与反序列化通信是可以做到跨编程语言、跨平台和跨设备之间的
-
同一个话题,所有的发布者和接收者必须使用相同消息的接口
-
在编译时,ROS2 会根据
.msg
文件生成对应语言的代码(如 C++ 的.hpp
文件或 Python 的.py
文件),从而实现跨语言的消息传输
msg、srv、action文件通过ROS2-IDL转换器将其转换为python中的py,和C++中的头文件
机器人控制:
开环控制:
- 制系统的输出仅依赖于输入信号,而不依赖于系统的实际输出或状态反馈
闭环控制:
- 闭环控制通过反馈机制实时监测系统的输出,并根据输出与目标值的差异调整控制信号,以实现更精确和鲁棒的控制
参数通信:
**A parameter is a configuration value of a node. You can think of parameters as node settings**
参数的组成由名字和值(键值组成),名字可以通过param list
获
保存参数:ros2 param dump <node_name>
ROS2日志
- DEBUG
- 用于调试信息,通常只在开发阶段使用
- 示例:
RCLCPP_DEBUG(node->get_logger(), "This is a debug message.");
- INFO:
- 用于一般信息,记录系统的正常运行状态
- 示例:
RCLCPP_INFO(node->get_logger(), "This is an info message.");
- WARN:
- 用于警告信息,表示可能存在问题,但不会影响系统运行
- 示例:
RCLCPP_WARN(node->get_logger(), "This is a warning message.");
- ERROR:
- 用于错误信息,表示系统运行中出现了问题
- 示例:
RCLCPP_ERROR(node->get_logger(), "This is an error message.");
- FATAL:
- 用于致命错误信息,表示系统无法继续运行
- 示例:
RCLCPP_FATAL(node->get_logger(), "This is a fatal message.");
代码配置日志:
// 设置日志级别node->get_logger().set_level(rclcpp::Logger::Level::Debug);// 输出日志RCLCPP_DEBUG(node->get_logger(), "This is a debug message.");RCLCPP_INFO(node->get_logger(), "This is an info message.");
命令行配置
ros2 run my_package my_node --ros-args --log-level debug
ROS参数:一种灵活的方式来配置和调整节点的行为
.msg:定义话题通信中传输的消息类型
.srv:定义服务通信中请求和响应的数据结构
Action:
一种高级通信机制,用于处理需要长时间运行的任务,并且支持任务的中途反馈和取消
- 目标(Goal):客户端发送的任务目标
- 反馈(Feedback):服务器在执行任务过程中发送的进度反馈
- 结果(Result):任务完成后,服务器返回的结果
动作的通信模型基于客户端-服务器模式:
客户端:
- 发送任务目标(Goal)到服务器
- 接收任务的反馈(Feedback)和结果(Result)
服务端:
- 接收客户端发送的任务目标
- 执行任务,并发送反馈和结果
动作文件(.action)
- Goal:定义客户端发送的任务目标
- Result:定义任务完成后返回的结果
- Feedback:定义任务执行过程中的反馈
生命周期节点:
生命周期(Lifecycle) 是一种用于管理节点状态的机制
生命周期节点(Lifecycle Node)允许开发者以可控的方式启动、配置、激活和关闭节点,从而提高系统的可靠性和可维护性
- 生命周期节点是一种特殊类型的节点,具有明确的状态转换机制
- 每个生命周期节点可以处于不同的状态(如未配置、非活动、活动等),并且只能在特定状态下执行某些操作
作用:
- 提供对节点状态的精细控制,确保节点在正确的状态下执行操作
- 提高系统的可靠性和可维护性,减少因节点状态不一致导致的错误
生命周期节点状态:
- 未配置 Unconfigured
- 节点的初始状态
- 在此状态下,节点尚未配置,无法执行任何操作
- 非活动Inactive
- 节点已配置,但未激活
- 在此状态下,节点可以接收配置参数,但不会执行主要功能
- 活动active
- 节点已激活,正在执行其主要功能
- 在此状态下,节点可以接收和处理数据
- 最终化Finalized
- 节点已关闭,无法再执行任何操作
- 在此状态下,节点可以释放资源并退出
状态转换:
生命周期节点的状态转换通过过度Transition
实现的
- 配置(Configure):
- 从未配置状态转换到非活动状态
- 在此过渡中,节点可以加载配置参数并初始化资源
- 激活(Activate):
- 从非活动状态转换到活动状态
- 在此过渡中,节点可以启动其主要功能
- 停用(Deactivate):
- 从活动状态转换到非活动状态
- 在此过渡中,节点可以停止其主要功能
- 清理(Cleanup):
- 从非活动状态转换到未配置状态
- 在此过渡中,节点可以释放资源并重置配置
- 关闭(Shutdown):
- 从任何状态转换到最终化状态
- 在此过渡中,节点可以释放所有资源并退出
launch文件:
launch文件允许同时启动和配置多个包含 ROS 2 节点的可执行文件
-
XML文件
<launch><node pkg="my_package" exec="my_node" name="my_node" output="screen"><param name="my_param" value="42"/></node> </launch>
<launch>
:根元素,表示启动文件的开始<node>
:定义一个节点pkg
:节点所属的包exec
:节点的可执行文件name
:节点的名称output
:指定节点的输出(如screen
表示输出到控制台)
<param>
:设置节点的参数
-
python文件
from launch import LaunchDescription from launch_ros.actions import Nodedef generate_launch_description():return LaunchDescription([Node(package='my_package',executable='my_node',name='my_node',output='screen',parameters=[{'my_param': 42}])])
LaunchDescription
:表示启动文件的配置Node
:定义一个节点package
:节点所属的包executable
:节点的可执行文件name
:节点的名称output
:指定节点的输出parameters
:设置节点的参数
Rviz2:
Rviz2是 ROS2 中的一款强大的可视化工具,用于显示和调试机器人系统的各种数据
- RVIZ2 是 ROS2 中的 3D 可视化工具,用于显示机器人系统的各种数据
- 支持多种数据类型,如点云、激光雷达数据、机器人模型、地图、路径规划结果等
作用:
- 直观地查看和调试机器人系统的运行状态
- 提供丰富的可视化功能,支持自定义显示和交互
主要功能:
- 显示传感器数据:
- 支持显示激光雷达、摄像头、IMU 等传感器的数据
- 显示机器人模型:
- 支持加载和显示 URDF 格式的机器人模型
- 显示地图:
- 支持显示 2D 或 3D 地图
- 显示路径规划结果:
- 支持显示路径规划算法生成的路径
- 交互功能:
- 支持通过鼠标和键盘与可视化界面交互
- 插件系统:
- 支持通过插件扩展功能
Gazebo:
Gazebo 提供了一个逼真的 3D 仿真环境,支持物理引擎、传感器模拟和多机器人协作
可以模拟复杂的物理现象(如重力、摩擦力、碰撞等),并支持多种传感器(如激光雷达、摄像头、IMU 等)的仿真
- 物理仿真:
- 支持多种物理引擎(如 ODE、Bullet、SimBody 等),可以模拟重力、摩擦力、碰撞等物理现象
- 传感器仿真:
- 支持多种传感器的仿真,包括激光雷达、摄像头、IMU、GPS 等
- 机器人模型:
- 支持加载和仿真 URDF(Unified Robot Description Format)或 SDF(Simulation Description Format)格式的机器人模型
- 环境建模:
- 支持创建复杂的仿真环境,包括建筑物、地形、障碍物等
- 多机器人仿真:
- 支持同时仿真多个机器人,并模拟它们之间的交互
- ROS/ROS2 集成:
- Gazebo 与 ROS/ROS2 紧密集成,可以通过 ROS/ROS2 控制仿真中的机器人,并获取传感器数据
- 为了将 Gazebo 与 ROS2 集成,ROS2 提供了一组名为 gazebo_ros_pkgs 的包
- 这些包充当 Gazebo 和 ROS2 之间的桥梁,允许 ROS2 节点与 Gazebo 仿真环境进行交互