ROS2 Jazzy + C++ 实战路线——ros2_control

继"ROS2 Jazzy + C++ 实战路线------进阶学习3"继续学习

核心架构:

复制代码
                ROS2
                  │
            controller_manager
                  │
        ┌─────────┴─────────┐
        ↓                   ↓
joint_state_broadcaster   trajectory_controller
        │                   │
        └─────────┬─────────┘
                  ↓
             Hardware
                  ↓
              EtherCAT
                  ↓
             Motor Driver
                  ↓
                Motor

ros2_control 是你从"会 ROS2"走向"机器人控制系统工程"的关键一步。

ros2_control = ROS2 和机器人底层硬件之间的一套标准控制框架。

你可以把它理解成一个"翻译层"。

上层说:

复制代码
左膝关节 → 转到某个位置

底层电机驱动器理解的是:

复制代码
CAN / EtherCAT / UDP / 串口

ros2_control 就负责把两边连接起来。

复制代码
                    ROS2
                     │
                     ↓
             controller_manager
                     │
          ┌──────────┴──────────┐
          ↓                     ↓
      Controller            Controller
          │                     │
          └──────────┬──────────┘
                     ↓
              Hardware Interface
                     ↓
              真实机器人硬件
                     ↓
              EtherCAT / CAN
                     ↓
                电机驱动器
                     ↓
                   电机

1. Controller

Controller 就是:

控制器。

例如你想控制机器人关节位置:

复制代码
目标位置
   ↓
Position Controller
   ↓
关节

或者:

复制代码
目标轨迹
   ↓
Trajectory Controller
   ↓
多个关节

所以 Controller 是:

决定"机器人应该怎么运动"的软件模块。


2. Hardware Interface

Hardware Interface 可以理解成:

ROS2 和真实机器人硬件之间的接口。

例如:

复制代码
ROS2
 ↓
Hardware Interface
 ↓
EtherCAT
 ↓
电机驱动器

它负责两件事情:

写给硬件

复制代码
command

例如:

复制代码
目标位置
目标速度
目标力矩

从硬件读回来

复制代码
state

例如:

复制代码
实际位置
实际速度
实际力矩

所以你可以简单记:

复制代码
Command
   ↓
ROS2 → 电机

State
   ↑
电机 → ROS2

3. Command Interface 和 State Interface

这是 ros2_control 最重要的概念之一。

State Interface

机器人现在是什么状态?

例如:

复制代码
position
velocity
effort

也就是:

复制代码
电机现在在哪里?
电机现在多快?
电机现在输出多大力?

Command Interface

我要机器人变成什么状态?

例如:

复制代码
position command
velocity command
effort command

所以直接记:

复制代码
State Interface
      ↑
      │
   机器人实际状态

Command Interface
      ↓
      │
   给机器人目标

4. controller_manager

名字其实已经告诉你了:

管理 Controller。

比如系统里有:

复制代码
joint_state_broadcaster
joint_trajectory_controller

controller_manager 负责:

复制代码
加载
启动
停止
切换
管理

所以:

复制代码
controller_manager
      │
      ├── controller A
      ├── controller B
      └── controller C

你可以把它理解成:

控制器的总管。


5. joint_state_broadcaster

这个名字第一次看很长。

拆开:

复制代码
joint_state

= 关节状态

复制代码
broadcaster

= 广播出去

所以:

joint_state_broadcaster 主要负责把硬件读取到的关节状态发布到 ROS2。

例如:

复制代码
编码器
 ↓
Hardware Interface
 ↓
joint_state_broadcaster
 ↓
/joint_states

其他 ROS2 节点就可以订阅。


6. joint_trajectory_controller

这个你以后做机器人动作控制会经常遇到。

它主要处理:

一组关节按照给定轨迹运动。

例如:

复制代码
时间      膝关节
0s        0°
1s        20°
2s        40°
3s        30°

这不是简单的:

复制代码
"去 40°"

而是:

复制代码
按照轨迹运动

因此:

复制代码
Trajectory
    ↓
joint_trajectory_controller
    ↓
多个 Joint

这时候你就已经开始接近:

完整机器人运动控制系统 了。


7. ros2_control 和 URDF 还有一个关键关系

刚才我们学了:

复制代码
URDF / Xacro

它描述:

复制代码
机器人有什么关节
关节叫什么
关节怎么连接

而 ros2_control 需要知道:

复制代码
这个关节有什么控制接口
这个关节有什么状态接口
硬件怎么连接

所以最终经常看到:

复制代码
URDF / Xacro
       ↓
ros2_control 配置
       ↓
Hardware Interface
       ↓
Controller

                    ROS2
                     │
        ┌────────────┼────────────┐
        ↓            ↓            ↓
      Topic       Service       Action
        │
        ↓
      Node
        │
        ↓
     数据通信


机器人模型:
      
      URDF / Xacro
           ↓
          TF2
           ↓
         RViz2


