Progress

进度与坑点

截至 2026-06-28🎉 抓取全流程实机跑通—— task-grasp --execute 完整完成 感知→抓→放(螺母放入黑框)。灵巧手 O6 手势已实机标定、抓取状态机就绪。 2026-06-28 全流程鲁棒性强化:多 seed IK 避别扭解支、下降"到位闸"修偶发空中抓取、 放置改关节插值防腕部翻转、J1 外摆抬高离桌、提速到 2.0、新增 USAGE.md 操作手册 + task-go 一键别名。 左臂 J2 电机仍待修(全程只用右臂)。
残留:手眼标定略有误差(已拆出独立微调旋钮补偿,根治须重标);现场相机非标定位置须重标手眼。

🔴 事故复盘(2026-06-26):左臂 J2 电机烧毁(仍待修/换)
  • 命令:旧 test_motion.py J2 wiggle(warn-only 不拦截)把 J2 从 +0.054 命令到 +0.254 → 堵转烧机。
  • ⚠️ 2026-06-27 修正:原以为"超 +0.07 上限",但实机实测左臂 J2 限位是 [-0.07, +3.20](不是 [-3.20,+0.07],那是右臂),+0.254 其实在量程内 → "正向越限"烧因不成立,烧因待重判
  • 教训仍成立:限位必须硬拦截(绝不 warn-only)、只发相对小位移、关节贴近限位禁朝该向动。
  • 已落地:新增 arm_mover 包取代 test_motion.py——IK + 逐关节限位校验 + 工作空间盒 + 非阻塞 move 轮询到位 + 按键/Ctrl+C 急停。

已完成

完成

开发环境

编译 ros2_ws(7 包)、Orbbec ROS2 驱动 + udev、pyorbbecsdk2 venv、RJ45 静态网络、目录统一到 competition-ws。

完成

机械臂连通可控

左右臂 50Hz 状态;全套运动/运动学/使能/急停/工具坐标系服务可用。

完成

相机跑通

Gemini2 本地 RGB-D + 点云 ~30Hz;修复厂商 launch 语法 bug。

完成

文档与标定方案

docs 汇总发现 + 完整接口清单 + eye-to-hand 标定方案。

完成

识别数据集采集

collect_dataset.py 采 RGB+对齐深度;datasets/nut_v2 201 张(斜视、螺母移动)。标注交队友。

完成

手眼标定 ✅ 已标定

eye-to-hand 实机标定成功:T_base_camera 平移 (0.078, -0.001, 0.205) m,残差 σ=6.7mm / 旋转 1.1°(PARK,四法一致,17 帧剔 1 离群,距手测仅 5.7cm)。新 he-live(实时反馈+门控)、he-solve(先验闸+自动剔离群)。板 4×5/DICT_5X5_100/15mm。

完成

控制方法文档

docs/arm_control.md:坐标系/关节布局已验证 + move_joint/pose/linear、FK/IK、使能/急停、L6 手、工具系,全带可复制 ros2 service call 示例。

完成

arm_mover 安全运动包

move_pose(末端到位姿)、to_table(右臂上桌:J2抬起→IK→分2a/2b落桌避撞)、go_home(桌上归家)、move_arm_roll/pitch/yaw(只调姿态,带万向锁保护)、move_arm_joint(单关节小步)。IK+逐关节限位+工作空间盒+非阻塞轮询到位+急停。dry-run 验证通过。

完成

RViz 任务可视化

rabo-rviz:双臂+O6 模型实时摆姿 + 标定相机 + 点云 + 彩色图。修了两处帧/符号坑:相机挂**肩心系**(两臂J1中点,非 base_torso_root)、右臂 **J2/J3/J5/J7 符号镜像修正**(实测 FK 对齐 pose_states)。

队友交付

螺母检测 / 定位

队友 YOLOv8-seg 检测 螺母 + 黑框(v2 mAP50 0.995) → 相机系 6D 位姿(螺母实体环深度避中空孔/桌面法向定 approach;黑框 ROI+四角点)。帧/内参与本仓库手眼完全一致

完成

感知集成(检测→抓取坐标)

