机械臂模拟器:运动学与 ROS 规划
这是一个基于浏览器的机械臂模拟器预览版,你可以在里面探索关节限位、正运动学、逆运动学,以及安全的运动规划。
- 类别
- ROS
- 时长
- 3–6 小时
- 平台
- 浏览器 · ROS 2
01 / 从这里开始
简介
机械臂借助几何、反馈和规划,把关节指令变成精确的工具运动。这个模拟器介绍的就是这条链路,而且不把其中困难的部分藏起来。它把坐标系、可达位姿、关节限位和奇异点都展示出来,让 ROS 用户和学习机器人的学生能够理解,一个被请求的运动为什么会成功或失败。
Live lab / Forward & inverse kinematics · pick-and-place
Robot arm simulator
Pose the joints, drag a target and watch inverse kinematics solve it live, or set a pick-and-place task and run it — with honest reach, singularity, and limit reporting on a full 360° workspace.
The filled dot is the base at the centre; segments are links with round joints; the tool shows a small x/y frame. The shaded ring is the reachable workspace (between the two dashed circles). In inverse mode the cross-marker is the draggable target and the faint arm is the other elbow solution. In pick-and-place mode, drag the box (pick) and the dashed square (place), then press Run.
- Tool X
- 0 px
- Tool Y
- 0 px
- Tool angle
- 0°
- Status
- Reachable
- Reach
- 0 / 240 px
Keyboard: focus the workspace, then use Space to run a pick-and-place, R to reset, B to switch elbow, and F for full screen.
控件
模拟器提供关节滑块、可拖动的工具目标、坐标系叠加和连杆尺寸控件,并且底盘居中摆放,让完整的 360° 可达工作空间都能看见。正解模式根据你设定的关节角计算工具位姿。逆解模式跟踪一个由你拖动的目标——实时求解关节角,并把不可达或存在歧义的目标报告出来,而不是悄悄吸附到某个结果上。第三种抓取放置模式让你先摆好取货点和目的地,然后让机械臂跑完整个任务:移到物体、抓取、搬运、放到投放区——这正是每一个真实机械臂都被造来做的那件标准工作。
原理
每个关节都在坐标系之间贡献一个变换。把这些变换从底盘一路乘到工具,就得到正解位姿。逆运动学则是反向推算,可能无解、有一个解,或者有多个解。
在奇异点附近,工具的一点点移动可能要求关节做出极大的动作。规划器还必须满足位置、速度、加速度、扭矩和碰撞方面的限制。仅仅在几何上够得到,并不意味着一条轨迹就是安全的。
算法
- 定义连杆长度、关节轴、初始变换和关节限位。
- 针对当前关节状态计算机器人正解位姿。
- 把当前工具位姿与请求的目标作比较。
- 用解析或数值求解器在限位内减小位姿误差。
- 剔除会碰撞的或奇异的候选解,并选择连续的那个解。
- 对路径做时间参数化,并把同步的设定点发给关节控制器。
源代码
平面二连杆臂的正向模型很紧凑:
from math import cos, sin
def forward_kinematics(theta_1, theta_2, link_1, link_2):
elbow = (link_1 * cos(theta_1), link_1 * sin(theta_1))
tool = (
elbow[0] + link_2 * cos(theta_1 + theta_2),
elbow[1] + link_2 * sin(theta_1 + theta_2),
)
return elbow, tool
对实物机械臂来说,在给执行器上电之前,要在一个有边界、考虑了碰撞的环境里验证每一条规划出来的轨迹。
假设与硬件差异
这条臂是平面的,有两个或三个转动关节,连杆完全刚性,速度响应瞬时,没有重力、动力学和碰撞——你可以从肘上摆到肘下而没有任何扭矩限制。真实的舵机有位置和速度限制、减速箱背隙、受电流限制的扭矩以及随负载变化的下垂,而六轴机械臂还必须处理朝向、奇异点以及关节限位附近的工作。这个实验台就是让你在加入那些让这些位姿难以保持的动力学之前,先弄明白为什么环带内的目标可能有两个解、为什么边缘上的目标是奇异的。
电路图
把大电流的执行器电源与计算电源分开,同时保持所选硬件所需的参考信号和安全信号。
引导实验
拖动目标是建立直觉最快的方式,对那些在纸面上证明起来枯燥、 在硬件上发现起来又昂贵的性质尤其如此。
1. 找出工作空间的形状
把目标慢慢向外拖,直到求解器报告不可达,然后沿着这条边界完整地 描一圈。现在再把目标朝底盘方向往里拖。
连杆长度不等时,你会找到两条边界:一条是 L1 + L2 处的外圆,
另一条是 |L1 − L2| 处的内圆。工作空间是一个环带而不是圆盘,
中间有一个机械臂在物理上够不到的洞。
| 连杆 | 外侧臂展 | 内部空洞 | 形状 |
|---|---|---|---|
| 100 + 90 | 190 | 10 | 带小洞的环带 |
| 100 + 50 | 150 | 50 | 带大洞的环带 |
| 100 + 100 | 200 | 0 | 一个完整圆盘——等长连杆可以完全折叠到自身上 |
最后一行是一个真正有用的设计事实:等长连杆能彻底消除这个死区。 如果你的机械臂需要在靠近自身底盘的地方工作,这就是选择等长连杆的理由。
2. 观察两个解如何合并
在工作空间中部附近的某个目标上,在肘上分支和肘下分支之间来回切换: 那是两个明显不同的机械臂位姿,却到达同一个点。
现在把这个目标朝边界方向往外拖。两个位姿逐渐收敛,在完全伸展时 它们变成同一个位姿。那就是一个奇异点,也是机械臂失去沿某个方向 移动工具能力的地方——无论关节怎么动都做不到。
3. 体会奇异点的代价
让目标沿着一条经过接近完全伸展处的直线慢慢、稳定地移动。 看关节角度,而不要看机械臂本身。
工具以恒定速率移动,关节却不。靠近边界时,工具的一点移动就要求 关节做出巨大的动作,于是一条平滑的笛卡尔路径变成了剧烈的关节运动。 在硬件上,这就是一个舵机猛地撞到自己的限位。
把规划路径保持在最大臂展的约 95% 以内,这个问题就不再出现。
4. 跨过分支边界,看那次翻转
把求解器设成永远选择肘上分支,然后拖着目标穿过一个该分支会撞上 关节限位、从而迫使求解器切换的区域。机械臂会翻过一次幅度大、 速度快、完全没有计划的运动。
这就是为什么正确的默认选择是最小运动量——挑选离当前位姿最近的 那个分支——而不是固定某个分支。在真实硬件上,一次悄无声息的中途分支 切换既吓人又可能造成破坏。
你应该观察到什么
| 操作 | 预期结果 | 如果你看到的不是这样 |
|---|---|---|
目标超出 L1 + L2 |
干净地报“不可达” | 出现 NaN 或被吸附的位姿,说明求解器太晚才测可达性 |
目标落在 |L1 − L2| 内 |
同样不可达 | 正确——这是那个洞,不是 bug |
| 目标在底盘后方 | 正确到达 | 如果出现镜像,那是用了 atan 而不是 atan2 |
| 切换肘部分支 | 工具位置相同,关节不同 | 两者都有效;选哪个是你的决定 |
| 朝边界方向拖 | 关节速率急剧上升 | 这就是奇异点 |
| 经正解再逆解往返一圈 | 原来的角度回来了 | 对不上说明符号或偏移约定不一致 |
硬件落地
几何是可以精确迁移的。其他一切都不行,而这道差距正是第一台机械臂 的建造所要花时间的地方:
| 这个实验台 | 真实舵机臂 |
|---|---|
| 关节精确地去往被指令的位置 | 舵机零位就是舵盘装上的那个位置;有些还会朝相反方向转 |
| 没有重力 | 肩关节在伸展时下垂——而且恰恰在精度最差的地方最严重 |
| 没有背隙 | 几度的间隙,每次换向都会计入 |
| 瞬时运动 | 一次跳跃式指令会以全速执行,并伴随一个电流尖峰 |
| 连杆长度完美 | 要在关节轴线之间测量,而不是支架边缘 |
| 无限扭矩 | 一台工作在堵转扭矩 58% 的 SG90 无法准确保持位置 |
有两个数字能说明问题。190 mm 臂展上肩关节 4 度的间隙,换算到夹爪端超过 13 mm——比数学引入的任何误差都大。而在 95 mm 的连杆上把长度量成 105 mm,就是一个 10% 的系统性误差,任何整定都去不掉。
实际结论是:硬件精度来自标定和一致的接近方向,而不是更好的运动学。 永远从同一个方向接近目标,背隙就变成一个可以减掉的、可重复的偏移。 把每种失败情况都处理好的完整求解器,见二连杆臂的逆运动学。
硬件清单
元器件
- 三轴或以上的机械臂
- 能同步更新各关节的控制器
- 关节反馈或智能舵机
- 刚性底座和明确定义的工具中心点
- 急停开关和限流电源
探索关联图谱
哪里用到这个模拟器
以这个实验台为基础的项目、学习路线和教程。
继续搭建
下载资源
完成项目时可以参考本页上的这些资料。可下载的项目包只会在其源文件和版本发布之后才会添加。
常见问题
常见问题解答
正运动学和逆运动学有什么区别?
正运动学根据已知的关节值计算工具位姿。逆运动学则从一个期望的工具位姿出发,搜索能产生这一位姿的一个或多个关节构型。
为什么二连杆臂会有两个解(肘上和肘下)?
对于大多数可达的目标,肘部向哪一侧弯曲都能把工具放到同一个点上,于是就有了肘上和肘下两种构型。这两个解来自用余弦定理求第二个关节角时的正负号。只有在奇异点处——机械臂完全伸直或完全折叠时——两者才会重合。
如何在肘上和肘下之间做选择?
选择对任务来说最安全、最高效的构型:让关节远离限位、使相对当前位姿的运动量最小,或者能避开障碍物的那个。这个模拟器允许你在两个分支之间切换,并把另一个解显示为半透明的虚影,让其中的取舍一目了然。
机械臂的奇异点是什么?
奇异点是机械臂失去沿某个方向移动工具能力的构型——通常出现在完全伸展或完全折叠的时候。在奇异点附近,工具的一点点移动就可能要求关节做出非常大的动作,所以规划器会在这些位姿附近减速或绕开它们。它也是肘上解和肘下解合而为一的地方。
逆运动学什么时候无解?
平面二连杆臂的目标,只有落在最短臂展(两连杆长度之差)与最长臂展(两者之和)之间的环带内才可达。环带之外的点,无论关节角取什么值都够不到。一个位姿也可能因为需要被禁止的关节角、需要现有关节无法实现的朝向,或者会与机械臂自身发生碰撞而不可达。
为什么用解析逆运动学,而不用数值求解器?
对于二连杆或三连杆的平面臂,其几何存在闭式(解析)解,所以你可以直接、确定且快速地算出精确的关节角——非常适合教学和测试。对于不存在闭式解的冗余臂或空间臂,就需要数值求解器,但它们要反复迭代,可能漏掉解,也更难推理。
延伸阅读
参考资料
权威资料,帮助你越过本模拟器有限的教学模型,进一步深入学习。