工程架构:
上层程序 ↓ JointTrajectory ↓ ROS2 control Node ↓ 关节映射 ↓ rad → encoder count ↓ EtherCAT command ↓ CiA402 Drive ↓ Motor反馈方向:
Motor ↓ Encoder ↓ EtherCAT ↓ encoder count ↓ count → rad ↓ ROS2 ↓ JointState / Controller1. 参数化 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 ↓ ROS24. ROS2 和 EtherCAT 为什么要解耦?
一个非常好的工程架构应该是:
ROS2 ↓ Hardware Interface ↓ EtherCAT Driver而不是:
ROS2 Node ↓ 到处写 IgH API ↓ 到处操作 PDO因为如果 ROS2 节点直接操作 EtherCAT:
ROS2代码 + EtherCAT代码 + CiA402代码全部混在一起。
以后换硬件就非常痛苦。