ROS2 Control 硬件接口,用于通过 CAN FD 通信控制 JX 电机(循环同步位置模式)。
- 支持 CAN FD 通信(1Mbps 仲裁段,5Mbps 数据段)
- 支持最多 8 个电机同时控制
- 循环同步位置(CSP)控制模式
- 提供位置、速度状态反馈
- 支持位置命令控制
position: 关节位置命令(弧度)
position: 关节实际位置(弧度)velocity: 关节实际速度(弧度/秒)
cd ~/ros2_ws
colcon build --packages-up-to juxie_ros2_control --symlink-install
source install/setup.bash在 ROS2 Control 配置中需要设置以下硬件参数:
can_interface(string, 默认:"can0"): CAN 接口名称motor_ids(string, 必需): 电机 ID 列表,格式为"1,2,3"或"[1,2,3]"control_period_ms(int, 默认:1): 控制周期(毫秒),默认 1ms = 1000Hz
在您的机器人描述文件中添加 ROS2 Control 配置:
<?xml version="1.0"?>
<robot name="my_robot" xmlns:xacro="http://www.ros.org/wiki/xacro">
<!-- 定义关节接口 -->
<ros2_control name="juxie_system" type="system">
<hardware>
<plugin>juxie_ros2_control/JxHardware</plugin>
<!-- CAN 接口配置 -->
<param name="can_interface">can0</param>
<!-- 电机 ID 列表(最多 8 个) -->
<param name="motor_ids">1,2,3</param>
<!-- 控制周期(毫秒) -->
<param name="control_period_ms">1</param>
</hardware>
<!-- 关节接口定义 -->
<joint name="joint1">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">0.0</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
<joint name="joint2">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">0.0</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
<joint name="joint3">
<command_interface name="position"/>
<state_interface name="position">
<param name="initial_value">0.0</param>
</state_interface>
<state_interface name="velocity"/>
</joint>
</ros2_control>
</robot>- 编辑 sudoers 文件
sudo visudo- 添加以下行(将
your_username替换为你的实际用户名,将can0为默认配置的设备名称)
your_username ALL=(ALL) NOPASSWD: /sbin/ip link set can0 down, /sbin/ip link set can0 up type can bitrate * dbitrate * fd on
示例(如果用户名为 fa,设备名称为 can0):
fa ALL=(ALL) NOPASSWD: /sbin/ip link set can0 down, /sbin/ip link set can0 up type can bitrate * dbitrate * fd on
使用标准的 ROS2 Control 控制器(如 joint_trajectory_controller):
# 启动机器人描述
ros2 launch your_robot_description display.launch.py
# 启动控制器管理器
ros2 control load_controller joint_state_broadcaster
ros2 control load_controller joint_trajectory_controller
# 激活控制器
ros2 control set_controller_state joint_state_broadcaster active
ros2 control set_controller_state joint_trajectory_controller active# 使用命令行发送位置命令
ros2 topic pub /joint_trajectory_controller/joint_trajectory \
trajectory_msgs/msg/JointTrajectory \
"{joint_names: ['joint1', 'joint2', 'joint3'], \
points: [{positions: [0.5, -0.5, 1.0], time_from_start: {sec: 2, nanosec: 0}}]}"- 电机 ID 顺序:
motor_ids参数中的 ID 顺序必须与 URDF 中定义的关节顺序一致 - 角度范围: 电机角度范围为 -180° 到 +180°(-π 到 +π 弧度)
- 权限要求: CAN 接口配置需要 root 权限,确保运行节点时具有相应权限
- CAN FD 支持: 确保您的 CAN 适配器支持 CAN FD 模式
- 控制周期: 默认 1ms 控制周期,可根据实际需求调整
- CAN 接口初始化失败: 检查 CAN 接口名称是否正确,接口是否已连接
- 电机无响应: 检查电机 ID 配置是否正确,CAN 总线连接是否正常
- 权限错误: 确保具有配置 CAN 接口的权限,可能需要使用 sudo 或配置 udev 规则