机器人控制:

      Controller
           ↓
    controller_manager
           ↓
    ros2_control
           ↓
   Hardware Interface
           ↓
     EtherCAT / CAN
           ↓
         Motor

8. QoS

全称:

Quality of Service

中文可以理解为:

通信质量策略。


QoS 最重要的几个概念:

复制代码
Reliability
Durability
History
Depth

不要一上来背全部 QoS 参数。


1. Reliability:可靠性

最容易理解。

有两个主要选择:

复制代码
Reliable
Best Effort

Reliable

意思:

尽量保证消息送到。

类似:

复制代码
"这条消息一定尽量给你送过去。"

如果网络出现问题,会尝试处理。

适合:

复制代码
重要控制信息
关键状态信息

Best Effort

意思:

能送就送,丢了就算了。

例如:

复制代码
摄像头
 ↓
30 FPS
 ↓
丢一帧
 ↓
下一帧马上来了

通常没必要为了这一帧影响整个系统。

所以传感器数据经常会看到:

复制代码
Best Effort

2. History

就是:

消息保留多少历史。

例如:

复制代码
History = Keep Last
Depth = 10

可以理解成:

复制代码
只保留最近 10 条消息

如果:

复制代码
1
2
3
4
...
10
11

来了以后:

复制代码
1

就可能被挤掉。


3. Depth

Depth 就是:

队列深度 。

例如:

复制代码
Depth = 10

就是:

复制代码
┌────┬────┬────┬────┬────┐
│  6 │  7 │  8 │  9 │ 10 │
└────┴────┴────┴────┴────┘
              ↓
           最新数据

9. QoS 最重要的一个坑

这也是你以后实际调 ROS2 最容易遇到的问题之一:

Publisher 和 Subscriber 的 QoS 不匹配,可能导致收不到数据。

例如:

复制代码
Publisher
Reliable

但是:

复制代码
Subscriber
Best Effort

两边 QoS 如果不兼容:

复制代码
Publisher
    X
Subscriber

你可能看到:

复制代码
Topic 明明存在
ros2 topic list 能看到
但是就是收不到数据

这时候不要马上怀疑:

复制代码
代码写错了
Topic 名字错了

先检查:

复制代码
ros2 topic info /xxx

以及:

复制代码
ros2 topic info /xxx --verbose

                    ROS2
                      │
        ┌─────────────┴─────────────┐
        ↓                           ↓
      Node                        Node
        │                           │
        └─────── Topic ─────────────┘
                     │
                    QoS
                     │
       ┌─────────────┼─────────────┐
       ↓             ↓             ↓
   Reliability    History        Depth
       │
       ↓
 Reliable / Best Effort

这就完整了。

概念 大白话
Reliability 丢了要不要尽量保证送到
History 保存消息的策略
Depth 队列存多少条
QoS 整体通信策略

最重要的是:

Publisher 和 Subscriber 的 QoS 要能够匹配。

复制代码
                    ROS2
                      │
               ┌──────┴──────┐
               │             │
             Node          Node
               │             │
               └─── Topic ───┘
                     │
                    QoS
                     │
        ┌────────────┼────────────┐
        ↓            ↓            ↓
   Reliability    History       Depth
        │
   ┌────┴────┐
   ↓         ↓
Reliable  Best Effort
相关推荐
code2cat1 小时前
【随笔】MCP输入Schema:把参数错误拦在工具执行之前
python·json schema·ai agent·mcp
Peregrine91 小时前
C++ - > 类和对象
java·c++·算法
Pin_Qing1 小时前
速度正式单独收费:OpenAI GPT-6.1 Sol Ultrafast上线,8倍速、6倍价,开发者该怎么选?
人工智能
m0_715674431 小时前
数据分类分级的范式转换:从规则匹配到场景化高准确率一键部署
大数据·网络·人工智能·网络安全
计算机编程指导师1 小时前
Python大数据毕设怎么写?Django结合Hadoop+Spark京东销售分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·spark·毕业设计·课程设计·京东商品
源梦倩影1 小时前
我把 YuanPlan 开源了:让任务、项目文档和 AI 协作在同一个地方发生
人工智能
合尘猫1 小时前
AI 项目上线就停:一次事件循环阻塞的完整排查过程
人工智能·后端·python
yichengerp1 小时前
电子行业常用erp系统有哪些?推荐适合中小电子厂的易呈erp软件,操作简单,易落地
大数据·运维·人工智能·云计算·制造
染指11101 小时前
142.Agent-多Agent框架-通过Skills实现多Agent
开发语言·人工智能·python·langchain·agents
薛定谔的猫-菜鸟程序员1 小时前
上传试卷、打Boss,玩游戏:我用 TextIn xParse 做了一套“会解析试卷的刷题游戏“
人工智能·游戏·大模型·textin·ai数据层基础设施