883ed6b0b9
新增包
- arm_kinematics:从 arm_application 提取几何雅可比 + DLS 逆解(纯 numpy)。
它被应用层和驱动层共用,留在应用层会让驱动反向依赖应用层。
arm_application/geom_ik.py 改为 re-export shim,现有 import 一行未改。
- arm_driver_flexiv:非夕驱动适配器。只补 manifest 声明而现有节点缺失的接口
(/home /enable /clear_fault /switch_tool /soft_drag /compliant_descent),
已有能力不重复实现。RDK 访问经 rdk_py310 下的长驻桥,本包不 import flexivrdk。
新接口
- arm_msgs/SwitchTool.srv、arm_msgs/CompliantDescent.action
- 合并 capabilities 里语义重复的 set_tool / switch_tool
修复(都是只在真机上暴露、且难以定位的问题)
- rdk_client 会永久挂死:select 的"可读"不等于"有完整一行",readline 遇到
半行 JSON 会一直阻塞等换行符,超时机制完全失效。改用 os.read + 自己做行缓冲。
- CompliantDescent 行程少一步:descended + step > max 在浮点累加下会提前跳出,
永远到不了标称行程。改用整数步数计数。
- CompliantDescentRunner 的 TF frame 退化成 _base_link:没继承节点已解析的 SN。
- resolve_orisys_config 仍指向旧路径;load_orisys_from_site 读的是旧键 config。
触觉四路数据打通
- 深度图 / 力矢量场原先被 tactile_worker 有意丢弃(注释写"图像不过队列"),
从未发布到 ROS。新增 image_utils(数组→Image,编码自动判定)、独立的图像
队列(maxsize=1 满则丢旧)与 /tactile/<side>/{image,vector}。
默认关闭(tactile.image_hz=0),开启也不影响三力的 30fps 时序。
- mock 后端也会发图像,无硬件即可验证整条发布链路。
配置
- site.yaml 新增 tactile.image_hz;移除与 model 重复的旧键 tactile.config
- 型号配置从 src/arm_application/config/orisys/ 迁到
devices/sensors/orisys/models/dd03/(随 SDK 一起放)
测试:198 个(原 139)
- arm_kinematics 24(雅可比/逆解的解析算例与不变量)
- arm_driver_flexiv 69(下压状态机 34 + RDK 协议层 35)
- arm_application 59(图像打包 36 + 矢量场探测 23)
devices/robots/ —— 机械臂
厂商物料放置要求
每个品牌一个子目录,物料放在该子目录下的 rdk/(或厂商自定的物料目录,须在 manifest.yaml
的 assets 里声明)。
通用要求:
| 项 | 要求 |
|---|---|
| 格式 | 厂商原始发布格式,不要自行转换、不要重新打包成 zip/tar 后不展开 |
| 命名 | 保持厂商原目录名和原文件名,一律不要改名。改名会导致 RDK 内部的 include 路径、CMake 查找路径、Python 包名全部失效 |
| 版本 | 在 manifest.yaml 的 version 字段里记录版本号,方便日后排查 |
| 编译产物 | 不要把编译产物(.a .so build/)提交进 git;离线库放 vendor/ |
| 生效 | 放好物料 → 编译一次 → 改 devices/registry.yaml 选型 → 重启 scripts/run_real.sh |
目录结构
robots/
├── README.md
├── flexiv/ # 非夕(当前在用)
│ ├── manifest.yaml
│ ├── rdk/ # 厂商 RDK 源码或安装包,原样放置
│ └── driver/ # 适配器:把 RDK API 翻译成框架接口
└── <新品牌>/
├── manifest.yaml
├── rdk/ 或 sdk/
└── driver/
适配器必须实现的接口契约
框架上层(伺服、跟踪、装配状态机、手眼标定)只调用下面这组接口,不认识任何厂商 SDK。
契约定义在 src/arm_interfaces/,每个方法对应的 ROS 2 话题/服务/action 也在那里声明。
| 能力 | 用途 | 谁在用 |
|---|---|---|
get_arm_state |
读关节角 + 末端位姿 | 手眼标定、状态记录 |
follow_joint_trajectory |
关节轨迹(点到点、多路点) | 手眼标定走点、装配移动 |
servo_joint |
高频关节伺服 | 视觉伺服 servo_node |
servo_cartesian |
笛卡尔位姿伺服 | 跟踪、悬停 |
compliant_descent |
柔顺下臂(接触力约束) | 装配接触阶段 |
set_tool / switch_tool |
设置/切换工具坐标系(如 tool1) | 全局工具系锁定 |
home |
回到初始位姿 | 每个循环开始、异常复位 |
enable / clear_fault |
使能、清故障 | 启动自检、异常恢复 |
缺哪个能力就在 manifest 的 capabilities 里不写哪个,框架启动时会检查上层要用的能力是否都被支持,
不支持就明确报错,而不是运行时莫名其妙失败。
当前状态(迁移参考)
非夕臂的现有实现分散在这些地方,P1 之后会收敛到 flexiv/driver/ 下:
- 硬件接口:
src/flexiv_hardware/(ros2_control 插件,上游官方) - bringup:
src/arm_bringup/stack.launch.py的backend:=real分支 - 轨迹适配:
src/arm_control/arm_control/real_trajectory_adapter.py - 几何 IK 与手眼加载:
src/arm_application/arm_application/geom_ik.py - 软拖拽:
scripts/rdk_drag_bridge.py - 工具系切换:
scripts/rdk_switch_tool.py