截至 2026-06-28:🎉 抓取全流程实机跑通——
task-grasp --execute 完整完成 感知→抓→放(螺母放入黑框)。灵巧手 O6 手势已实机标定、抓取状态机就绪。
2026-06-28 全流程鲁棒性强化:多 seed IK 避别扭解支、下降"到位闸"修偶发空中抓取、
放置改关节插值防腕部翻转、J1 外摆抬高离桌、提速到 2.0、新增 USAGE.md 操作手册 + task-go 一键别名。
左臂 J2 电机仍待修(全程只用右臂)。
残留:手眼标定略有误差(已拆出独立微调旋钮补偿,根治须重标);现场相机非标定位置须重标手眼。
test_motion.py J2 wiggle(warn-only 不拦截)把 J2 从 +0.054 命令到 +0.254 → 堵转烧机。[-0.07, +3.20](不是 [-3.20,+0.07],那是右臂),+0.254 其实在量程内 → "正向越限"烧因不成立,烧因待重判。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 示例。
move_pose(末端到位姿)、to_table(右臂上桌:J2抬起→IK→分2a/2b落桌避撞)、go_home(桌上归家)、move_arm_roll/pitch/yaw(只调姿态,带万向锁保护)、move_arm_joint(单关节小步)。IK+逐关节限位+工作空间盒+非阻塞轮询到位+急停。dry-run 验证通过。
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。
perc-watch(venv) 持续检测写桥接文件 → object_markers.py(system) 发 3D 形状 marker(螺母绿盘/黑框蓝板/不可达橙+接近箭头, 肩心系) + 带框带坐标的图像话题 /perception/image(实时图上画框+name: x,y,z)。坐标走 2D 图规避 RViz 文字 marker 字间距问题。已接 rabo-rviz。
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。
scripts/task/grasp_task.py(task-grasp):状态机 感知→STAGE_READY(抬手避撞)→上方悬停→直线竖直下落→抓→提→放(高度自动回退)。从上方鲁棒接近:忽略不可靠感知 z、只用 XY、固定高度。task-grasp --execute 实机完整跑通螺母抓取并放入黑框。
move_pose_node.solve_ik_robust:7-DOF 冗余臂单 seed 易落别扭/不可达分支 → 主 seed→已知良好抓取姿(GRASP_REF_JOINTS)→冗余关节 J1/J3/J5 扰动,取首个在限位内的解。主 seed 成功零开销,仅失败时丰富搜索;所有调用方只增不减鲁棒性。
偶发:接近落到别扭关节角→竖直下降规划不出→却不校验到位就闭合手→空中抓空。两修:① _verify_reached 实测末端 FK 下降后硬到位闸(没到抓取高度即中止);② 接近改用 GRASP_REF_JOINTS 作 IK 主 seed → 落"掌心侧向下"好解支、竖直下降可规划。
黑框常在前伸近奇异区,笛卡尔 MoveL 竖直下落会中途翻腕→手腕突然抬高→落点偏。改 find_reachable_z 返回 (z, joints)+解支跳变闸(MAX_IK_JUMP 跳过翻腕分支),放置走关节插值到已校验解(单调不翻腕+轮询到位再松手)。抓取下降仍 linear 保竖直。
三处一致避蹭桌:to_table J2 抬起后 J1→1.0;task STAGE_READY J2 抬起后 J1→0.5;go_home 起手先 J1→1.57 再抬肩收臂、且末步拆成先 J1 归零再 J2 落肩(原 J1J2 同归零)。均带限位硬校验。
SPEED=ACCE=2.0(物理单位:关节 rad/s、笛卡尔 m/s;量程 0~20),J1 段单独限速 1.6。go_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-up→task-grasp(干跑校验)→task-go(实走)→rabo-down 一条龙,含逐窗就绪标志 + 故障速查表 + 抓取偏移微调指引。task-go=task-grasp --execute --enable --yes 一键实走。
ros2_ws,全部移入 ~/competition-ws/。datasets/nut_v2 201 张。docs/arm_control.md 各控制接口用法。[-0.07,+3.20]/右 [-3.20,+0.07],旧文档左右写反;烧因待重判。/perception/image(带框带坐标);坐标改走 2D 图(规避 RViz 文字 marker 字间距坑)。(-1.206,0.003,1.569) 作腕部目标朝向基准。句柄 id>0 = 成功,但代码里 "Connected" / "Failed to connect to LBot" 两条日志印反了。
Failed to connect to LBot 不代表没连上,以 joint_states 是否 50Hz 出数为准。robot1(/robot1/left_arm/...);Pi 路径 B 是 /left /right。早期漏掉前缀会误以为没数据。Left_Shoulder_Pitch_Joint …),与 URDF 的 arm_left_L*_Joint 不同。[-0.07,+3.20](抬起+1.57) / 右臂 [-3.20,+0.07](抬起-1.57)。限位必须硬拦截、只发相对小位移、贴限位禁朝该向动。用 arm_mover(已带逐关节限位校验)。set_emergency_stop 不抢占进行中的运动(返回值只表示"指令已发");move_joint block:true 即便走到位也可能返回 false(不可信,判到位读 joint_states)。硬急停以物理按钮为准。color frame is not decoded。已固定 640×480 RGB888;内参随分辨率变。arm_mover 低速真机验证(有人值守物理急停):先跑 --dry-run,确认软件急停能停(连续模式 best-effort / 分段模式段内停)。scripts/handeye/hand_eye_result.yaml)。T_base_camera 转肩心系 → 工作空间盒预检 + arm-movepose 命令 + RViz 可视化)。详见 docs/perception_integration.md、scripts/perception/README.md。grasp_task 状态机;task-grasp --execute 实机跑通 视觉→抓→放(螺母放入黑框)。GRASP_X/Y_CORRECTION、PLACE_Y_CORRECTION)经验补偿;根治须重做/精化手眼标定(相机要在实际使用位置标)。arm_mover,先 --dry-run:它已带 IK + 逐关节限位硬校验 + 工作空间盒,越限即整段拒绝。0.2 起;首跑务必先干跑看计划,再低速执行。set_emergency_stop 不抢占进行中的运动;连续模式靠就地刹停尝试、分段模式靠段内停。务必有人值守物理急停。