
1. 项目目标
本项目基于 camera_arm_rm65b_control_neural.py 实现:
- 使用 Femto Mega 获取深度对齐彩色图像。
- 用 MediaPipe/神经网络方案识别人手、手掌位移和手指弯曲。
- 机械臂 RM65-B 通过 RealMan API 的 CANFD 透传接口
rm_movep_canfd跟随手掌运动。
- 强脑 Revo2 基础版灵巧手通过强脑官方
bc_stark_sdkRS485/Modbus 接口跟随手指弯曲。
- 通过 GUI 在按下
s前调参;按s开始识别和控制;按h回原位;按p保存 GUI 默认参数。
2. 为什么不用一条 RS485 全包?因为它真的会“堵车” 🛑
调试中发现,如果机械臂和灵巧手都走 RM 工具端 RS485/raw-Modbus,会出现:
- 机械臂响应慢,难以达到 CANFD 那种丝滑跟随。
- 灵巧手和机械臂共享 RM_API/控制器资源,容易互相等待。
rm_set_pos_step是离散步进,不是连续轨迹流,稳定但不够丝滑。
- 手命令频繁写 Modbus 时,机械臂 SDK 可能被占用,日志会出现
Holding hand command while RM65-B SDK is busy。
最终推荐架构:

3. 硬件连接清单

| 设备 | 连接方式 | 备注 |
|---|---|---|
| RM65-B 控制器 | Jetson 通过网口连接 192.168.1.18:8080 |
用 RealMan API 控制机械臂 |
| Femto Mega | USB/网口按 Orbbec SDK 配置 | 默认彩色流 1280x720@30fps |
| Revo2 基础版 | 独立 USB-RS485 接 Jetson | 推荐 /dev/ttyUSB0 或自动检测 |
| Revo2 供电 | 可用机械臂末端 24V | hand_tool_voltage_type:=3 |
| USB-RS485 | A/B/GND 必须接对 | A/B 接反会像在跟空气讲道理 |
4. SDK 安装与环境准备
4.1 RealMan RM_API2
确认工程中存在:
/home/jetson/ws/RM_API2-main
并确保脚本能导入 Robotic_Arm.rm_robot_interface。如果导入失败,把 RM_API2 Python 路径加入 PYTHONPATH。
4.2 Orbbec pyorbbecsdk
确认当前脚本位于:
/home/jetson/ws/pyorbbecsdk-2-main/camera_arm_rm65b_control_neural.py
建议先跑 Orbbec 官方示例,确认相机能出彩色图和深度图。
4.3 强脑 BrainCo SDK
推荐目录:
/home/jetson/ws/brainco-hand-sdk-main/python
确认 Python 能导入:
python3 -c "from bc_stark_sdk import main_mod as sdk; print('BrainCo SDK OK')"
强脑官方 RS485 自动检测可用时,日志里会出现类似:
Found device at baudrate Baud460800, slave_id: 0x7F
Device SN: "...", hw_type: Revo2Basic
Successfully detected device on port: /dev/ttyUSB0
5. 推荐运行命令:机械臂 CANFD + 灵巧手官方 RS485
python /home/jetson/ws/Jetson_Femto_Realman_Brainco_Demo/camera_arm_rm65b_control_neural.py
--ros-args
-p robot_motion_enabled:=true
-p robot_ip:=192.168.1.18
-p arm_control_protocol:=canfd
-p canfd_follow:=false
-p canfd_trajectory_mode:=2
-p canfd_radio:=50
-p arm_command_interval_s:=0.04
-p max_arm_target_delta_m:=0.012
-p min_command_delta_m:=0.002
-p arm_motion_unit_m:=0.002
-p hand_control_enabled:=true
-p hand_transport:=brainco-rs485
-p hand_rs485_sdk_path:=/home/jetson/ws/brainco-hand-sdk-main/python
-p hand_rs485_port:=auto
-p hand_rs485_slave_id:=0
-p hand_rs485_baudrate:=460800
-p hand_rs485_duration_ms:=60
-p hand_wait_for_first_arm_command:=false
-p hand_pause_while_arm_sdk_busy:=false
-p hand_configure_tool_voltage:=true
-p hand_tool_voltage_type:=3
启动后:
- 等待日志出现
Hardware/software initialization complete。
- OpenCV 窗口中出现最近人候选框。
- 按
s开始跟随。
- 按
h回安全原位。
- 在等待
s前可调 GUI;按p保存默认参数。
6. 关键技术亮点
6.1 最近人锁定
脚本会用深度信息标定最近的人,只识别该人的手臂和手掌。附近路人不会轻易抢戏,除非他离镜头更近,俗称“物理插队”。
6.2 神经网络加速识别
脚本使用轻量 MediaPipe Hands,支持 ROI 缩放:
nn_inference_resize_enabled:=true
nn_inference_max_side_px:=384
目的是减少输入图像尺寸,降低推理压力,让 Jetson 少一点热血沸腾。
6.3 机械臂 MIT 风格外环滤波
参数包括:
arm_mit_kp
arm_mit_kd
arm_mit_max_velocity_m_s
arm_mit_max_accel_m_s2
它不是底层力矩控制,而是笛卡尔目标轨迹整形,用来平衡响应速度和抖动。
6.4 灵巧手防误弯曲
脚本加入多层过滤:
hand_bend_deadzone
hand_bend_smoothing
hand_bend_max_delta
hand_reject_single_finger_spikes
hand_reject_multi_finger_spikes
hand_closure_confirm_frames
这些参数负责避免视觉关键点抽风时,灵巧手突然表演“无实物握拳”。

