本篇文章主要参考了以下的文章,目的是为了加深自己对WBC公式以及多优先级任务运用的理解。
基于零空间方法(NUB)的全身控制(WBC)的简单实现
在这里插入图片描述

控制系统输入:滑块在轨道上的位置 y h y_h yh,机械臂各关节位置 θ = [ θ 1   θ 2   θ 3 ] T \boldsymbol{\theta}=[\theta_1\ \theta_2\ \theta_3]^T θ=[θ1 θ2 θ3]T
控制系统输出:机械臂各个关节的速度 θ ˙ \boldsymbol{\dot{\theta}} θ˙
控制任务1:让机械臂末端位置保持在世界坐标系下点 A = [ 2   0 ] T A=[2 \ 0]^T A=[2 0]T
控制任务2:让机械臂末端朝向x轴。

1.无优先级的控制方案

(1)末端期望坐标
x d = [ 2 − y h 0 ] \boldsymbol{x}_{d}=\left[\begin{array}{c} 2 \\ -y_h \\ 0 \end{array}\right] xd=2yh0
(2)正运动学求解(末端相对于原点)
x = [ x y θ ] = [ l 1 c 1 + l 2 c 12 + l 3 c 123 l 1 s 1 + l 2 s 12 + l 3 s 123 θ 1 + θ 2 + θ 3 ] \boldsymbol{x}=\left[\begin{array}{l} x \\ y \\ \theta \end{array}\right]=\left[\begin{array}{c} l_{1} c_{1}+l_{2} c_{12}+l_{3} c_{123} \\ l_{1} s_{1}+l_{2} s_{12}+l_{3} s_{123} \\ \theta_{1}+\theta_{2}+\theta_{3} \end{array}\right] x=xyθ=l1c1+l2c12+l3c123l1s1+l2s12+l3s123θ1+θ2+θ3
(3)求逆
l 1 = l 2 = l 3 = 1 m l_1=l_2=l_3=1m l1=l2=l3=1m代入
x ˙ = J θ ˙ ↓ J = [ − s 1 − s 12 − s 123 − s 12 − s 123 − s 123 c 1 + c 12 + c 123 c 12 + c 123 c 123 1 1 1 ] ↓ θ ˙ = J † x ˙ \dot{\boldsymbol{x}}=J\boldsymbol{\dot{\theta}}\\ \downarrow\\ J=\left[\begin{array}{ccc} -s_{1}-s_{12}-s_{123} & -s_{12}-s_{123} & -s_{123} \\ c_{1}+c_{12}+c_{123} & c_{12}+c_{123} & c_{123} \\ 1 & 1 & 1 \end{array}\right]\\ \downarrow\\ \dot{\theta}=J^{\dagger} \dot{\boldsymbol{x}} x˙=Jθ˙J=s1s12s123c1+c12+c1231s12s123c12+c1231s123c1231θ˙=Jx˙
伪逆的性质:若 J J J有逆,则 J † J^{\dagger} J J J J的逆;若 J J J没有逆,则 J † J^{\dagger} J满足 θ ˙ = J † x ˙ \dot{\theta}=J^{\dagger} \dot{\boldsymbol{x}} θ˙=Jx˙的最小二乘解。

2.带优先级的控制方案

以位置优先级高于方向优先级为例
(1)任务分解
{ r 1 = [ x y ] T r 2 = θ ↓ { r 1 d = [ 2 − y h ] T r 2 d = 0 \left\{\begin{array}{l} \mathbf{r}_{1}=\left[\begin{array}{ll} x & y \end{array}\right]^{T} \\ \mathbf{r}_{2}=\theta \end{array}\right.\\ \downarrow\\ \left\{\begin{array}{l} \mathbf{r}_{1 d}=\left[\begin{array}{ll} 2 & -y_{h} \end{array}\right]^{T} \\ \mathbf{r}_{2 d}=0 \end{array}\right. {r1=[xy]Tr2=θ{r1d=[2yh]Tr2d=0
(2)雅可比矩阵求解
上面已经得到了矩阵的具体参数值,只需要做分解即可
{ J 1 = [ − s 1 − s 12 − s 123 − s 12 − s 123 − s 123 c 1 + c 12 + c 123 c 12 + c 123 c 123 ] J 2 = [ 1 1 1 ] \left\{\begin{array}{l} J_{1}=\left[\begin{array}{ccc} -s_{1}-s_{12}-s_{123} & -s_{12}-s_{123} & -s_{123} \\ c_{1}+c_{12}+c_{123} & c_{12}+c_{123} & c_{123} \end{array}\right] \\ J_{2}=\left[\begin{array}{lll} 1 & 1 & 1 \end{array}\right] \end{array}\right. J1=[s1s12s123c1+c12+c123s12s123c12+c123s123c123]J2=[111]
(3)代入WBC公式
θ ˙ = J 1 † r ˙ 1 + ( I − J 1 † J 1 ) J 2 † r ˙ 2 \dot{\theta}=J_{1}^{\dagger} \dot{\mathbf{r}}_{1}+\left(I-J_{1}^{\dagger} J_{1}\right) J_{2}^{\dagger} \dot{\mathbf{r}}_{2} θ˙=J1r˙1+(IJ1J1)J2r˙2

实际控制中,将得到的速度值输入到关节的控制器中(如PID控制器)对关节电机进行控制即可

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