6edb8d39ab
在开始'设备契约层 + 目录重构 + 通止规装配'改造之前,先钉住当前可运行状态, 使后续任何删除/重构都可回退。 本基线包含: - 现有 ROS 2 工作区全部源码(arm_application / arm_control / arm_bringup 等) - 官方 flexiv_ros2 栈(含 flexiv_hardware / flexiv_controllers 等符号链接) - 设备契约层 src/arm_interfaces(新增,46 项单测通过) - devices/ 设备选型与品牌清单(新增) - scripts/gen_site_example.py 与由它生成的 config/site.example.yaml 按 .gitignore 排除:build/ / install/ / log/ / config/site.yaml / 模型权重二进制。
4.6 KiB
4.6 KiB
devices/sensors/orisys/ —— Orisys 视触觉(框架核心)
这是整个框架的核心。 后续所有 ROS 2 项目都会围绕它开发,它也会持续迭代优化更新, 所以它单独占一个文件夹,不与其它传感器混放。
先搞清楚它输出什么
这是上层算法真正依赖的数据契约。注意单位与坐标系的定义,这是最容易出错的地方。
| 数据 | 维度 | 说明 | 框架内部话题 |
|---|---|---|---|
| 切向力 1 | 标量 | 任意单位(非牛顿),且基线会漂移 | ~/tangential_1 |
| 切向力 2 | 标量 | 同上,另一正交方向 | ~/tangential_2 |
| 法向力 | 标量 | 同上 | ~/normal |
| 深度图 | 图像 | 接触面深度 | ~/depth |
| 力矢量图 | 图像 | 接触点的力矢量可视化 | ~/force_vector |
两个必须记住的坑
1. 力是任意单位,不是牛顿。 现有 site.yaml 里所有力阈值(touch_delta、press_delta、
safe_press_delta 等)全部是「相对静止均值的增量」,不是绝对值。节点启动后会先自动测基线。
改阈值时改的也是增量,不是绝对读数。
2. 基线会漂移,所以阈值必须相对化。 写任何新的力判据时,不允许直接比较绝对读数。
3. 切向力的 X / Y 通道归属尚未确认。 通止规装配里「接触到面时某一路切向力突变」「拧紧判定时 某一路切向力超阈值」都需要知道是哪个通道。在确认之前,框架按两个切向通道都监控、任一满足即判定 来实现,避免猜错通道导致整段流程静默失效。确认后会把配置项收敛为指定通道。
厂商物料放置要求
| 项 | 要求 |
|---|---|
| SDK 格式 | 厂商原始发布格式,不要转换、不要重新打包 |
| SDK 命名 | 保持厂商原目录名与文件名,一律不要改名。SDK 内部常按自己包名做导入与资源查找 |
| SDK 版本 | 在 manifest.yaml 的 version 记录,并写进 docs/CHANGELOG_ORISYS.md |
| 型号配置 | 每个型号一份配置放 models/<型号名>/,不要混在一起 |
| 相机路径 | 必须用 /dev/v4l/by-path/ 稳定路径,不要写 /dev/video0 —— video 编号会随插拔漂移,这是现有框架已经踩过的坑 |
| 生效 | 放好 SDK → pip install -e 或加进 PYTHONPATH → 改 registry.yaml 选 orisys → 改 site.yaml 的 tactile.models.<型号> → 重启 scripts/run_tactile.sh |
目录结构
sensors/orisys/
├── README.md # 本文件
├── manifest.yaml # 型号清单 + 能力 + 配置项声明
├── sdk/ # ★ 厂商 SDK 原样放置
│ └── README.md # 放进来之后怎么让它生效(见下)
├── models/ # ★ 多个传感器型号
│ ├── README.md
│ └── <型号名>/ # 每个型号一份配置
│ └── config.json
└── driver/ # 适配器:统一成上面的数据契约
多型号怎么切换
传感器有多个型号,切换只改两处,不改任何代码:
devices/registry.yaml→sensors: orisys(选厂商,通常不用改)config/site.yaml→tactile.model: "<型号名>",指向models/<型号名>/config.json
型号之间的差异(通道数、内参、标定参数、拼接参数)全部由 models/<型号名>/ 承载。
上层只订阅统一话题,换型号不影响上层代码。
当前状态(迁移参考)
| 现有位置 | 内容 | 迁移去向 |
|---|---|---|
src/arm_application/arm_application/orisys_tactile.py |
SDK 适配 + 多进程 worker + load_orisys_from_site |
driver/ |
src/arm_application/arm_application/tactile_node.py |
ROS 节点,双指各一个进程 | driver/ |
src/arm_application/arm_application/tactile_cli.py |
读数量级 CLI(调试阈值用) | 保留为调试工具 |
src/arm_application/arm_application/tactile_interface.py |
数据类 | driver/,其中的 MockTactile 类已死,P2 删除 |
src/arm_application/config/orisys/dd03.json |
当前型号 dd03 的厂商配置 | models/dd03/config.json |
已解决的历史坑,迁移时必须保留这些做法:
- 左右指各起一个独立进程,不要合并成一个进程双路并行 —— 会抢 CUDA 上下文互相拖慢。
tactile.cuda保持false,infer_backend用cpu。- 退出时残留的孤儿 worker 会占死
/dev/video,run_tactile.sh里那段pkill清理必须保留。