Lecture 2#
运动学 VS 动力学:运动学描述运动而不考虑力的来源
[!note] 记号假设
小写字母 p 代表坐标,加粗字母 v 代表向量
运动信息可以用六维坐标 (Rs→bs,ts→bs) 表示(三维是旋转,三维是平移)
p1s=Rs→bsp1b+ts→bs
为了让它变为线性变换,我们考虑齐次坐标
x~:=(x1)∈R4,Ts→bs=[Rs→bs0ts→bs1],x~s=Ts→bsx~b
变换可以复合而且可逆
T1→31=T1→21T2→32,T2→12=(T1→21)−1
- Forward Kinematics:根据参数 θ,计算 T=f(θ)
- Inverse Kinematics:根据 T(θ) ,反解 θ 。有可能无解,但是如果有解往往无穷多解,因为在设计自由度的时候我们会留出来一些冗余,以增加避障等灵活性
Leture 3#
旋转矩阵的性质
- ∥Rp∥=∥p∥ 保长度
- Rp×Rq=R(p×q)
所以我们可以推出 RR⊤=R⊤R=I,det(R)=1
在三维空间中,所有的刚体变换只有旋转和平移,没有手性变换(反射)。但是平移不是线性变换,所以要引入第四维形成齐次坐标。
SO(3)SE(3)={R∈R3×3∣RR⊤=R⊤R=I,det(R)=1}={(R,t)∣R∈SO(3),t∈R3}
SO(3) 里面的矩阵虽然是九个元素,但是其自由度只有 3 个,可以用 Euler Angle 来解释。
- (Yaw-Pitch-Roll)的顺序
- Yaw:绕着 z 轴
- Pitch:绕着新 y 轴 y′
- Roll:绕着新 x 轴 x′′
Rx(α):=1000cosαsinα0−sinαcosα,Ry(β):=cosβ0−sinβ010sinβ0cosβ,Rz(γ):=cosγsinγ0−sinγcosγ0001R(α,β,γ)=Rz(γ)Ry(β)Rx(α)
- 缺点:但是不是一一对应,同一个旋转矩阵可以有多个 Euler Angle 与之对应,而且三个变量不独立,万向节死锁插值如果碰到奇异点会乱飞
Euler’s Theorem 证明也可以用 Axis Angle 来表示,ω^ 表示转轴单位向量,θ 代表转动角度,但是只在 θ∈(0,π) 上的时候是一一对应的,一旦 θ=π 就会出现一对多,具体形式可以表示为
Rot(ω^,θ)x=e[ω^]θx
Rodrigues Formula:
e[ω^]θ=I+sinθ[ω^]+(1−cosθ)[ω^]2
给定 R,而且确定 θ∈(0,π) 那么 ω^ 和 θ 可以唯一确定为
θ=cos−1(2tr(R)−1),ω^=2sinθ1(R−R⊤)
1 Quaternion#
四元数(Quaternion):真正我们经常使用的表示方法。
q=w+xi+yj+zki2=j2=k2=ijk=−1ij=k=−ji,jk=i=−kj,ki=j=−ik
其中 ω 为实部,v=(x,y,z) 为虚部
四元数乘法的性质:
- 向量形式 (Vector form): q=(w,v)
- 乘法 (Product):
- 对于 q1=(w1,v1) 和 q2=(w2,v2),
q1q2=(w1w2−v1Tv2,w1v2+w2v1+v1×v2)
- 不可交换 (Not commutable)(注意:v1×v2=v2×v1)
- 共轭 (Conjugate): q∗=(w,−v)
- 范数 (Norm): ∥q∥2=w2+vTv=qq∗=q∗q
- 逆 (Inverse): q−1:=∥q∥2q∗
所有模为 1 的四元数用来表示一个旋转,恰好有 3 个自由度。从 Axis Angle 可以直接转化为四元数 q=[cos(θ/2),sin(θ/2)ω^]
如何用四元数旋转
- 首先扩展 x 为 x=(0,x)
- 然后共轭变换 x′=qxq−1
四元数旋转可以直接复合:先 q1 再 q2 ,则相当于 q2q1
[! note] 坐标表示
注意不同引擎下坐标顺序不同,可能是 (w,x,y,z) 或 (x,y,z,w)。
从 quaternion 到 axis angle:
θ=2cos−1(w),ω^=sin(θ/2)1v1θ=0
1.1 插值#
在 S3 上的四元数之间夹角 <p,q>=arccos(∣p⋅q∣),对应的旋转的夹角是 dist(p,q)=2arccos(∣p⋅q∣),所以在四元数上做插值等价于在 S3 上做插值。
四元数插值(slerp)
ψq(t)=cos−1(q0⋅q1)=sinψq0sin(1−t)ψ+q1sintψ
[! note] 为什么不能直接对四元数进行线性插值
- 首先线性运算得到的未必是归一化的
- 即使归一化之后,也不能保持在球面上恒定的旋转速率
1.2 采样#
球面上均匀分布的采样方法,可以高斯采样然后归一化
x∼N(0,I),q=∥x∥x
两个旋转 R1,R2 之间的距离:
(R2R1⊤)R1=R2⟹dist(R1,R2)=arccos(2tr(R2R1⊤)−1)
[!summary] Why Quaternions?
- 尽量少的冗余,四个数就够用
- 乘法更简单,每次乘法 16 个乘运算+12 个加运算
- 数学性质
- 旋转矩阵连乘会因为浮点数精度损失更多
- 四元数正交化只要归一化就可以了
- 复合运算很方便
Lecture 4#
Motion Planning 可以转换为路径搜索问题:如何在无碰撞空间 Cfree 里找到一条路径连接 qstart 和 qgoal ,不过该问题是在一个高维空间内的。
1 Collision Check#
由于维度过高,直接做搜索是不可能的。且如何确定一个 q 是否属于 Cfree 都是困难的,这个工作称之为 Collision Check
- 我们通常使用球来做近似,因为它做碰撞检测更简单;但模拟情况下不碰撞不代表真实情况下不碰撞。碰撞十分致命,尤其对于灵巧手,没有力传感器做 Compliance ,非常容易坏。
- 更精确的是凸凸碰撞测试(convex-convex collision check),对于非凸的形状,我们用尽量少的分解 Approximate Convex Decomposition (ACD):将其转化为凸凸碰撞
2 路径搜索#
Probabilistic Roadmap Method
- 第一步在 Cfree 里面做 sample,连接其中相邻的节点,连接起点终点,变成一个图
- sample 的算法:rejection sampling,但是 uniform sample 可能导致忽视狭窄通道,所以我们考虑 Gaussian sample(最终会贴近障碍物边缘) 和 bridge sample(最终会贴近狭窄通道)
- edge 的建立:对于每个点,只看最近的几个点就可以。这个过程是可以并行的。
- 第二步做路径搜索,如 Dijkstra
RT-based 算法
- RRT:绕着试试(exploration) 和贪婪前进(exploitation) 的结合
- 如何找到树中最近的点:需要使用 KD Trees 等方法
- 如何确定 ϵ :如果 ϵ 太大了,很容易撞;如果 ϵ 太小了,可能会导致搜索效率过低。
- RRT-connect:从起点和终点同时开搜,朝着同一个点的方向前进
- Shortcutting:RRT 找出来的路径通常很绕,为了路径平滑性,我们会在已知节点里面随机 sample 两点,找到不绕路的做法
- 但是只是局部做法,只能基于已知的节点,可能会错过更好的路径
- 在一开始非常好用,后面边际收益递减
从 path 到 trajectory:考虑每个点到达的时间——除了路径是否可能,我们还需要考虑 dynamics 上速度、加速度是否可能。
3 Control System#
controller:考虑如何从当前位置 st 到达目标位置 s~t,可能会出现 over shoot 和 under shoot 以及外力干扰等,所以需要 closed-loop control
3.1 PD-controller#
对于一阶问题,我们使用系统动力学
x¨+dx˙+kx=u
其中,u 是外力控制
P-term:u=Kpxe(t) 只考虑和误差 proportion 相关,Kp 越大反应越快,但是也可能会过冲
D-term:u=Kpxe+Kdx˙e 考虑误差的导数,缓解了过冲
一般的操作是先调好 Kp ,然后再加大 Kd ,偶尔可能还会涉及到 Ki
对于多自由度系统的 PD control,由于关节之间是耦合的,所以我们是先分别调,合起来再调。
3.2 PID control#
I(积分)control term:Ki∫xedt,代表对过去误差的累积,通常用来消除稳态误差
PID control law
u=Kpxe+Ki∫xedt+Kdx˙e
当时对于现代机器人学,很少用到 PID,往往 PD 就够了,因为调起来简单,且够用,而且不那么需要关注每步的误差;对于误差的过度要求,反而可能会导致不必要的动力加强(比如意外的障碍导致无法达到准确稳态,反而不安全);对于 PD 系统,如果希望消除稳态误差,可以考虑更多基于模型的补偿方案