ROS2 基础
ROS2 工作区构建与依赖管理命令rosdep install --from-paths src --ignore-src -r -yrosdep 的全称是ROS DependencyROS 依赖管理器。这条命令在 ROS / ROS 2 开发中极其常用它的总体作用是一键扫描工作区源码目录把项目所需的系统级/外部依赖库如 C 库、Python 包等自动下载并安装好。参数完整参数形式作用与解释rosdep-ROS 依赖管理工具。它通过读取每个包里的package.xml来识别依赖。install-告诉rosdep执行安装动作。--from-paths--from-paths path指定扫描路径告诉工具去src文件夹下寻找所有的package.xml文件并解析里面的depend标签。--ignore-src--ignore-src忽略源码包如果某个依赖包已经存在于你的src文件夹中即你正在亲自编译它就不要再尝试通过系统包管理器如apt去重复安装它。-r--continue-on-error忽略错误继续执行Continue on error如果在安装过程中某个依赖包下载失败不要立刻打断中断而是记录错误并继续安装后续的其他依赖。-y--default-yes自动回答 Yes在系统调用apt install或pip需要用户敲Y/n确认时自动输入y实现无无人值守全自动安装。colcon build --symlink-installcolcon 的全称是Collective Construction集合构建工具。它是ROS 2 官方指定的构建工具取代了 ROS 1 时代使用的catkin_make或catkin_tools。参数完整参数形式作用与解释colcon-ROS 2 的跨平台多包构建命令行工具。build-告诉colcon执行编译与构建动作。它会自动递归扫描当前工作区src目录下的所有 ROS 2 功能包C 或 Python。--symlink-install-开启符号链接软链接安装将源码中的非编译型资源如 Python 脚本、Launch 文件、URDF/Xacro 模型、配置文件等通过软链接直接指向install/目录而不是复制物理文件。--packages-select--packages-select包名只编译指定的某一个包大型项目中有几十个包时避免全量重新编译节省大量时间。Python 脚本 / Launch 文件 / URDF 模型修改源码后无需重新编译再次运行节点或 Launch 时直接生效极大提升开发与调试效率。C 代码修改.cpp或.hpp后依然需要重新运行colcon build重新编译二进制文件。ROS2 通信特性话题Topic服务Service动作Action通信模式异步发布 / 订阅 (Pub/Sub)同步 / 异步 服务请求 (Req/Res)异步长任务带反馈 (Goal/Feedback/Result)交互方向单向 (Publisher - Subscriber)双向 (Client - Server)双向且包含持续反馈底层组成1 个数据流Message2 个数据流Request Response3 个话题Goal Feedback Result数据频率高频、连续如 10~100Hz低频、按需长时间运行秒~分钟级支持打断否只能停止订阅否发包后等待响应阻塞/非阻塞是Client 可中途 Cancel 任务典型应用传感器数据流、电机编码器反馈查询状态、开关传感器、参数重载导航到目标点、机械臂轨迹规划轨迹在 ROS 2 的底层实现中Action 并不是一种单独的新物理协议它在底层其实是由3 个 Service和2 个 Topic组合封装而成的复合架构┌─── Goal Service (请求/响应是否接收任务) ├─── Cancel Service (请求/响应取消任务) Action 架构 ──┼─── Result Service (请求/响应获取最终结果) ├─── Feedback Topic (单向广播实时进度推送) └─── Status Topic (单向广播状态机状态更新)ROS 2 Gazebo 联合仿真如 Gazebo Harmonic / Fortress 或 Classic Gazebo中关节数据的传递路径 【 数据源头 (Data Source) 】 [情况 A纯离线预览 / 手动测试] [情况 BGazebo 物理仿真环境] ┌─────────────────────────────────┐ ┌─────────────────────────────────┐ │ joint_state_publisher / GUI │ │ Gazebo 物理引擎 (C / Physics) │ │ (手动拉动滑块 / 发布默认零值) │ │ (解算关节动力学、碰撞与电机反馈) │ └────────────────┬────────────────┘ └────────────────┬────────────────┘ │ │ Gazebo Transport 原生数据 │ ▼ │ ┌─────────────────────────────────┐ │ │ ros_gz_bridge / ros_gz 插件 │ │ │ (将 Gz 消息桥接转译为 ROS 2) │ │ └────────────────┬────────────────┘ │ │ └────────────────────────┬────────────────────────┘ │ │ 统一发布 ROS 2 标准话题: │ /joint_states │ (消息类型: sensor_msgs/msg/JointState) ▼ 【 运动学解算与 TF 变换广播 】 ┌──────────────────────┐ │ URDF / XACRO 描述文件 │ └──────────┬───────────┘ │ 读取机器人几何拓扑结构 ▼ ┌──────────────────────────────────────┐ │ robot_state_publisher │ │ (根据 URDF 轴线与 /joint_states 角度 │ │ 利用正运动学计算全局 3D 空间变换) │ └──────────────────┬───────────────────┘ │ ├────────────────────────┐ │ 广播动态变换 │ 广播静态变换 │ /tf │ /tf_static ▼ ▼ 【 终端应用与可视化 】 ┌──────────────────────────────────────────────┐ │ RViz2 / Nav2 导航 / MoveIt2 轨迹规划 / 节点 │ │ (根据 TF 树实时渲染 3D 模型与传感器空间位置) │ └──────────────────────────────────────────────┘ROS 2 joint_state_publisher_gui 仿真关节数据的传递路径 【 1. 模型结构读取 (Model Initialization) 】 Launch 脚本 (xacro 解析) │ ▼ 传入参数 parameters[{robot_description: robot_desc}] ┌───────────────────────────────────────────────┐ │ robot_state_publisher │ │ (持有 robot_description 参数: 包含 URDF 文本) │ └──────────────────────┬────────────────────────┘ │ │ 1. Parameter Client 请求/获取 robot_description 参数 ▼ ┌───────────────────────────────────────────────┐ │ joint_state_publisher_gui │ │ (解析 URDF 中的可动关节在 GUI 上动态生成滑块) │ └───────────────────────────────────────────────┘ 【 2. 运行时数据交互 (Runtime Execution) 】 ┌───────────────────────────────────────────────┐ │ joint_state_publisher_gui │ │ (用户拖动滑块生成各关节实时角度) │ └──────────────────────┬────────────────────────┘ │ │ 2. 发布话题: /joint_states │ 消息类型: sensor_msgs/msg/JointState (包含 joint_name 和 position) ▼ ┌───────────────────────────────────────────────┐ │ robot_state_publisher │ │ (结合 URDF 几何轴线 axis 与角度做正运动学解算)│ └──────────────────────┬────────────────────────┘ │ │ 3. 广播变换: /tf 与 /tf_static │ 消息类型: tf2_msgs/msg/TFMessage (包含各 Link 的 3D 空间坐标矩阵) ▼ ┌───────────────────────────────────────────────┐ │ rviz2 │ │ (监听 /tf 坐标树将 3D 网格模型按变换矩阵实时渲染) │ └───────────────────────────────────────────────┘joint_state_publisher_gui启动时的底层逻辑如下发起请求它在启动时利用 ROS 2 的 Parameter Client 机制向名为/robot_state_publisher的节点发送一个服务请求Service Request要求获取该节点的robot_description参数值。节点响应robot_state_publisher将 Launch 文件传给它的 URDF XML 文本内容回传给joint_state_publisher_gui。解析 URDFjoint_state_publisher_gui拿到这段 XML 文本后解析出里面所有的可动关节joint typerevolute/joint typeprismatic并在图形界面上动态生成对应的滑块Sliders。gz_ros2_control::GazeboSimROS2ControlPlugin┌─────────────────────────── 进程gz sim ───────────────────────────┐ │ │ │ 物理引擎关节实体 Prismatic_joint │ │ ▲ 写位置/力命令 │ 读位置、速度状态 │ │ │ ▼ │ │ GazeboSimSystem硬件接口plugin 提供 │ │ ▲ command_interfaces │ state_interfaces │ │ │ ▼ │ │ controller_manager ←── 读 ros2_controllers.yaml │ │ │ │ │ ├── joint_state_broadcaster → 发 /joint_statesROS 话题 │ │ └── ros2_controllers.yaml 定义的 gantry_arm_controller │ │ ▲ │ │ │ FollowJointTrajectory actionROS │ └──────────────┼──────────────────────────────────────────────────────┘ │ │ 同机 ROS graphDDS ▼ move_group / RViz另一个 ROS 进程GazeboSimROS2ControlPlugin库gz_ros2_control-system在gz sim进程里创建并驱动 CMCM 再加载/激活gantry_arm_controller、joint_state_broadcaster等插件通过硬件接口控制 Gazebo 关节插件可以在 CM 提供的 Node 上下文里创建话题、服务、action。身份CM及相关控制器接口是 ROS 2 节点/节点组件只是宿主进程是 Gazebo不是单独的ros2_control_node。和 RVizRViz2、move_group、RSP、CM 都在同一张 ROS 2 图里用话题/服务/action如/joint_states、TF、FollowJointTrajectory通信。ros2_control_node 一种“专门用来托管 CM 的程序/进程”CM 真正的管理器ROS 节点可依托上述进程也可创建在 gz sim控制器 CM 加载的插件通常同进程由 CM activate 后参与控制硬件接口 GazeboSimSystem仿真里或 mock纯 demo编写 ROS2 Python Launch 文件.launch.py时最核心、最常用的标准组件:这些库是编写 ROS2 Python Launch 文件.launch.py时最核心、最常用的标准组件。它们各自负责处理路径、参数、节点启动等不同的任务。以下是它们的具体用途import os用处Python 的内置标准库用于处理操作系统相关的路径和文件操作。在 Launch 中的场景在 ROS2 中极少硬编码绝对路径如/home/user/...而是使用os.path.join()来拼接文件路径。这保证了代码在不同操作系统和不同工作空间下都能正常运行。from ament_index_python.packages import get_package_share_directory用处ROS2 提供的路径定位工具。在 Launch 中的场景用于动态获取某个功能包package在安装目录install下的共享资源路径share目录。通常与os.path.join配合使用用来自动寻找配置文件.yaml、URDF 模型或 RViz 配置文件从而实现跨环境部署。from launch import LaunchDescription用处ROS2 Launch 系统的核心容器类。在 Launch 中的场景所有的启动动作如启动节点、声明参数、包含其他 Launch 文件等都必须被放入LaunchDescription中并在generate_launch_description()函数的最后返回给 ROS2 系统执行。from launch.actions import DeclareLaunchArgument用处用于声明 Launch 文件的启动参数。在 Launch 中的场景让 Launch 文件支持外部传参。例如可以定义一个use_sim_time参数并设置默认值。这样用户在启动时就可以通过ros2 launch xxx.launch.py use_sim_time:true来动态修改配置而无需修改代码。from launch.substitutions import LaunchConfiguration用处用于获取DeclareLaunchArgument声明的参数值。在 Launch 中的场景它通常与DeclareLaunchArgument配合使用。声明参数后使用LaunchConfiguration(参数名)获取该值并将其传递给具体的节点例如放入节点的parameters列表中。from launch.substitutions import Command用处用于在 Launch 文件中执行外部的 Shell 命令。在 Launch 中的场景最常见的用途是调用xacro命令来解析机器人的 URDF/Xacro 模型文件。例如Command([xacro , urdf_file_path])解析后的结果会直接作为参数传递给robot_state_publisher节点。from launch_ros.actions import Node用处用于定义和启动一个 ROS2 节点。在 Launch 中的场景这是 Launch 文件中最重要的动作之一。通过它可以指定要启动的节点所属的包package、可执行文件名executable、节点别名name以及传入参数parameters、话题重映射remappings等配置。from launch_ros.parameter_descriptions import ParameterValue用处用于对传递给节点的参数值进行类型强制转换或特殊处理。在 Launch 中的场景当从命令行传入参数通常是字符串类型时如果节点底层期望的是整数、浮点数或布尔值可以使用ParameterValue来显式指定类型如ParameterValue(value, value_typeint)防止因类型不匹配导致节点启动报错。import launch用处导入整个 ROS2 Launch 基础模块。在 Launch 中的场景作为一个全局引用当不想在文件头部导入太多具体的子模块时可以直接使用launch.LaunchDescription()或launch.actions.ExecuteProcess()等方式来调用 Launch 系统的各类基础功能。