{"id":51011646,"url":"https://github.com/ioai-tech/io_gripper_ros","last_synced_at":"2026-06-21T03:30:41.644Z","repository":{"id":363247847,"uuid":"1262498253","full_name":"ioai-tech/io_gripper_ros","owner":"ioai-tech","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-15T06:50:20.000Z","size":49,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-15T08:23:51.942Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ioai-tech.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-08T03:38:19.000Z","updated_at":"2026-06-15T06:50:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ioai-tech/io_gripper_ros","commit_stats":null,"previous_names":["ioai-tech/io_gripper_ros"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ioai-tech/io_gripper_ros","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ioai-tech%2Fio_gripper_ros","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ioai-tech%2Fio_gripper_ros/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ioai-tech%2Fio_gripper_ros/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ioai-tech%2Fio_gripper_ros/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ioai-tech","download_url":"https://codeload.github.com/ioai-tech/io_gripper_ros/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ioai-tech%2Fio_gripper_ros/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34593128,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-21T02:00:05.568Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-21T03:30:38.615Z","updated_at":"2026-06-21T03:30:41.629Z","avatar_url":"https://github.com/ioai-tech.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# io_gripper_ros\n\nROS2 夹爪控制节点，基于 `io_gripper_sdk` 实现对夹爪设备的控制和状态管理。\n\n## 项目结构\n\n```\nros2_ws/src/\n├── io_gripper_interfaces/    # ROS2 自定义消息和服务定义\n├── io_gripper_ros/           # ROS2 节点实现（主包）\n└── io_gripper_sdk/           # 夹爪 SDK 子模块\n```\n\n## 功能特性\n\n- ✅ 夹爪位置控制\n- ✅ 夹爪速度控制\n- ✅ 力矩控制与限制\n- ✅ 紧急停止功能\n- ✅ 软限位设置\n- ✅ 舵机 ID 扫描\n- ✅ 配置文件管理\n- ✅ 实时状态轮询\n- ✅ 获取相机参数\n- ✅ 实时发布相机图像话题\n\n## 安装说明\n\n### 1. 克隆项目（包含子模块）\n\n```bash\ngit clone --recurse-submodules git@git.io-ai.tech:io_sensexperience/io_gripper_sdk.git\ncd io_gripper_ros/ros2_ws\n```\n\n\n### 2. 构建项目(在ros2_ws目录下)\n\n```bash\ncolcon build --packages-select io_gripper_interfaces io_gripper_ros\nsource install/setup.bash\n```\n\n### 3. 更新子模块（如果需要）\n\n```bash\ngit submodule update --init --recursive\n```\n\n## 使用方法\n\n### 启动节点\n\n```bash\nros2 run io_gripper_ros io_gripper_node --ros-args -r __node:=left_gripper_node -r __ns:=/io_left_gripper -p auto_detect_port:=true -p camera_serial:=G2026061 -p config_name:=new_config.yaml\n```\n### 命令说明\n  - `__node:=left_gripper_node` 节点名称 不同节点对应不同的节点名称\n  - `__ns:=/io_left_gripper` 命名空间 不同的夹爪节点必须用不同的命名空间，同时各自对应的 topic和service 也要修改\n  - `auto_detect_port:=true` 是否自动检测串口端口 默认true。 如果选择false 则需要手动指定串口设备名称和相机端口（或者使用默认值），同时不必传入`camera_serial`\n  - `port:=/dev/ttyUSB0` 串口设备名称，如果上面取消了自动检测端口，需要手动指定串口设备名称，或者不传入参数，选择使用默认值 ‘/dev/ttyUSB0’\n  - `camera_image_port:=/dev/video0` 相机端口，如果上面取消了自动检测端口，需要手动指定串口设备名称，或者不传入参数，选择使用默认值 ‘/dev/video0’\n  - `camera_serial:=\"\"` 夹爪相机对应的序列号，如果`auto_detect_port:=true`，则必须传入该参数来控制对应的夹爪。如果`auto_detect_port:=false`，则可以不传入该参数，使用默认值。\n  - `config_name:=new_config.yaml` 配置文件名称\n\n### 服务调用示例\n\n#### 连接设备\n```bash\nros2 service call /io_left_gripper/connect std_srvs/srv/Trigger \"{}\"\n```\n\n#### 初始化夹爪同时开始发布相机图像话题\n```bash\nros2 service call /io_left_gripper/initialize std_srvs/srv/Trigger \"{}\"\n```\n### 标定 (只需要标定一次，前提是配对应的配置文件不变 | 标定需要在 initialize 之前调用)\n```bash\nros2 service call /io_left_gripper/calibrate std_srvs/srv/Trigger \"{}\"\n```\n### 夹爪开合语义控制\n```bash\nros2 topic pub --once /io_left_gripper/joint_cmd sensor_msgs/msg/JointState \"{name: ['fpy'], position: [1.0], velocity: [0.5], effort: [1]}\"\n```\n**参数说明**：\n\n| 参数名 | 类型 | 说明 |\n|--------|------|------|\n| `name` | string[] | 控制名称 |\n| `normalized_opening` | float32[] | 归一化开口度（0.0-1.0），0.0 表示完全闭合，1.0 表示完全打开 |\n| `max_effort` | float32[] | 最大作用力（0.0-1.0），0.0 表示无力矩，1.0 表示最大力,可以不传入. 使用默认值0.5 |\n| `speed` | float32[] | 运动速度（0.0-1.0），0.0 表示最慢，1.0 表示最快. 可以不传入，使用默认值0.5 |\n\n**使用示例**：\n\n1. **完全打开**：\n```bash\nros2 topic pub --once /io_left_gripper/joint_cmd sensor_msgs/msg/JointState \"{name: ['gripper'], position: [1], velocity: [0.5], effort: [0.5]}\"\n\n```\n\n2. **完全闭合**：\n```bash\nros2 topic pub --once /io_left_gripper/joint_cmd sensor_msgs/msg/JointState \"{name: ['gripper'], position: [0.0], velocity: [0.0], effort: [0.5]}\"\n```\n\n#### 设置位置\n```bash\nros2 service call /io_left_gripper/command_position io_gripper_interfaces/srv/CommandPosition \"{mode: 0, position_raw: 2742}\"\n```\n\n**参数说明**：\n\n| 参数名 | 类型 | 说明 |\n|--------|------|------|\n| `mode` | uint8 | 位置模式：`0` = 原始位置值（position_raw），`1` = 弧度（angle_rad） |\n| `position_raw` | uint16 | 原始位置值（在限位范围内），仅在 mode=0 时有效 |\n| `angle_rad` | float32 | 角度（弧度），仅在 mode=1 时有效 |\n\n#### 设置速度\n```bash\nros2 service call /io_left_gripper/command_velocity io_gripper_interfaces/srv/CommandVelocity \"{mode: 0, velocity_raw: 10}\" \n```\n\n**参数说明**：\n\n| 参数名 | 类型 | 说明 |\n|--------|------|------|\n| `mode` | uint8 | 速度模式：`0` = 原始速度值（velocity_raw），`1` = 弧度/秒（velocity_rad_s） |\n| `velocity_raw` | uint16 | 原始速度值（0-3000），仅在 mode=0 时有效，最大速度在配置文件中设置 |\n| `velocity_rad_s` | float32 | 角速度（弧度/秒），仅在 mode=1 时有效 |\n\n#### 设置力矩限制\n```bash\nros2 service call /io_left_gripper/set_effort_limit io_gripper_interfaces/srv/SetEffortLimit \"{mode: 2, current_limit_ma: 3250, torque_limit_raw: 2000}\"\n```\n\n**参数说明**：\n\n| 参数名 | 类型 | 说明 |\n|--------|------|------|\n| `mode` | uint8 | 设置模式：`0` = 仅设置电流限制，`1` = 仅设置力矩限制，`2` = 同时设置两者 |\n| `current_limit_ma` | float32 | 电流限制（毫安），默认范围 0-3250 mA |\n| `torque_limit_raw` | uint16 | 力矩限制原始值（0-1000） |\n\n#### 设置软限位\n```bash\nros2 service call /io_left_gripper/set_soft_limit io_gripper_interfaces/srv/SetSoftLimit \"{min_width_mm: 10.0, max_width_mm: 80.2}\"\n```\n\n**参数说明**：\n\n| 参数名 | 类型 | 说明 |\n|--------|------|------|\n| `min_width_mm` | float32 | 最小开口宽度（毫米），夹爪无法闭合小于此值 |\n| `max_width_mm` | float32 | 最大开口宽度（毫米），夹爪无法张开大于此值 |\n\n#### 使能/禁用力矩\n```bash\nros2 service call /io_left_gripper/set_torque io_gripper_interfaces/srv/SetTorque \"{enable: false}\"\n```\n\n**参数说明**：\n\n| 参数名 | 类型 | 说明 |\n|--------|------|------|\n| `enable` | bool | `true` = 使能力矩，`false` = 禁用力矩（夹爪释放） |\n\n#### 抓取物体\n```bash\nros2 service call /io_left_gripper/pick_object io_gripper_interfaces/srv/PickObject \"{width_mm: 20.5, speed: 600, effort: 1000, timeout_ms: 1000}\"\n```\n\n**参数说明**：\n\n| 参数名 | 类型 | 说明 |\n|--------|------|------|\n| `width_mm` | float32 | 目标抓取宽度（毫米） |\n| `speed` | float32 | 抓取速度（原始值，0-3000） |\n| `effort` | float32 | 抓取力（原始值，0-1000） |\n| `timeout_ms` | int32 | 超时时间（毫秒），超时后停止抓取 |\n\n#### 紧急停止 通过重新初始恢复\n```bash\nros2 service call /io_left_gripper/emergency_stop io_gripper_interfaces/srv/EmergencyStop \"{release_torque: true}\"\n```\n\n**参数说明**：\n\n| 参数名 | 类型 | 说明 |\n|--------|------|------|\n| `release_torque` | bool | `true` = 紧急停止并释放力矩，`false` = 紧急停止但保持力矩 |\n\n#### 获取状态\n```bash\nros2 service call /io_left_gripper/get_status io_gripper_interfaces/srv/GetStatus \"{}\"\n```\n\n#### 扫描舵机 ID\n```bash\nros2 service call /io_left_gripper/scan_ids io_gripper_interfaces/srv/ScanIds \"{start_id: 1, end_id: 10}\"\n```\n\n**参数说明**：\n\n| 参数名 | 类型 | 说明 |\n|--------|------|------|\n| `start_id` | uint8 | 扫描起始 ID（范围：0-253） |\n| `end_id` | uint8 | 扫描结束 ID（范围：0-253），必须大于等于 start_id |\n\n#### 修复配置(修复舵机ID)\n```bash\nros2 service call /io_left_gripper/fix_config io_gripper_interfaces/srv/FixConfig \"{servo_id: 2}\"\n```\n\n**参数说明**：\n\n| 参数名 | 类型 | 说明 |\n|--------|------|------|\n| `servo_id` | uint8 | 目标舵机 ID（范围：0-253），将配置文件中的 servo_id 修改为此值 |\n\n#### 启动状态轮询\n```bash\nros2 service call /io_left_gripper/start_polling io_gripper_interfaces/srv/StartPolling \"{rate_hz: 100}\"\n```\n\n**参数说明**：\n\n| 参数名 | 类型 | 说明 |\n|--------|------|------|\n| `rate_hz` | float32 | 轮询频率（赫兹），建议范围 10-120 Hz |\n\n### 开启轮询后获取轮询状态 once只获取一次\n```bash\nros2 topic echo /io_left_gripper/joint_states --once\n```\n\n### 获取相机图像\n```bash\nros2 topic echo /io_left_gripper/camera_image --once\n```\n\n### 获取相机图像设置\n```bash\nros2 service call /io_left_gripper/get_camera_settings io_gripper_interfaces/srv/GetCameraSettings \"{}\"\n```\n\n#### 停止发布相机图像话题\n```bash\nros2 service call /io_left_gripper/stop_camera std_srvs/srv/Trigger \"{}\"\n```\n### 清理状态  在超过安全限制之后会进入故障状态，通过这里清除但不能清除急停状态\n```bash\nros2 service call /io_left_gripper/clear_status std_srvs/srv/Trigger \"{}\"\n```\n\n### 断开连接 并停止相机image发布\n```bash\nros2 service call /io_left_gripper/disconnect std_srvs/srv/Trigger \"{}\"\n```\n\n## 话题发布\n\n| 话题名               | 消息类型                           | 描述                                 |\n| -------------------- | ---------------------------------- | ------------------------------------ |\n| `/io_gripper/status` | `io_gripper_interfaces/msg/Status` | 夹爪状态（位置、速度、力矩、状态码） |\n\n## 参数配置\n\n| 参数名             | 类型   | 默认值                       | 描述         |\n| ------------------ | ------ | ---------------------------- | ------------ |\n| `port`             | string | `/dev/ttyUSB0`               | 串口设备路径 |\n| `baud_rate`        | int    | 115200                       | 波特率       |\n| `config_file_path` | string | `config/gripper_config.yaml` | 配置文件路径 |\n\n## 配置文件格式\n\n```yaml\nDeviceProfile:\n  device_info:\n    model_name: Feetech_DeviceProfile\n    servo_id: 1\n    recommended_baudrate: 115200\n  capabilities:\n    supports_sync_write: true\n    supports_sync_read: false\n    supports_present_current: true\n  safety_limits:\n    min_voltage_v: 4.5\n    max_voltage_v: 25.4\n    max_temperature_c: 70.0\n    max_servo_velocity: 3000\n    start_power: 8\n    release_torque_on_disconnect: true\n  calibration:\n    calib_max_position_raw: 2742\n    calib_min_position_raw: 2293\n    calib_max_width_mm: 100.0\n    calib_min_width_mm: 0.0\n  camera:\n    width: 640\n    height: 480\n    fps: 30.0\n    jpeg_quality: 80\n```\n\n## 状态码说明\n\n| 状态码 | 描述     |\n| ------ | -------- |\n| 0      | 未连接 |\n| 1      | 已连接   |\n| 2      | 就绪     |\n| 3      | 运行中   |\n| 4      | 故障     |\n\n## 子模块说明\n\n`io_gripper_sdk` 是一个独立的 git 子模块，提供夹爪硬件的底层驱动支持。\n\n```bash\n# 添加子模块\ngit submodule add git@git.io-ai.tech:io_sensexperience/io_gripper_sdk.git ros2_ws/src/io_gripper_sdk\n\n# 更新子模块\ngit submodule update --remote\n```\n\n## 许可证\n\nMIT License\n\n## 开发说明\n\n### 目录结构\n\n```\nio_gripper_ros/\n├── config/              # 配置文件\n├── include/io_gripper_ros/  # 头文件\n│   ├── gripper_port_resolver.hpp  # 端口解析器\n│   └── io_gripper_node.hpp       # 节点类定义\n├── src/                 # 源文件\n│   ├── gripper_port_resolver.cpp\n│   ├── io_gripper_node.cpp\n│   └── main.cpp\n├── CMakeLists.txt\n├── package.xml\n└── LICENSE\n```\n\n## 常见问题\n\n### Q: 无法连接设备？\n\n确保串口设备权限正确：\n```bash\nsudo chmod 666 端口+\n```\n\n### Q: 配置文件修改后不生效？\n\n通过`fix_config`服务修改配置文件后需要重新连接。\n\n### Q: 子模块更新后编译失败？\n\n尝试重新构建整个工作空间：\n```bash\nrm -rf build/ install/ log/\ncolcon build --symlink-install\n```\n\n## 使用 dockerfile 构建（x_64）\n```bash\nsudo docker build \\\n  --build-arg HTTP_PROXY=    \\\n  --build-arg HTTPS_PROXY=   \\\n  --build-arg NO_PROXY=localhost,127.0.0.1 \\\n  -f container/Containerfile_x64.Dockerfile \\\n  -t io_gripper_ros:latest .\n```\n\n## 运行节点\n\n**x64：**\n```bash\nsudo docker run --rm -it \\\n  --net=host \\\n  --ipc=host \\\n  --privileged \\\n  -v /dev:/dev \\\n  io_gripper_ros:latest \\\n  bash -c \"cd /ros2_ws \u0026\u0026 \\\n           source /opt/ros/humble/setup.bash \u0026\u0026 \\\n           source install_x64/setup.bash \u0026\u0026 \\\n           ros2 run io_gripper_ros io_gripper_node \\\n             --ros-args \\\n             -r __node:=left_gripper_node \\\n             -r __ns:=/io_left_gripper \\\n             -p auto_detect_port:=true \\\n             -p camera_serial:=G2026061 \\\n             -p config_name:=new_config.yaml\"\n```\n\n**arm64版本：**\n```bash\nsudo docker run --rm -it \\\n  --net=host \\\n  --ipc=host \\\n  --privileged \\\n  -v /dev:/dev \\\n  io_gripper_ros:latest \\\n  bash -c \"cd /ros2_ws \u0026\u0026 \\\n           source /opt/ros/humble/setup.bash \u0026\u0026 \\\n           source install_arm64/setup.bash \u0026\u0026 \\\n           ros2 run io_gripper_ros io_gripper_node \\\n             --ros-args \\\n             -r __node:=left_gripper_node \\\n             -r __ns:=/io_left_gripper \\\n             -p auto_detect_port:=true \\\n             -p camera_serial:=G2026061 \\\n             -p config_name:=new_config.yaml\"\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fioai-tech%2Fio_gripper_ros","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fioai-tech%2Fio_gripper_ros","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fioai-tech%2Fio_gripper_ros/lists"}