7. 调试路线:别一上来就全开,不然你会和日志互相凝视 👀
7.1 先测机械臂网络
ping 192.168.1.18
python3 -c "import socket; socket.create_connection(('192.168.1.18',8080),3); print('RM TCP OK')"
7.2 单独测机械臂 CANFD
python /home/jetson/ws/pyorbbecsdk-2-main/camera_arm_rm65b_control_neural.py
--ros-args
-p robot_motion_enabled:=true
-p robot_ip:=192.168.1.18
-p arm_control_protocol:=canfd
-p hand_control_enabled:=false
看到 protocol=CANFD 才算走对路。
7.3 单独测强脑 RS485
python /home/jetson/ws/pyorbbecsdk-2-main/camera_arm_rm65b_control_neural.py
--ros-args
-p robot_motion_enabled:=true
-p robot_ip:=192.168.1.18
-p arm_control_protocol:=canfd
-p max_arm_offset_m:=0.0
-p hand_control_enabled:=true
-p hand_transport:=brainco-rs485
-p hand_rs485_sdk_path:=/home/jetson/ws/brainco-hand-sdk-main/python
-p hand_rs485_port:=auto
-p hand_rs485_slave_id:=0
-p hand_configure_tool_voltage:=true
-p hand_tool_voltage_type:=3
8. 常见坑位速查表

| 现象 | 常见原因 | 处理 |
|---|---|---|
Failed to connect RM65-B |
机械臂 IP/端口不通,旧进程占用 | ping、socket 测试、杀旧进程 |
日志显示 protocol=RS485 |
忘传 arm_control_protocol:=canfd |
补参数 |
| 机械臂识别有数值但不动 | min_command_delta_m >= max_arm_target_delta_m |
设置 max_arm_target_delta_m:=0.012、min_command_delta_m:=0.002 |
CANFD 手报 os error 22 |
can0 不是 CANFD,mtu 不是 72 |
ip link set can0 type can ... fd on |
common_imports 找不到 |
没传强脑 SDK Python 路径 | 设置 hand_rs485_sdk_path |
/dev/ttyUSB0 读不到 Revo2 |
串口错、A/B 反、没共地、手仍接在 RM 末端 | 用 hand_rs485_port:=auto,检查 A/B/GND |
| raw-Modbus 能读 FC03 但 FC04 超时 | 实际位置读取不是必要步骤 | hand_raw_modbus_read_position_on_start:=false |
按 h 后回原位失败 |
还有运动命令在飞,控制器状态忙 | 单测时关 home_key_enabled,稳定后再开 |
9. 参数调优建议

9.1 机械臂更快
-p arm_command_interval_s:=0.04
-p arm_motion_unit_m:=0.002
-p max_arm_target_delta_m:=0.012
-p min_command_delta_m:=0.002
-p arm_mit_max_velocity_m_s:=0.45
-p arm_mit_max_accel_m_s2:=1.2
如果开始抖,就适当加大 arm_mit_kd 或降低 arm_mit_max_velocity_m_s。
9.2 灵巧手更快
-p hand_rs485_duration_ms:=40
-p hand_send_hz:=40
-p hand_smoothing:=0.90
-p hand_deadband:=1
如果误弯曲变多,不要急着怪手,先看识别图:多数时候是关键点在偷偷讲相声。
11. 最终结论

最稳的方案不是“所有设备挤一条通信链路”,而是:
- 机械臂用 CANFD,保证跟手丝滑。
- 灵巧手用强脑官方 RS485 SDK,独立串口,避免抢 RM_API。
- 视觉识别、MIT 滤波、手指防误触发一起上,少一点玄学,多一点工程。
这套架构的核心思想很朴素:让每个硬件走自己最舒服的路,别让它们在同一条窄桥上排队吵架。