5.0 KiB
FFG 左手套 → L20 左手 ROS 2 工作区
Ubuntu / ROS 2 Jazzy 下,通过 Type-C Linker FFG 左手套控制 CAN L20 左手。
本项目所测 L20 使用 SDK 的 G20 协议及 g20 映射,不能据此推广到所有 L20。
当前状态
- 已验证手套读取、个人标定、左手 CAN 版本/位置查询。
- 操作者已确认 ±10 单位试运行、50% 映射、100% 映射、加速跟随档正常。
- 五指触觉矩阵完整,接触响应及移开归零已验证。
- 操作者已确认低速软物抓取/释放正常。
- 非零手套力反馈未开启、未验证。 协议力值单位、安全上限、释放及断连卸力机制尚待厂家确认。
仓库布局
src/linker_hand_ros2_sdk/:本地修改的硬件 SDK;trial_guard.py为试运行限幅/缓变/超时策略。src/linkerhand_retarget/:手套采集、标定、位置映射及模型资产。src/Linkerbot_URDF/:固定提交的上游 Git 子模块。- 主仓库 STL 网格由 Git LFS 管理;克隆后必须下载实际资产,不能用 LFS 指针文件替代网格。
tools/ffg_trial.sh:隔离 ROS 域的测试入口;勿用原 SDK 默认启动替代。tools/check_*readonly.py:只读诊断;tools/test_trial_guard.py:无硬件策略测试。diagnostics/、个人标定、原始手册及构建目录仅留本地,不纳入版本控制。
克隆和安装
sudo apt install git-lfs
git lfs install
git clone --recurse-submodules https://gitea.robotquan.com/chenlin/ros2_ws.git
cd ros2_ws
git lfs pull
# 已安装并配置 ROS 2 Jazzy 的 Ubuntu 环境
sudo apt install python3-colcon-common-extensions python3-venv can-utils acl
source /opt/ros/jazzy/setup.bash
/usr/bin/python3 -m venv --system-site-packages .venv
touch .venv/COLCON_IGNORE
.venv/bin/pip install -r requirements.txt
.venv/bin/python -m colcon build --symlink-install \
--packages-select linker_hand_ros2_sdk linkerhand_retarget
requirements-tested.txt 记录本机直接依赖版本,可用 pip install -r requirements-tested.txt 复现 Python 版本组合;它不是 OS/ROS 的完整锁文件。本工作区依赖系统 ROS,不能使用完全隔离、不含系统包的 venv。SDK 与 retarget 需分进程运行,上游顶层 utils 导入存在冲突。
硬件准备(本机已验证配置)
- FFG 左手:
/dev/ttyUSB0,2,000,000 baud,固件 2.1.4。 - PCAN-USB:
can0,1 Mbps,左手标准 CAN ID0x28。 - 机械手独立供电;清空夹持区,准备物理断电手段。
sudo setfacl -m u:$USER:rw /dev/ttyUSB0
# can0 已启用且 bitrate 正确时无需重复设置
sudo ip link set can0 up type can bitrate 1000000
ip -details -statistics link show can0
重新插拔串口后 ACL 可能失效。不要在 YAML 中保存 sudo 密码。
新操作者必须重新标定
仓库不包含本地操作者标定。保持硬件 SDK 退出:
source /opt/ros/jazzy/setup.bash
source install/setup.bash
ROS_DOMAIN_ID=73 ros2 run linkerhand_retarget handretarget --ros-args \
-p calibration:=true -p ports:='["/dev/ttyUSB0"]' -p baudrate:=2000000
按程序完成张手、O 姿态、握拳流程,退出标定后再启动控制。结果保存于
src/linkerhand_retarget/linkerhand_retarget/motion/linkerforce/tmp/jointangle_data.tmp,该目录已忽略。
日常测试入口
终端 1:
bash tools/ffg_trial.sh glove
终端 2(只能运行一个机械手控制进程):
bash tools/ffg_trial.sh hand # 小幅验证,输入 ARM
# 逐档确认正常、Ctrl+C 退出上一档后,才能使用下一档:
bash tools/ffg_trial.sh half # 输入 ARM50
bash tools/ffg_trial.sh full # 输入 ARM100
bash tools/ffg_trial.sh follow # 输入 FOLLOW
| 档位 | 位置目标 | 电机速度数值 | 目标缓变上限 |
|---|---|---|---|
| hand | 相对第一帧手套姿态的变化,限制为硬件启动位置 ±10 单位 | 30 | 10 单位/秒 |
| half | 硬件启动位置 + 0.5 ×(手套映射目标 − 硬件启动位置) | 30 | 10 单位/秒 |
| full | 完整标定位置映射 | 30 | 10 单位/秒 |
| follow | 完整标定位置映射 | 60 | 60 单位/秒 |
位置/速度为 SDK 编码值,不是角度、物理速度或力。50% 指映射跨度,不是机械关节可用角度的一半。所有档位跳过默认启动姿态;收到手套目标后仍可能立即开始运动。脚本使用 ROS 域 74、仅本机发现及专用命令话题。
只读触觉检查和离线测试
退出硬件 SDK 后:
.venv/bin/python tools/check_hand_touch_readonly.py --duration 30
.venv/bin/python tools/test_trial_guard.py
触觉工具只查询 type-2 的 12×6 矩阵,缺帧不会复用旧矩阵;结果落在忽略的 diagnostics/。
限速不等于限力;停止发目标不等于急停。 初次/重新标定后从小幅空载开始,软物抓放使用 full 慢速档,不把人体放入夹持区。发生异常立即物理断电。