把"抓取"拆回六个原理:坐标系与 TF → 正运动学 → 逆运动学 → 轨迹与分步移动 → 六阶段抓取(3D)→ 视觉定位。每个模块 = 一句原理 + 一个讲义真实案例 + 一台可拖可调的交互演示;数学概念(坐标变换、运动学、轨迹插值)全部配交互式图示,滑块一动、数值与图形同步变。3D 部分基于 three.js 本地渲染,离线可用。
下表即本补充内容的结构化大纲;每行可点击跳入对应模块,"衔接"列指回 7 个实验页的真实章节锚点。
| 模块 | 教学目标 | 对应案例(讲义出处) | 可视化 / 交互方案 | 与现有教程衔接 |
|---|---|---|---|---|
| M1 坐标系与 TF 变换 | 同一空间点在 base_link 与相机光学系下的两套读数互换;理解 4×4 齐次变换"乘点"与 REP-103 轴向差异 | EXP-07 视觉链:相机系点 (0,0,0.5) → base_link (0.55,0,0.40)(讲义·实验7 步骤4);EXP-06 set_pick_target 必须写 frame_id='base_link'(实验6 步骤1) | TF 树路径高亮 + 源/目标系查询;外参滑块(平移 t_x/t_z、俯仰 γ)驱动双面板(俯视+侧视)实时重投影;旋转矩阵数值联动 | EXP-01 §TF 链与角色 · EXP-06 §实操 |
| M2 正运动学 FK | "关节角 → 末端坐标"的确定性映射;会用 2R 平面模型手算并与代码互验;理解 PWM↔rad 换算 | EXP-02/05 安全红线"抓取前先预演":pwm_to_fk_demo 输入五路 PWM 2150/1200/2200/2275/1500(讲义·实验5 步骤2) | 5 路 PWM 滑块(500~2500)→ 实时换算弧度 → 双视图(俯视 x-y、侧视 r-z)画连杆;公式逐项高亮联动 | EXP-03 §FK 试算台 · EXP-03 §实操 |
| M3 逆运动学 IK | 三段式解析思路(q1 指向 → 2R 余弦定理 → pitch 补偿);多解(肘上/肘下)与不可达判定;闭环验证意识 | EXP-06 固定抓取目标 (0.28, 0, 0.10)、pitch=180° 即四元数 {0,1,0,0}(讲义·实验6 步骤1) | 侧视工作平面内拖拽目标点 → 实时解出 θ1/θ2/θ3 与余弦定理代入过程;肘上/下切换;一键"喂回 FK"闭环测毫米误差;附 DLS 阻尼 λ 迭代动画 | EXP-03 §动画 · EXP-04 §实操 |
| M4 轨迹与分步移动 | 理解"为什么不能一步到位":插值、限位、PWM 安全边界;看懂 _move_stepwise 的 40%/60% 分段逻辑 | EXP-06 分步移动:J1 偏转 >0.05 rad 时先单动 J1(40% 时长)再动 J2–J5(60%)(讲义·实验6 知识点 6.1.3);EXP-05 YAML 逐行回放同理 | q(t) 曲线可调:起点/终点/总时长/分段开关/平滑度/限位开关;t 指针播放 + 侧视小棒人同步;PWM 越界实时红警 | EXP-05 §回放实操 · EXP-06 §六阶段动画 |
| M5 六阶段抓取 · 3D | 以 three.js 观察机械臂结构、运动姿态与完整抓取过程;把 gripper_depth / pre_grasp_height 的语义变成"看得见的位置" | EXP-06 _execute_pick 六步:开爪 → 移到 z+pre_h → 下探 z−gripper_depth → 合爪 → 退回 z+pre_h → 移到 post_grasp_pose(讲义·实验6 知识点 6.3.2),目标 (0.28,0,0.10)、放置点 (0.059,0.074,0.219) | three.js 3D 视口(可旋转缩放):结构模式下 3 关节滑块调姿态 + TF 三色轴开关;抓取模式下六阶段按钮/自动播放 + 参数滑块(gripper_depth、pre_grasp_height、目标点)实时重算 IK 并动画执行,附 TCP 读数与坐标四元数 | EXP-06 §参数调优台 · EXP-06 §实操 · EXP-01 §URDF 联动 |
| M6 视觉定位 | 掌握抓取链的"眼睛":HSV 为什么抗光照、阈值怎么调;针孔反投影从 (u,v,d) 到 (X,Y,Z);再经 TF 换算给 IK | EXP-07 全链路:红色两段 HSV 阈值 (0,100,80)~(15,255,255)∪(160,100,80)~(180,255,255)、fx=fy=614/cx=320/cy=240、深度 uint16 mm÷1000、性能基线成功率 >85%(讲义·实验7 步骤2/3 与步骤12) | 合成场景实时 HSV 掩膜(H/S/V 双段滑块 + 质心拾取)→ 深度 d、焦距 fx 滑块 + 点击像素 → 反投影相机系 → 一键 TF 到 base_link,俯视图画目标点 | EXP-07 §HSV 调参台 · EXP-07 §三乐章动画 |
教学目标:① 说清 base_link 与 camera_depth_optical_frame 的轴向差异(REP-103);② 会读 4×4 齐次变换并手动"乘"一个点;③ 明白抓取链里为什么视觉算出的点必须先 transform 到 base_link 才能喂给 IK。
(0, 0, 0.5);而抓取 IK 只认 base_link,经过 TF 变换后同一个点变成 (0.55, 0, 0.40)。帧链:map → odom → base_link → link1…link5 → tcp_link → camera_depth_optical_frame(相机在腕末端——眼在手)。
出处:EXP005_lab_guide.md 实验7 · transform_to_base_link() / tf_buffer.transform();实验6 步骤1:set_pick_target 消息必须写 frame_id:'base_link'。
(A→B) 与 (B→A) 永远互逆,点换来换去总能量得回同毫米。教学目标:① 建立"关节角 → 末端坐标"是唯一确定的正向映射这一直觉;② 会用 2R 平面模型手算 TCP 并与代码互验;③ 把 PWM↔弧度换算 rad=(PWM−1500)×0.002356 变成肌肉记忆。
pwm_to_fk_demo.py 喂入五路脉宽 2150 1200 2200 2275 1500,不发任何指令,纯数学算出末端在哪,确认不撞桌再动臂。下面把这组真实案例值做成了默认滑块。
出处:EXP005_lab_guide.md 实验5 步骤2(pwm_to_fk_demo.py);换算式出自实验2 知识点 2.1.2 / 实验3 知识点 3.2.2。
教学目标:① 走一遍 car1 三段式解析法(指向 → 2R 余弦定理 → pitch 补偿的前两段);② 看懂多解(肘上/肘下)与不可达的几何判据;③ 会做 IK→FK 闭环验证;④ 感受 DLS 数值法阻尼 λ 的作用。
set_pick_target 写 position {x: 0.28, y: 0.0, z: 0.10}、orientation {x:0, y:1, z:0, w:0}(= pitch 180°,夹爪垂直朝下)。IK 必须在几十毫秒内把这一个点翻成 5 个关节角——下面红点就是它。
出处:EXP005_lab_guide.md 实验6 步骤1(ros2 topic pub 示例);三段式推导见实验4 步骤2(ik-analytical.js)。
教学目标:① 理解轨迹 = 角度随时间的函数 q(t),插值决定"怎么走";② 看懂 car1 的分步策略 _move_stepwise(40%/60% 分时);③ 会用限位与 PWM 安全边界检查一条轨迹是否"能发"。
_move_stepwise()——当底座目标转角超过 0.05 rad 时,先只转 J1(占总时长 40%),转到位再动 J2–J5(60%);这样大扫动不会带着小臂横甩撞物。EXP-05 的 action_player 回放 YAML 也是同一思想:一帧一帧分时下发,而不是并发齐射。
出处:EXP005_lab_guide.md 实验6 知识点 6.1.3(arm_controller.py `_move_stepwise`);安全红线"目标位姿必须逐步逼近"见讲义实验1 注意事项。
PWM = θ/0.002356 + 1500 换算并检查 500~2500。把 J1 终点拖到 ±180°、打开限位再看曲线——超出 ±135°(J3 实际限位量级)的轨迹段会被钳位,这就是"软件软限位先替你挡一道"。教学目标:① 认识机械臂结构与每个关节的转轴方向(可开 TF 三色轴);② 按讲义六步走一遍完整 pick 序列;③ 把 gripper_depth / pre_grasp_height 从抽象参数变成看得见的两段高度差;④ 目标点滑到不可达区,亲眼看到 IK 拒绝作业。
z+pre_grasp_height → 下探到 z−gripper_depth → 合爪 → 退回 z+pre_grasp_height → 移到 post_grasp_pose。目标点即案例值 (0.28, 0, 0.10)(pitch 180° 夹爪朝下),放置点 (0.059, 0.074, 0.219)。节点默认参数:gripper_depth=0.0(tcp 停在检测表面)、pre_grasp_height=0.03。
出处:EXP005_lab_guide.md 实验6 步骤1 命令示例、知识点 6.2/6.3;arm_controller.py 实际参数declare(工作区源码已核)。注意 lift_height 虽声明但源码未使用——抬升实由"退回 pre 高度"完成。
教学目标:① 会调 HSV 阈值解释"检测不到/误检"两个经典故障;② 手算针孔反投影 X=(u−cx)·d/fx;③ 把三步串成 EXP-07 的完整定位链——抓取的"看见"就这三步。
[0,100,80]~[15,255,255] ∪ [160,100,80]~[180,255,255];内参 fx=fy=614, cx=320, cy=240(HP60C,640×480);深度图 uint16 单位 mm,除以 1000 得米;OBSERVE 阶段须在 <1s 内完成"HSV+反投影+TF"三件套,整链成功率基线 >85%。
出处:EXP005_lab_guide.md 实验7 知识点 7.1.2/7.2(pixel_to_camera_frame)、步骤4(transform_to_base_link)、步骤12 性能基线表;阈值实参见工作区 visual_grasp.launch.py(已核)。