scripts/perception/:venv 装 torch-cpu+ultralytics;handeye_tf 读手眼外参把相机系位姿转肩心系locate.py 复用队友检测 → 肩心系 6D 位姿 + arm_mover 工作空间盒预检 → 输出现成 arm-movepose --dry-run。离线 nut_v2 全链路跑通、越界正确判出盒。别名 perc-locate/perc-watch

完成

RViz 螺母/黑框 3D 可视化

perc-watch(venv) 持续检测写桥接文件 → object_markers.py(system) 发 3D 形状 marker(螺母绿盘/黑框蓝板/不可达橙+接近箭头, 肩心系) + 带框带坐标的图像话题 /perception/image(实时图上画框+name: x,y,z)。坐标走 2D 图规避 RViz 文字 marker 字间距问题。已接 rabo-rviz

完成

灵巧手 O6 控制 wrapper

scripts/hand/(hand-o6):封 L6 话题 + 命名手势 + 调参 CLI(test/ramp/gesture)。实机标定方向:大值=张开、小值=闭合(纠正厂商文档);端点 open=245/grasp=50。hand-serve 常驻 + hand-cmd grasp/release 命令接口。

完成

标准抓取姿态标定

右臂"掌心侧向下"标准姿态 euler (-1.206, 0.003, 1.569)(实机标定)——整条抓取的腕部目标朝向基准。详见 docs/arm_control.md §5.1

完成 🎉

抓取全流程编排(task 状态机)

scripts/task/grasp_task.py(task-grasp):状态机 感知→STAGE_READY(抬手避撞)→上方悬停→直线竖直下落→抓→提→放(高度自动回退)。从上方鲁棒接近:忽略不可靠感知 z、只用 XY、固定高度。task-grasp --execute 实机完整跑通螺母抓取并放入黑框

🛠️ 2026-06-28 鲁棒性强化 + 提速

完成

多 seed IK(避别扭解支)

move_pose_node.solve_ik_robust:7-DOF 冗余臂单 seed 易落别扭/不可达分支 → 主 seed→已知良好抓取姿(GRASP_REF_JOINTS)→冗余关节 J1/J3/J5 扰动,取首个在限位内的解。主 seed 成功零开销,仅失败时丰富搜索;所有调用方只增不减鲁棒性。

完成

🐞 修"空中抓取"bug

偶发:接近落到别扭关节角→竖直下降规划不出→却不校验到位就闭合手→空中抓空。两修:① _verify_reached 实测末端 FK 下降后硬到位闸(没到抓取高度即中止);② 接近改用 GRASP_REF_JOINTS 作 IK 主 seed → 落"掌心侧向下"好解支、竖直下降可规划。

完成

放置改关节插值(防腕部翻转)

黑框常在前伸近奇异区,笛卡尔 MoveL 竖直下落会中途翻腕→手腕突然抬高→落点偏。改 find_reachable_z 返回 (z, joints)+解支跳变闸(MAX_IK_JUMP 跳过翻腕分支),放置走关节插值到已校验解(单调不翻腕+轮询到位再松手)。抓取下降仍 linear 保竖直。

完成

J1 外摆抬高离桌

三处一致避蹭桌:to_table J2 抬起后 J1→1.0;task STAGE_READY J2 抬起后 J1→0.5;go_home 起手先 J1→1.57 再抬肩收臂、且末步拆成先 J1 归零再 J2 落肩(原 J1J2 同归零)。均带限位硬校验。

完成

全流程提速到 2.0

SPEED=ACCE=2.0(物理单位:关节 rad/s、笛卡尔 m/s;量程 0~20),J1 段单独限速 1.6go_home 默认也提到 2.0。⚠️ J2(烧毁过、margin 0 无缓冲)也按此速动 → 物理急停值守,觉得猛就调回 grasp_task.py 的 SPEED/ACCE。

完成

抓取/放置微调旋钮拆分

便于分别校准(根偏仍是手眼误差):GRASP_X_CORRECTION(抓取前后)、GRASP_Y_CORRECTION(抓取左右)、PLACE_Y_CORRECTION(放置左右),与共享 TCP 几何 GRASP_XY_OFFSET 分开;wrist_above 加 x_corr/y_corr 形参。

