工程架构:

上层程序
   ↓
JointTrajectory
   ↓
ROS2 control Node
   ↓
关节映射
   ↓
rad → encoder count
   ↓
EtherCAT command
   ↓
CiA402 Drive
   ↓
Motor

反馈方向:

Motor
 ↓
Encoder
 ↓
EtherCAT
 ↓
encoder count
 ↓
count → rad
 ↓
ROS2
 ↓
JointState / Controller

1. 参数化 launch

为什么叫“参数化”?

例如:

robot.launch.py

可以接受:

robot_ip
can_interface
ethercat_device
use_sim
joint_config

于是:

开发环境
 ↓
use_sim=true

真实机器人:

use_sim=false

同一套启动逻辑可以适配不同环境。

这就是工程上的:

配置与代码分离。


2. 为什么需要“关节映射”?

这是你简历中很重要但容易被忽略的一点:

实现关节映射。

假设 ROS2:

left_elbow
right_elbow
left_knee

而底层驱动器编号:

Motor 1
Motor 2
Motor 3

系统需要建立:

ROS Joint Name
       ↓
Motor ID

例如:

left_elbow → Motor 3
right_elbow → Motor 7
left_knee → Motor 10

所以:

上层关节名称
       ↓
Joint Mapping
       ↓
底层电机编号

这就是软件抽象层之间的适配。


3. 弧度为什么还要转换?

ROS2 机器人软件通常使用:

rad

例如:

1.57 rad

但是电机编码器可能使用:

encoder count

比如:

100000 count

所以必须:

ROS2
  ↓
rad
  ↓
转换
  ↓
encoder count
  ↓
EtherCAT
  ↓
Drive

反馈反过来:

encoder count
  ↓
转换
  ↓
rad
  ↓
ROS2

4. ROS2 和 EtherCAT 为什么要解耦?

一个非常好的工程架构应该是:

ROS2
 ↓
Hardware Interface
 ↓
EtherCAT Driver

而不是:

ROS2 Node
 ↓
到处写 IgH API
 ↓
到处操作 PDO

因为如果 ROS2 节点直接操作 EtherCAT:

ROS2代码
+
EtherCAT代码
+
CiA402代码

全部混在一起。

以后换硬件就非常痛苦。

Logo

聚焦RDK与具身智能,汇集机器人开发教程、开源案例和技术交流

更多推荐