当我们拿到一个陌生 ROS2 仓库,不知道怎么学习,逐文件、逐行看代码???下面我将学习思路总结成立一个傻瓜式的skill,以后给你一个陌生 ROS2 仓库,可以优先按照这套方法分析,而不是直接逐文件、逐行看代码:https://github.com/Kairui-Song/ros2-project-analysis.git


一、拿到一个陌生 ROS2 工程,第一反应不要看源码

先问自己:

这个工程是干什么的?数据从哪里来,经过什么模块,最后控制谁?

先画出:

输入
 ↓
数据处理
 ↓
算法
 ↓
控制
 ↓
硬件/仿真
 ↓
输出

对于你的机器人项目,经常是:

动捕
 ↓
数据解析
 ↓
GMR / IK
 ↓
Joint Command
 ↓
Controller
 ↓
ros2_control
 ↓
Hardware Interface
 ↓
EtherCAT
 ↓
机器人

如果是视觉机器人:

Camera
 ↓
Image
 ↓
OpenCV / AI
 ↓
目标结果
 ↓
规划/控制
 ↓
Robot

先看数据流,再看代码。


二、第一步:找工程入口

拿到仓库以后先看目录:

src/
launch/
config/
urdf/
meshes/
include/

然后重点找:

launch/
bringup/
README
package.xml
CMakeLists.txt

你首先要回答:

这个系统从哪里启动?

通常:

ros2 launch xxx xxx.launch.py

所以:

launch
 ↓
系统入口

三、第二步:看 Package

找到:

package.xml
CMakeLists.txt

先不要逐行看。

只需要搞清楚:

package.xml

回答:

这个包依赖谁?

例如:

rclcpp
sensor_msgs
geometry_msgs
ros2_control
tf2

CMakeLists.txt

回答:

这个包编译什么?

比如:

src/
 ↓
.cpp
 ↓
编译
 ↓
可执行文件 / library

所以记住:

package.xml
= 我需要什么

CMakeLists.txt
= 我要编译什么

四、第三步:找 Node

接下来找:

rclcpp::Node

或者直接看:

src/

建立:

Node A
Node B
Node C

然后问:

每个 Node 是干什么的?

不要马上看每一行代码。

先给它贴标签:

mocap_node
= 动捕输入

gmr_node
= GMR

controller_node
= 控制

hardware_node
= 硬件

五、第四步:找 Topic

这是看 ROS2 工程非常重要的一步。

问:

Node 和 Node 之间怎么传数据?

例如:

mocap_node
      ↓
 /mocap_frame
      ↓
gmr_node
      ↓
 /joint_target
      ↓
controller

你要养成习惯:

ros2 topic list
ros2 topic list -t

然后:

ros2 topic info /xxx
ros2 topic echo /xxx
ros2 topic hz /xxx

这样你就能知道:

谁发布?
谁订阅?
数据是什么?
频率多少?

六、第五步:找 Interface

看到:

.msg
.srv
.action

不要害怕。

直接判断:

msg
 ↓
Topic数据

srv
 ↓
请求/响应

action
 ↓
长时间任务

然后找到:

xxx_msgs

重点看:

系统里面传的到底是什么数据。

例如你的项目:

MocapFrame

你就应该马上问:

里面有什么?

关节?
位置?
姿态?
时间戳?
frame_id?

这一步非常重要。


七、第六步:画出 ROS2 Graph

然后看:

rqt_graph

你脑子里应该形成:

Node
 ↓
Topic
 ↓
Node
 ↓
Topic
 ↓
Node

例如:

Mocap
  ↓
/mocap_frame
  ↓
GMR
  ↓
/joint_target
  ↓
Controller

如果你连这张图都没搞清楚,不要急着读源码。


八、第七步:找 Launch

然后回头看:

