收益:
- 能够借助人工智能建立和解决正向/逆向运动学和轨迹规划问题
- 能够通过给机器人关节限制、速度和加速度约束作为提示上下文来生成安全轨道
- 能够以数字和物理方式验证人工智能产生的运动学和轨迹输出
将机器人手臂末端的夹具以特定方向带到空间中的特定点;听起来很简单,但背后却有运动学方程、关节极限、奇点和轨迹规划。在这里,机电一体化工程师将三角学、线性代数和控制理论结合在一起。人工智能在此过程中提供了强大的帮助:它可以建立正向运动学方程,提出逆向运动学的求解方法,根据速度/加速度约束参数化轨迹。然而,机器人技术是机电一体化领域中物理风险最高的领域之一。如果人工智能生成的角度序列未经验证就发送给机器人,则手臂可能会撞到自身、环境或操作员。在本单元中,我们将了解如何使用人工智能设置和验证运动学和轨迹规划。
正向和反向运动学
正向运动学 (FK):如果关节角度已知,则找到末端执行器的位置和方向。解决办法只有一种,那就是直接。
逆运动学 (IK):如果已知最终功能的所需位置,则找到可提供该位置的关节角度。它通常有多个解(例如肘部向上/向下),有时它没有解(无法到达点),有时它有无限个解(奇点)。
概念
输入
输出
解决方案数量
正向运动学
关节角度
极限位置/方向
单身
逆运动学
极限位置/方向
关节角度
多个/无/无限
对于二关节平面臂,可以在 AI 中设置逆运动学并手动验证,如下所示:
import numpy as npdef inverse_kinematik_2r(x, y, L1, L2): """2 关节平面臂的 IK。返回以弧度为单位的角度(肘部向下解决方案)。""" r2 = x**2 + y**2 # 辅助功能检查:该点是否在工作区中? if np.sqrt(r2) > (L1 + L2) 或 np.sqrt(r2) < abs(L1 - L2): raise ValueError("点位于可访问工作空间之外") cos_t2 = (r2 - L1**2 - L2**2) / (2 * L1 * L2) cos_t2 = np.clip(cos_t2, -1.0, 1.0) # numericsecurity t2 = np.arccos(cos_t2) # 肘部向下 t1 = np.arctan2(y, x) - np.arctan2(L2*np.sin(t2), L1 + L2*np.cos(t2)) return np. Degrees(t1), np. Degrees(t2)# 验证: L1=L2=1, 目标 (1,1) -> 预期 t2=90 Degreesprint(inverse_kinematik_2r(1.0, 1.0, 1.0, 1.0)) # ~ (0.0, 90.0)
这里的关键行是 AI 经常跳过的地方:可达性检查(工作区中的点)和“np.clip”(防止 arccos 输入由于舍入误差而超过 ±1)。如果没有这两种保护,代码将产生 NaN 或在无效点崩溃。
提示:当要求IK分辨率时,明确告诉AI“添加辅助功能控制并限制arccos输入到剪辑”。这两行代码可以防止导致该领域最令人头疼的无声错误。
联合极限、奇点和多解
真实机器人的每个关节都有一个角度范围(例如-170°到+170°)、速度限制和加速度限制。即使 IK 给出了数学上有效的角度,但如果该角度超出关节的物理范围,则无法使用该角度。此外,机器人在某些配置中陷入奇点:两个轴对齐,失去一个自由度,并且关节速度试图达到无穷大以实现小的尖端运动。
这就是为什么仅靠人力资源解决方案是不够的;每个解决方案都必须通过可接受性过滤器:
def解决方案_gecerli_mi(acilar_deg,limits_deg):“”“疼痛:[t1,t2,...],限制:[(min,max),...]“”“对于疼痛,(amin,amax)在zip(acilar_deg,limits_deg)中:如果不是(amine <= pain <= amax):返回False,f“超出关节限制:{pain:.1f} deg ({amine},{amax}) except" return True, "OK"limits = [(-170, 170), (-120, 120)]print(cozum_valid_mi([0.0, 90.0], limit)) # (True, 'OK')print(cozum_valid_mi([0.0, 150.0], limits)) # (False, '联合限制超过...')
AI可以给出IK的“数学”解;但是联合限制和奇点避免是特定于您的系统的,并且必须作为提示的上下文给出。
轨道规划
让机器人从 A 点到达 B 点并不是在两个角度之间画一条直线。突然的速度变化会产生机械冲击和振动。相反,使用软曲线:梯形速度曲线(恒定加速度 - 恒定速度 - 恒定减速度)或 S 曲线(更平滑,其中加速度也受到限制)。让AI生成轨迹时,必须给出目标、持续时间和约束条件。
import numpy as npdef trapez_yorunge(q0, q1, v_max, a_max, dt=0.01): """单个关节的梯形速度曲线。返回位置数组。""" distance = abs(q1 - q0) Direction = np.sign(q1 - q0) t_speed = v_max / a_max distance_speed = 0.5 * a_max * t_speed**2 if 2 * distance_speed > distance: # 三角形轮廓(v_max 无法到达) t_speed = np.sqrt(distance / a_max) t_constant = 0.0 v_peak = a_max * t_speed else: t_constant = (distance - 2 * distance_speed) / v_max v_peak = v_max T = 2 * t_accelerate + t_constant t = np.arange(0, T, dt) # ...每个t的位置计算(基于加速/恒定/减速阶段) return t, T, v_peak,uration, vz = trapezoidal_trajectory(0.0, 90.0, v_max=60.0, a_max=120.0)print(f"总持续时间: {duration:.3f} s, 峰值速度: {vz:.1f} 度/秒")
这里的逻辑检查是这样的:如果距离很短,电机将永远不会达到 v_max,并且轮廓将从梯形变成三角形。如果AI错过了这个条件,短距离移动的持续时间将会计算错误。您可以通过使用已知值(例如,非常短的距离)测试代码来验证这一点。
弱提示/强提示
弱:“编写一条机器人手臂从 A 到 B 的轨迹。”(无约束:速度限制?加速度?关节间距?盲输出。)强:“为 6 轴机器人生成关节空间中的点对点轨迹。每个关节的速度限制为 90 deg/s,加速度限制为 180 deg/s^2,角度范围在表中给出。使用梯形速度曲线,如果距离短,则掉落每个关节的输出是 还编写一个验证函数来检查它是否超出了关节限制:{{table}}”。
验证:从模拟到机器人
AI 生成的轨迹在进入机器人之前按以下顺序进行验证:
- 数值:每一步的关节角度、速度和加速度是否在限制范围内?
- 碰撞:沿着轨迹,手臂是否与自身或环境发生碰撞(如果可能,进行可视化/模拟)?
- 奇点:轨道是否穿过奇点区域(雅可比行列式是否接近零)?
- 慢速硬件测试:以低速(例如10%)操作机器人并进行目视监控。
- 逐步提速:确认无误后,速度逐步提至标称值。
注意:首次以新轨迹启动机器人时,速度倍率应始终较低,并且紧急停止应可用。即使人工智能输出“在数学上是正确的”,物理设置中的偏移、反轴或电缆障碍也只能通过缓慢的测试才能发现。
迷你包
自动化工程师 Ece 要求 AI 提供关节空间中的轨迹代码,以用于拾放应用。 AI 生成梯形轮廓,但是当 Ece 测试短距离移动时,她发现时间为负:代码没有处理无法达到 v_max 的三角形轮廓情况。 Ece 通过告诉提示“如果距离短,则落入三角形轮廓”来纠正此问题。然后,它通过其验证函数对照自己的极限表运行 AI 给出的关节角度,发现关节 5 在某一点想要 +125°,而极限为 +120°。他重新规划轨迹并对其进行监控,这次机器人以 10% 的速度运行。在第一轮中,他发现夹具离工作台太近,并纠正了 Z 轴偏移。人工智能在几分钟内返回工作大纲;但三个单独的验证(三角形轮廓、联合极限、慢速测试)发现了三个单独的实际问题。
常见错误
- 使用没有关节限制和可访问性控制的 IK 解决方案。
- 不剪裁 arccos/arcsin 条目,但在出现舍入错误时生成 NaN。
- 请求轨道而不限制速度/加速度并产生机械冲击。
- 忽略奇点区域并让关节速度飙升。
- 短距离跳过梯形-三角形轮廓过渡并计算错误的时间。
- 以全速且无急停通道的方式进行首次轨道测试。
综上所述
- 正向运动学只有一个解;逆运动学可以产生多个、不存在或无限的解。
- IK 解决方案必须根据关节限制、可访问性和奇异性进行过滤。
- 轨迹规划;它使用软的、极限兼容的轮廓,例如梯形或 S 曲线。
- 在短距离处,轮廓从梯形变为三角形;这应该在代码中处理。
- 人工智能加速数学计算;提示中应输入限制和物理安装上下文。
- 新轨迹首次运行时始终采用低速比和可使用的急停装置。
应用任务
选择二关节或三关节臂模型(具有真实或虚构的连杆长度和关节限制)。让 AI 在此上下文中生成逆运动学函数和轨迹规划器。然后:(1) 使用已知目标手动验证 IK 输出(是否将角度放回并返回到与 FK 相同的点),(2) 通过给出至少一个不可访问点和一个超过目标的关节限制来测试代码是否捕获它们,(3) 检查短距离处的轨道时间是否合理。记下您在第一个版本的代码中发现了多少个验证问题以及哪个层捕获了每个问题。