# arm_control ROS 节点封装总结 ## ✅ 完成的工作 ### 1. 创建了消息和服务定义包 (`arm_control_msgs`) **消息类型**: - `TCPPose.msg` - TCP 位姿(x, y, z, phi) - `JointState.msg` - 关节状态(height, j2-j6) **服务类型**: - `MoveJoints.srv` - 关节空间运动控制 - `MovePose.srv` - 笛卡尔空间运动控制(带逆运动学) - `GetPose.srv` - 查询当前位姿(正运动学) - `SetGripper.srv` - 夹爪控制 ### 2. 封装了控制节点 (`arm_control.py`) **核心功能**: - ✅ 关节空间插值运动 - ✅ 笛卡尔空间逆运动学求解 - ✅ 正运动学位姿计算 - ✅ UDP 命令发送(与 ESP32 通信) - ✅ 状态缓存(平滑运动) - ✅ 参数化配置 - ✅ 状态发布(10Hz) **服务接口**: - `/arm_control/move_joints` - 关节运动 - `/arm_control/move_pose` - 位姿运动 - `/arm_control/get_pose` - 查询位姿 - `/arm_control/set_gripper` - 夹爪控制 **话题发布**: - `/arm_control/joint_states` - 关节状态(10Hz) - `/arm_control/tcp_pose` - TCP 位姿(10Hz) ### 3. 创建了示例客户端 (`arm_control_client.py`) **演示功能**: - 查询当前位姿 - 完整抓取流程: 1. 移动到物体上方 2. 下降 3. 抓取 4. 提升 5. 移动到目标位置 6. 下降 7. 释放 8. 提升 ### 4. 配置和文档 **配置文件**: - `config/arm_control.yaml` - 完整参数配置 **文档**: - `ARM_CONTROL_README.md` - 完整使用文档 - `QUICKSTART.md` - 快速开始指南 **脚本**: - `build_arm_control.sh` - 一键编译脚本 ## 📁 文件清单 ``` ros2/ ├── build_arm_control.sh # 编译脚本 ✨ ├── ARM_CONTROL_README.md # 完整文档 ✨ ├── QUICKSTART.md # 快速指南 ✨ └── src/ ├── arm_control_msgs/ # 消息包 ✨ │ ├── CMakeLists.txt │ ├── package.xml │ ├── msg/ │ │ ├── TCPPose.msg │ │ └── JointState.msg │ └── srv/ │ ├── MoveJoints.srv │ ├── MovePose.srv │ ├── GetPose.srv │ └── SetGripper.srv └── udp_teleop/ ├── setup.py # 已更新 ✨ ├── package.xml # 已更新 ✨ ├── udp_teleop/ │ ├── keyboard_control.py # 原有 │ ├── arm_control.py # 新增 ✨ │ └── arm_control_client.py # 新增 ✨ └── config/ ├── params.yaml # 原有 └── arm_control.yaml # 新增 ✨ ``` ## 🚀 快速使用 ### 编译 ```bash cd ros2 ./build_arm_control.sh ``` ### 运行节点 ```bash ros2 run udp_teleop arm_control \ --ros-args --params-file src/udp_teleop/config/arm_control.yaml ``` ### 测试服务 ```bash # 查询位姿 ros2 service call /arm_control/get_pose arm_control_msgs/srv/GetPose # 移动 ros2 service call /arm_control/move_pose arm_control_msgs/srv/MovePose \ "{x: 200.0, y: 100.0, z: -100.0, phi: 45.0, duration: 2.0}" ``` ### 运行示例 ```bash ros2 run udp_teleop arm_control_client ``` ## 🎯 与原始 udp_control.py 对比 | 特性 | udp_control.py | arm_control 节点 | |------|---------------|-----------------| | **接口方式** | 命令行参数 | ROS 服务调用 | | **状态查询** | 读取 JSON 文件 | 服务调用 + 话题订阅 | | **多客户端** | ❌ 不支持 | ✅ 支持 | | **实时监控** | ❌ 无 | ✅ 10Hz 状态发布 | | **参数配置** | 命令行参数 | YAML 配置文件 | | **集成度** | 独立工具 | ROS 生态集成 | | **可编程性** | Shell 脚本 | Python/C++ 客户端 | ## 💡 优势 ### 1. **标准化接口** - 使用 ROS 服务和话题,符合 ROS 生态标准 - 易于与其他 ROS 节点集成(如视觉、规划器) ### 2. **多客户端支持** - 多个客户端可同时连接 - 适合复杂系统(如视觉 + 手动控制) ### 3. **实时状态监控** - 10Hz 状态发布 - 可用于可视化、日志记录、故障诊断 ### 4. **灵活配置** - YAML 参数文件 - 运行时参数覆盖 - 无需重新编译 ### 5. **易于扩展** - 添加新服务:只需定义 .srv 文件 - 添加新话题:只需定义 .msg 文件 - 集成其他功能:订阅/发布话题即可 ## 🔧 使用场景 ### 场景 1:视觉抓取 ```python # 视觉节点订阅相机话题,检测物体 # 调用 arm_control 服务控制机械臂 class VisionGraspNode(Node): def __init__(self): self.arm_cli = self.create_client(MovePose, 'arm_control/move_pose') self.sub = self.create_subscription(Image, '/camera/image', self.on_image, 10) def on_image(self, msg): # 检测物体 x, y, z = detect_object(msg) # 控制机械臂抓取 self.move_to(x, y, z, phi=45.0) ``` ### 场景 2:示教编程 ```python # 记录示教点位 class TeachPendant(Node): def __init__(self): self.get_cli = self.create_client(GetPose, 'arm_control/get_pose') self.move_cli = self.create_client(MovePose, 'arm_control/move_pose') self.waypoints = [] def record_waypoint(self): # 记录当前位置 pose = self.get_current_pose() self.waypoints.append(pose) def replay(self): # 重放示教轨迹 for pose in self.waypoints: self.move_to(pose.x, pose.y, pose.z, pose.phi) ``` ### 场景 3:轨迹规划 ```python # 使用规划器生成轨迹 class TrajectoryPlanner(Node): def __init__(self): self.move_cli = self.create_client(MovePose, 'arm_control/move_pose') def execute_trajectory(self, waypoints): # 执行轨迹点序列 for wp in waypoints: self.move_to(wp.x, wp.y, wp.z, wp.phi, duration=0.5) ``` ## 📚 下一步建议 ### 1. **视觉集成** 创建视觉抓取节点,结合 `camera_to_base.py` 实现自动抓取 ### 2. **GUI 控制面板** 使用 RQt 创建图形界面,实时显示状态和控制 ### 3. **轨迹记录与回放** 实现示教编程功能 ### 4. **碰撞检测** 添加工作空间限制和简单碰撞检测 ### 5. **MoveIt 集成** 创建 URDF 和 MoveIt 配置,使用高级运动规划 ## 🎓 学习资源 - ROS 2 服务教程:https://docs.ros.org/en/humble/Tutorials/Services.html - ROS 2 话题教程:https://docs.ros.org/en/humble/Tutorials/Topics.html - 自定义消息:https://docs.ros.org/en/humble/Tutorials/Custom-ROS2-Interfaces.html ## ✨ 总结 现在你有了一个完整的 ROS 节点化的机械臂控制系统: 1. ✅ **功能完整** - 保留了 udp_control.py 的所有功能 2. ✅ **接口标准** - 使用 ROS 服务和话题 3. ✅ **易于集成** - 可与其他 ROS 节点无缝配合 4. ✅ **文档齐全** - 提供了完整的文档和示例 5. ✅ **开箱即用** - 一键编译,快速上手 祝你使用愉快!🎉