launch/*.launch.py

你要搞清楚:

系统启动的时候到底启动了哪些东西?

例如:

launch
 ├── mocap_node
 ├── gmr_node
 ├── robot_state_publisher
 ├── controller_manager
 └── hardware

于是你就知道:

这个系统的“组成部分”是什么。


九、第八步:找 YAML / Parameter

再看:

config/
*.yaml

问:

哪些东西是写死在代码里的,哪些东西可以配置?

例如:

gmr:
  input_port: 7014
  frequency: 50

controller:
  kp: ...
  kd: ...

所以:

代码
 ↓
功能

YAML
 ↓
参数

这也是为什么你以前的:

Xsens UDP
7014
7015
50 Hz

这种东西最好不要全部硬编码。


十、第九步:找 URDF / Xacro

如果是机器人项目:

urdf/
xacro/
robot_description/

马上看。

你要知道:

机器人有哪些 Link?
有哪些 Joint?
关节怎么连接?

形成:

base_link
 ↓
pelvis
 ↓
torso
 ├── left_arm
 ├── right_arm
 ├── left_leg
 └── right_leg

十一、第十步:看 TF

然后问:

机器人各坐标系怎么连接?

重点:

/tf
/tf_static

以及:

ros2 run tf2_tools view_frames

如果视觉、动捕、IK项目涉及坐标转换,更要关注:

camera
 ↓
head
 ↓
torso
 ↓
base_link

或者:

mocap_frame
 ↓
robot_base

因为很多机器人问题最后并不是算法错,而是:

坐标系错了。


十二、第十一步:找 Controller

如果是运控工程,开始重点看:

controller/
controllers/
config/controllers.yaml

问:

谁真正产生关节命令?

例如:

GMR
 ↓
Joint Target
 ↓
Joint Trajectory Controller

不要把:

GMR
Controller
Hardware

混成一个东西。


十三、第十二步:看 ros2_control

搜索:

ros2_control
controller_manager
hardware_interface

然后画:

Controller
 ↓
ros2_control
 ↓
Hardware Interface

重点找:

command interface
state interface

例如:

position command
position state
velocity state

十四、第十三步:找到 Hardware Interface

这是做机器人运控时非常重要的一步。

搜索:

hardware_interface
read()
write()

你要问:

ROS2 最终怎么碰到真实机器人?

例如:

Controller
 ↓
Command
 ↓
Hardware Interface
 ↓
write()
 ↓
EtherCAT
 ↓
电机

反馈:

编码器
 ↓
EtherCAT
 ↓
read()
 ↓
State
 ↓
ROS2

十五、第十四步:再去看 EtherCAT / CAN

到了这里才进入底层。

你已经有 EtherCAT 基础,所以重点不是重新学习 EtherCAT,而是找:

ROS2 Hardware Interface
        ↓
哪里调用 EtherCAT?
        ↓
哪里读 PDO?
        ↓
哪里写 PDO?
        ↓
电机状态在哪里转换?

也就是说:

找到 ROS2 和你熟悉的底层通信之间的那条边界。


十六、第十五步:仿真和真机分开看

机器人项目经常有:

simulation
real_robot

你要主动问:

哪些代码是共用的?哪些代码只属于仿真?哪些只属于真机?

例如:

                 Controller
                     ↓
                ros2_control
                     ↓
              ┌──────┴──────┐
              ↓             ↓
          MuJoCo          EtherCAT

如果发现:

GMR
Controller

在真机和仿真都共用,

说明架构设计得比较清晰。


十七、真正开始读源码时,按照这个顺序

这是最重要的。

不要:

main.cpp
 ↓
第一行
 ↓
第二行
 ↓
第三行

而应该:

① README
 ↓
② 目录结构
 ↓
③ launch
 ↓
④ package.xml
 ↓
⑤ CMakeLists.txt
 ↓
⑥ Node
 ↓
⑦ Topic / Interface
 ↓
⑧ YAML
 ↓
⑨ URDF / TF
 ↓
⑩ Controller
 ↓
⑪ ros2_control
 ↓
⑫ Hardware Interface
 ↓
⑬ 底层 EtherCAT/CAN

最后才:

具体源码

十八、遇到问题时也按照“链路”排查

比如:

机器人不动了。

不要:

“是不是 GMR 坏了?”

而是:

① Node存在吗?
 ↓
② Controller存在吗?
 ↓
③ Topic存在吗?
 ↓
④ 有没有数据?
 ↓
⑤ 数据频率正常吗?
 ↓
⑥ Command有没有产生?
 ↓
⑦ Controller有没有激活?
 ↓
⑧ Interface匹配吗?
 ↓
⑨ Hardware Interface active吗?
 ↓
⑩ write()执行了吗?
 ↓
⑪ EtherCAT有没有数据?
 ↓
⑫ 驱动器收到没有?
 ↓
⑬ 电机有没有动作?

十九、这其实就是我们之前学 ROS2 的核心思想

你以前遇到:

7014
 ↓
Xsens
 ↓
GMR
 ↓
ZMQ
 ↓
MuJoCo

你已经做过一次类似的事情:

沿数据链定位问题。

现在 ROS2 只是把这套思维扩展成:

Node
 ↓
Topic
 ↓
Algorithm
 ↓
Controller
 ↓
ros2_control
 ↓
Hardware Interface
 ↓
EtherCAT
 ↓
Robot

所以你以后真正工作的能力不是:

“我背了多少 ROS2 命令。”

而是:

我能不能快速把一个陌生机器人系统的结构、数据流、控制流和硬件链路画出来。


二十、最后给你一张“陌生 ROS2 工程检查表”

以后拿到项目,直接照这个顺序:

【A. 项目是什么】
□ README
□ 项目目标
□ 真机还是仿真
□ 输入和输出

【B. 怎么启动】
□ launch
□ bringup
□ 参数

【C. 有哪些模块】
□ package
□ node
□ executable

【D. 数据怎么流】
□ topic
□ msg
□ service
□ action
□ rqt_graph

【E. 数据是什么】
□ interface
□ msg定义
□ timestamp
□ frame_id
□ 数据频率

【F. 机器人是什么样】
□ URDF
□ Xacro
□ Link
□ Joint
□ TF

【G. 怎么控制】
□ Controller
□ Controller Manager
□ Command Interface
□ State Interface

【H. 怎么碰硬件】
□ ros2_control
□ Hardware Interface
□ read()
□ write()

【I. 底层是什么】
□ EtherCAT
□ CAN
□ SDK
□ PDO
□ 编码器

【J. 真机/仿真】
□ MuJoCo
□ Gazebo
□ Simulation Hardware
□ Real Hardware

【K. 出问题怎么查】
□ Node
□ Topic
□ Data
□ Frequency
□ QoS
□ Controller
□ Interface
□ Hardware
□ Communication
□ Motor

最后压缩成一句话

以后你拿到任何一个 ROS2 机器人工程,脑子里先出现:

                  【系统目标】
                       ↓
                  【启动入口】
                       ↓
                  【有哪些Node】
                       ↓
                【数据怎么流】
                       ↓
                【数据是什么】
                       ↓
              【算法在哪里】
                       ↓
              【Controller在哪】
                       ↓
             【ros2_control在哪】
                       ↓
          【Hardware Interface在哪】
                       ↓
             【EtherCAT/CAN在哪】
                       ↓
              【最后控制谁】

然后再去读代码。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