完成

📖 现场操作手册 + 一键别名

USAGE.md:前置检查→rabo-uptask-grasp(干跑校验)→task-go(实走)→rabo-down 一条龙,含逐窗就绪标志 + 故障速查表 + 抓取偏移微调指引。task-go=task-grasp --execute --enable --yes 一键实走。

时间线

环境搭建 — git/构建工具、ros2_ws 编译、Orbbec 驱动、venv、RJ45 静态网络。
目录整理 — 合并工作空间为 ros2_ws,全部移入 ~/competition-ws/
机器人连通 — 确认经 lbot API(UDP 8888)已连接;澄清"连接失败"实为日志写反。
相机本地化 — 相机改插开发机,本地驱动跑通 RGB-D + 点云。
相机选型 — 固定式 eye-to-hand(俯视/斜视,优于手腕安装;最终角度待锁定)。
数据采集 — collect_dataset.py 采 RGB+对齐深度;datasets/nut_v2 201 张。
标定工具 — ChArUco 生成/采集/求解脚本,离线自测通过。
文档化 — docs/ + 本看板 + bash 别名。
控制方法成文 — 验证坐标系/关节轴向与限位;docs/arm_control.md 各控制接口用法。
🔴 J2 电机烧毁 — 旧脚本 warn-only 越限堵转(2026-06-26)。
相机彩色固定 RGB888 — 默认 MJPG 在 x86 无硬解、订阅 color 偶发解码刷屏;改 640×480 RGB888 直通规避。
J2 限位左右镜像修正 — 实机实测右臂抬起 -1.57;左 [-0.07,+3.20]/右 [-3.20,+0.07],旧文档左右写反;烧因待重判。
arm_mover 安全运动包 — move_pose / to_table / go_home;非阻塞 move+轮询到位、三管齐下急停;dry-run 通过。
感知集成 — venv 装 torch-cpu+ultralytics;队友检测 → 手眼外参转肩心系 → 工作空间盒预检 → arm-movepose 命令;离线 nut_v2 跑通。
RViz 螺母/黑框可视化 — perc-watch 持续检测 → 3D 形状 marker + /perception/image(带框带坐标);坐标改走 2D 图(规避 RViz 文字 marker 字间距坑)。
灵巧手 O6 标定 — L6 话题 wrapper(hand-o6);实机定方向(大值=张开)+端点+命令接口(hand-serve/hand-cmd)。
标准抓取姿态 — 实机标定右臂掌心侧向下 euler (-1.206,0.003,1.569) 作腕部目标朝向基准。
🎉 抓取全流程跑通 — task-grasp 状态机(staging→上方接近→直线下落→抓→放),实机完整抓螺母放入黑框(2026-06-27)。
鲁棒性强化 + 提速(2026-06-28) — 多 seed IK 避别扭解支、下降"到位闸"修空中抓取、放置改关节插值防翻腕、J1 外摆抬高离桌、提速 2.0(J1 限 1.6);新增 USAGE.md 操作手册 + task-go 一键别名。

⚠️ 关键坑点(务必记住)

驱动"连接成功"日志被写反(厂商 bug)。 头文件定义 句柄 id>0 = 成功,但代码里 "Connected" / "Failed to connect to LBot" 两条日志印反了。
看到 Failed to connect to LBot 不代表没连上,以 joint_states 是否 50Hz 出数为准。

下一步 TODO

🛟 安全(J2 事故后更新,宁紧勿松)

运动铁律:
  • arm_mover,先 --dry-run:它已带 IK + 逐关节限位硬校验 + 工作空间盒,越限即整段拒绝。
  • speed/acce 从 0.2 起;首跑务必先干跑看计划,再低速执行。
  • 物理急停按钮才是硬急停:软件急停(按键/Ctrl+C)是 best-effort——固件 set_emergency_stop 不抢占进行中的运动;连续模式靠就地刹停尝试、分段模式靠段内停。务必有人值守物理急停。
  • 关节贴近限位时禁朝该向动(尤其 J2);左臂 J2 抬起方向尚待实测确认。
先在无物体且远离桌面处验证轨迹、先 dry-run 确认 IK/限位通过再执行真实动作。