111 lines
5.0 KiB
Markdown
111 lines
5.0 KiB
Markdown
# FFG 左手套 → L20 左手 ROS 2 工作区
|
||
|
||
Ubuntu / ROS 2 Jazzy 下,通过 Type-C Linker FFG 左手套控制 CAN L20 左手。
|
||
**本项目所测 L20 使用 SDK 的 `G20` 协议及 `g20` 映射,不能据此推广到所有 L20。**
|
||
|
||
## 当前状态
|
||
|
||
- 已验证手套读取、个人标定、左手 CAN 版本/位置查询。
|
||
- 操作者已确认 ±10 单位试运行、50% 映射、100% 映射、加速跟随档正常。
|
||
- 五指触觉矩阵完整,接触响应及移开归零已验证。
|
||
- 操作者已确认低速软物抓取/释放正常。
|
||
- **非零手套力反馈未开启、未验证。** 协议力值单位、安全上限、释放及断连卸力机制尚待厂家确认。
|
||
|
||
详情:[进度记录](docs/PROGRESS.md)、[安全边界](docs/SAFETY.md)、[源码来源](docs/UPSTREAM.md)。
|
||
|
||
## 仓库布局
|
||
|
||
- `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/`、个人标定、原始手册及构建目录仅留本地,不纳入版本控制。
|
||
|
||
## 克隆和安装
|
||
|
||
```bash
|
||
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 ID `0x28`。
|
||
- 机械手独立供电;清空夹持区,准备物理断电手段。
|
||
|
||
```bash
|
||
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 退出:
|
||
|
||
```bash
|
||
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
|
||
bash tools/ffg_trial.sh glove
|
||
```
|
||
|
||
终端 2(只能运行一个机械手控制进程):
|
||
```bash
|
||
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 后:
|
||
```bash
|
||
.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` 慢速档,不把人体放入夹持区。发生异常立即物理断电。
|