ROS2 工程阅读/排查skill
当我们拿到一个陌生 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在哪】
↓
【最后控制谁】
然后再去读代码。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)