WARNING
🧪 Beta公测版本提示:教程主体已完成,正在优化细节,欢迎大家提Issue反馈问题或建议。
机器人建模方法 — demo.py 代码详解
运行方式
bash
cd docs/robotics/modeling/code
python demo.pyCPU、NumPy 即可。一张图 dh_3r.png:三根平面杆的折线。标准 DH:每关节
代码逐段详解
第1步:杆长表
python
A_LEN = [0.6, 0.5, 0.35]三个 fk_chain 用 zip(A_LEN, thetas) 一对一,长度必须相等。没有第四杆。
第2步:dh — 一帧
顺序:绕
python
def dh(a, alpha, d, theta):
ca, sa = np.cos(alpha), np.sin(alpha)
ct, st = np.cos(theta), np.sin(theta)
return np.array([
[ct, -st * ca, st * sa, a * ct],
[st, ct * ca, -ct * sa, a * st],
[0.0, sa, ca, d],
[0.0, 0.0, 0.0, 1.0],
])- 先算
ca,sa,ct,st:矩阵里每个三角函数最多用一次,少写错。 - 第四行
[0,0,0,1]:齐次坐标。点是,方向向量 。 - 平面关节
alpha=0, d=0:ca=1, sa=0,矩阵变成右上角 就是「转完再沿杆走 」。练习 dh_trans_x只要元素。 - 第三行
sa, ca, d:空间臂扭角、偏置在这里出现。本 demo 它们是。
图解 PNG 里可能印了另一种
第3步:fk_chain — 左乘累加
python
def fk_chain(thetas):
T = np.eye(4)
origins = [T[:3, 3].copy()]
for a, th in zip(A_LEN, thetas):
T = T @ dh(a, 0.0, 0.0, th)
origins.append(T[:3, 3].copy())
return np.array(origins), TT = np.eye(4):基座。原点。 T[:3, 3]:齐次矩阵的平移列(前三行第四列)。每一帧乘完记下,折线才有中间关节。.copy():origins若存切片视图,下一步改T会把历史原点一起改掉。T = T @ dh(...):从基座往末端乘。@不要写成*(那是逐元素,4×4 会得到无意义数)。- 返回
origins与最终T:位置用前者,姿态用T[:3,:3]。
第4步:主程序 — 打印姿态并画折线
python
th = np.array([0.4, -0.7, 0.5])
pts, T = fk_chain(th)
print('末端位置', pts[-1, :2])
print('末端旋转 R=\n', np.round(T[:3, :3], 3))pts[-1, :2]:最后一个原点的(平面 )。 np.round(..., 3):旋转块应接近平面旋转(第三行第三列,第三列前两行 )。 plot(pts[:,0], pts[:,1], 'o-'):点 + 线。scatter再把基座涂黑。set_aspect('equal')保杆长视觉比例。
没有逆解:给定角画一次。要解
关键概念速查表
| 概念 | 数学 / 直觉 | 代码 |
|---|---|---|
| DH 四元组 | dh(a,alpha,d,theta) | |
| 平面臂 | dh(a, 0.0, 0.0, th) | |
| 平移列 | T[:3, 3] | |
| 连乘 | T = T @ dh(...) | |
@ vs * | 矩阵乘 vs 逐元素 | 必须 @ |
.copy() | 快照原点 | origins.append |
zip | 杆长配关节角 | zip(A_LEN, thetas) |
T[:3,:3] | ||
练习 dh_trans_x |
源码位置
clone 后打开(相对仓库根目录):
docs/robotics/modeling/code/demo.py