本项目基于ROS 2和ros2_control框架实现电机硬件控制接口,支持通过CAN总线与电机通信,提供位置控制功能,并可通过ROS 2话题进行远程控制。
- ROS 2 Humble Hawksbill (或其他兼容版本)
- ros2_control
- ros2_controllers
- can-utils (用于CAN总线调试)
请按照ROS 2官方文档安装对应版本的ROS 2。
mkdir -p ~/ros2_ws/src
cd ~/ros2_wscd ~/ros2_ws/src
git clone <仓库URL> # 替换为实际仓库地址cd ~/ros2_ws
rosdep install --from-paths src --ignore-src -r -ycd ~/ros2_ws
colcon build --symlink-install
source install/setup.bashros2_ws/src/
├── motor_control/
│ ├── CMakeLists.txt
│ ├── config/
│ ├── launch/
│ ├── urdf/
│ ├── motor_hardware_interface.cpp
│ ├── motor_hardware_interface.h
│ ├── control_motor_via_topic.py
│ └── test_motor_hardware.cpp
└── motor_control_interface/
├── CMakeLists.txt
└── ...
- 基于ros2_control的硬件接口实现
- CAN总线通信支持
- 电机位置控制
- 实时状态反馈(位置、速度)
- 通过ROS 2话题进行远程控制
控制器配置文件:config/motor_controller_config.yaml
controller_manager:
ros__parameters:
update_rate: 100
joint_state_broadcaster:
type: joint_state_broadcaster/JointStateBroadcaster
position_controller:
type: position_controllers/JointGroupPositionController
joints:
- joint1
interface_name_mapping:
joint1:
position: position
velocity: velocity
effort: effort
joint1:
pid:
p: 100.0
i: 0.0
d: 1.0
i_clamp: 0.0URDF文件用于描述机器人模型和硬件接口配置,定义了关节和电机之间的映射关系。
cd /home/ffd/ros2_ws
source install/setup.bash
ros2 launch motor_control_interface motor_control_launch.py启动后会自动:
- 加载电机硬件接口
- 启动控制器管理器
- 激活joint_state_broadcaster
- 激活position_controller
cd /home/ffd/ros2_ws
source install/setup.bash
./install/motor_control_interface/lib/motor_control_interface/test_motor_hardware使用提供的Python脚本发送位置命令:
cd /home/ffd/ros2_ws
source install/setup.bash
python3 src/motor_control/control_motor_via_topic.py- 话题名:
/position_controller/commands - 消息类型:
std_msgs/msg/Float64MultiArray - 描述:发送电机位置命令,单位为弧度
- 示例数据:
data: [0.5]表示将电机位置设置为0.5弧度
- 话题名:
/joint_states - 消息类型:
sensor_msgs/msg/JointState - 描述:反馈电机当前状态,包括位置、速度和力矩
- 控制器类型:
position_controllers/JointGroupPositionController - 控制关节:joint1
- 更新频率:100Hz
- 插件名称:
motor_control::MotorControlHardware - 通信方式:CAN总线
- 支持接口:
- 命令接口:position
- 状态接口:position、velocity、effort
-
CAN接口占用:关闭测试程序时可能出现"Bad file descriptor"错误,这是因为CAN接口被占用,可通过重启系统或重新初始化CAN接口解决。
-
控制器激活失败:检查控制器配置文件中的关节名称和接口映射是否正确。
-
电机无响应:确认CAN总线连接正常,电机ID配置正确,且电机已正确使能。
通过ROS 2话题工具发送位置命令:
ros2 topic pub -1 /position_controller/commands std_msgs/msg/Float64MultiArray "data: [0.5]"ros2 topic echo /joint_states- 位置命令单位为弧度
- 电机控制范围根据实际电机参数确定
- 启动前确保CAN接口已正确初始化
- 测试程序运行时请勿手动操作电机