# ros_control_test **Repository Path**: hf_zhao/ros_control_test ## Basic Information - **Project Name**: ros_control_test - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-19 - **Last Updated**: 2026-08-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ros_control 学习工程:达妙电机 MIT 模式 一个用来学 ros_control 的双关节机械臂(RRBot)工程。和大多数教程不同的是,它不用 ros_control 自带的力矩接口,而是自定义了一套 **MIT 风格的混合关节接口**,对应达妙(DAMIAO)电机的控制方式:一次下发 `kp`、`kd`、期望位置、期望速度、前馈力矩五个量,闭环由电机内部完成。 同一套控制器可以跑在三种硬件层上: | 模式 | 硬件层 | 需要什么 | |---|---|---| | 假电机 | 内存里的积分器 | 什么都不需要 | | Gazebo | `RrbotHWSim` 插件 | 装了 Gazebo | | 真机 | `RrbotHW` + SocketCAN | 达妙电机 + USB-CAN | ## 目录结构 ```text src/ ├── rrbot_description/ 模型:URDF / xacro / rviz 配置 ├── rrbot_common/ 公共层:HybridJointInterface + MitCommand.msg(只有头文件和消息) ├── rrbot_controllers/ 控制器层:HybridJointController(pluginlib 插件) ├── rrbot_hw/ 真机硬件层:RrbotHW + 达妙 CAN 驱动 + 控制循环节点 ├── rrbot_gazebo/ 仿真硬件层:RrbotHWSim(gazebo_ros_control 插件) └── rrbot_bringup/ 启动层:launch + yaml,不含代码 ``` 依赖是单向的:`rrbot_common` 被其余三个实现包依赖,自己不依赖任何实现。拆包的原因和判断新代码该放哪,见 `docs/package_layout.md`。 ## 快速开始 ```bash cd ~/workspace/repos/ros_control_test catkin_make source devel/setup.bash ``` **假电机模式**(不需要任何硬件,最快看到效果): ```bash roslaunch rrbot_bringup rrbot_hw.launch ``` 另开一个终端发指令,rviz 里的连杆会转到 1.0 rad: ```bash rostopic pub -1 /joint1_hybrid_controller/command rrbot_common/MitCommand \ "{position: 1.0, velocity: 0.0, kp: 20.0, kd: 1.0, feedforward: 0.0}" ``` **Gazebo 模式**(有真实重力和惯量): ```bash roslaunch rrbot_bringup rrbot_gazebo.launch ``` **真机模式**(先把 CAN 拉起来): ```bash sudo ip link set can0 up type can bitrate 1000000 roslaunch rrbot_bringup rrbot_hw.launch use_real_hardware:=true ``` 真机模式启动前必须先按你的电机改 `src/rrbot_bringup/config/rrbot_hw.yaml` 里的 `slave_id`、`master_id`、`p_max`、`v_max`、`t_max`。上机步骤和安全注意事项见 `docs/damiao_mit.md`。 ## 建议的学习顺序 1. 跑假电机模式,用 `rostopic pub` 改各个参数,理解 kp / kd / 前馈各自的作用(`docs/hybrid_joint_interface.md` 第 6 节列了几组对照指令) 2. 读 `rrbot_common/include/rrbot_common/hybrid_joint_interface.h`,理解自定义接口为什么只是「把 1 个命令指针换成 5 个」 3. 读 `rrbot_hw/src/rrbot_hw.cpp` 的 `writeDummy`,那三行就是真实电机内部在做的事 4. 跑 Gazebo 模式,感受有重力之后同样的 kp 表现有什么不同 5. 读 `rrbot_hw/src/damiao_motor.cpp`,理解 5 个浮点数怎么压进 8 个字节 6. 接真电机 ## 文档 | 文件 | 内容 | |---|---| | `docs/package_layout.md` | 包怎么拆的、依赖关系、编译排错、新旧结构对照 | | `docs/hybrid_joint_interface.md` | 自定义接口的写法、一条指令的完整路径、几个安全要点 | | `docs/damiao_mit.md` | 达妙 CAN 协议、帧格式、接线、上机顺序、真机前还要补什么 | | `docs/gazebo_robot_hw_sim.md` | 为什么默认 Gazebo 插件不够用、自己写要注意什么 | | `docs/hardware_interface.md` | ros_control 的 RobotHW / Interface / Handle 三层结构(基础概念) | | `docs/urdf_transmission.md` | URDF 里的 `` 怎么填 |