【基于机械臂触觉伺服的物体操控研究】UR5e动力学建模及代码实现

news2024/11/20 11:22:35

在这里插入图片描述
我的毕设题目定为《基于机械臂触觉伺服的物体操控研究》,这个系列主要用于记录做毕设的过程。

前言:UR系列是优傲公司的代表产品,也是目前比较通用的产品级机械臂。所以我打算用该机械臂进行毕设的仿真实现。关于其动力学建模,网上有很多参考的文献,但由于六自由度的完整动力学模型很复杂,验证和移植都比较麻烦,所以我参考了以下的论文,对动力学模型进行了简化,并且在仿真环境中进行了验证。
基于UR5机械臂的轨迹跟踪控制算法研究

1. 模型简化

UR5e一共有6个驱动关节,其中前三个关节主要用于控制末端的位置,后三个关节主要用于控制末端的姿态。
因为后三个连杆较短,并且质量较小,动力学参数值较小,因此将其简化为质点,位置在第三个驱动关节对应连杆的末端。
对于前三个关节,认为其质量沿杆均匀分布,并将其简化为两个模型,一个是只有关节1的单连杆模型,一个是有关节2和关节3的双连杆模型。
注:以下模型中的 c 1 c_1 c1表示 c o s ( θ 1 ) cos(\theta_1) cos(θ1) s 12 s_{12} s12表示 s i n ( θ 1 + θ 2 ) sin(\theta_1 + \theta_2) sin(θ1+θ2)

关节1的单连杆模型
在这里插入图片描述

关节2和关节3的双连杆模型
在这里插入图片描述
其中, m e m_e me为后三个连杆的质量之和。
m e = m 4 + m 5 + m 6 m_e = m_4 + m_5 + m_6 me=m4+m5+m6

2. 动力学建模

因为对于简化后的模型,连杆的动能和势能都比较容易求取,所以我采用了拉格朗日法进行动力学建模。
拉格朗日公式
L ( Θ , Θ ˙ ) = k ( Θ , Θ ˙ ) − u ( Θ ) d d t ∂ L ∂ Θ ˙ − ∂ L ∂ Θ = τ \begin{gathered} \mathcal{L}(\Theta, \dot{\Theta})=k(\Theta, \dot{\Theta})-u(\Theta) \\ \frac{\mathrm{d}}{\mathrm{d} t} \frac{\partial \mathcal{L}}{\partial \dot{\Theta}}-\frac{\partial \mathcal{L}}{\partial \Theta}=\tau \end{gathered} L(Θ,Θ˙)=k(Θ,Θ˙)u(Θ)dtdΘ˙LΘL=τ
动力学模型的状态空间方程
τ = M ( Θ ) Θ ¨ + V ( Θ , Θ ˙ ) + G ( Θ ) \tau = M(\Theta) \ddot{\Theta} + V(\Theta, \dot{\Theta}) + G(\Theta) τ=M(Θ)Θ¨+V(Θ,Θ˙)+G(Θ)
M ( Θ ) M(\Theta) M(Θ) n × n n \times n n×n质量矩阵
V ( Θ , Θ ˙ ) V(\Theta, \dot{\Theta}) V(Θ,Θ˙) n × 1 n \times 1 n×1离心力和哥氏力矢量
G ( Θ ) G(\Theta) G(Θ) n × 1 n \times 1 n×1阶重力矢量

动力学模型的位形空间方程
τ = ( Θ ) Θ ¨ + B ( Θ ) ( Θ ˙ Θ ˙ ) + C ( Θ ) ( Θ ˙ 2 ) + G ( Θ ) \tau = (\Theta)\ddot{\Theta}+B(\Theta)(\dot{\Theta}\dot{\Theta})+ C(\Theta) (\dot{\Theta}^2)+G(\Theta) τ=(Θ)Θ¨+B(Θ)(Θ˙Θ˙)+C(Θ)(Θ˙2)+G(Θ)
B ( Θ ) B(\Theta) B(Θ) n × n ( n − 1 ) / 2 n \times n(n-1)/2 n×n(n1)/2阶哥氏力系数矩阵
C ( Θ ) C(\Theta) C(Θ) n × n n \times n n×n阶离心力系数矩阵
( Θ ˙ Θ ˙ ) (\dot{\Theta}\dot{\Theta}) (Θ˙Θ˙) n ( n − 1 ) / 2 × 1 n(n-1)/2 \times 1 n(n1)/2×1阶关节速度积矢量
( Θ ˙ 2 ) (\dot{\Theta}^2) (Θ˙2) n × 1 n \times 1 n×1阶关节速度平方矢量

单连杆模型

在这里插入图片描述

参数定义
l 2 c 2 = l 2 ′ l 3 c 23 = l 3 ′ l_2c_2 = l_2'\\ l_3c_{23} = l_3' l2c2=l2l3c23=l3
速度微分
v 2 = r θ 1 ˙ v 3 = ( l 1 ′ + r ) θ 1 ˙ v e = ( l 1 ′ + l 2 ′ ) θ 1 ˙ v_2 = r\dot{\theta_1}\\ v_3 = (l_1'+r)\dot{\theta_1}\\ v_e = (l_1'+l_2')\dot{\theta_1} v2=rθ1˙v3=(l1+r)θ1˙ve=(l1+l2)θ1˙
动能求取
E 2 = 1 2 m 2 l 2 ′ ∫ 0 l 2 ′ v 2 2 d r = 1 6 m 2 l 2 2 c 2 2 θ 1 ˙ 2   E 3 = 1 2 m 3 l 3 ′ ∫ 0 l 3 ′ v 3 2 d r = 1 2 m 3 l 2 2 c 2 2 θ 1 ˙ 2 + 1 2 m 3 l 2 l 3 c 2 c 3 θ 1 ˙ 2 + 1 6 m 3 l 3 2 c 3 2 θ 1 ˙ 2   E e = 1 2 m e ( l 2 ′ + l 3 ′ ) 2 θ 1 ˙ 2   E = E 2 + E 3 + E e E_2 = \frac{1}{2}\frac{m_2}{l_2'}\int_{0}^{l_2'} v_2^2\mathrm{d}r = \frac{1}{6}m_2l_2^2c_2^2\dot{\theta_1}^2\\~\\ E_3 = \frac{1}{2}\frac{m_3}{l_3'}\int_{0}^{l_3'} v_3^2\mathrm{d}r = \frac{1}{2}m_3l_2^2c_2^2\dot{\theta_1}^2 + \frac{1}{2}m_3l_2l_3c_2c_3\dot{\theta_1}^2 + \frac{1}{6}m_3l_3^2c_3^2\dot{\theta_1}^2\\~\\ E_e = \frac{1}{2}m_e(l_2'+l_3')^2\dot{\theta_1}^2\\~\\ E = E_2 + E_3 + E_e E2=21l2m20l2v22dr=61m2l22c22θ1˙2 E3=21l3m30l3v32dr=21m3l22c22θ1˙2+21m3l2l3c2c3θ1˙2+61m3l32c32θ1˙2 Ee=21me(l2+l3)2θ1˙2 E=E2+E3+Ee
势能求取
因为关节1的旋转方向与重力方向垂直,所以不受重力影响,即
G = 0 G = 0 G=0
创建动力学模型
将上述式子代入到拉格朗日公式中,即可求得
M ( Θ ) = 1 3 m 2 l 2 ′ 2 + 1 3 m 3 l 3 ′ 2 + m 3 l 2 ′ 2 + m 3 l 2 ′ l 3 ′   V ( Θ , Θ ˙ ) = 0   G ( Θ ) = 0   τ 1 = M ( Θ ) θ 1 ¨ M(\Theta) = \frac{1}{3}m_2l_2'^2 + \frac{1}{3}m_3l_3'^2 + m_3l_2'^2 + m_3l_2'l_3'\\~\\ V(\Theta, \dot{\Theta}) = 0\\~\\ G(\Theta) = 0\\~\\ \tau_1 = M(\Theta) \ddot{\theta_1} M(Θ)=31m2l2′2+31m3l3′2+m3l2′2+m3l2l3 V(Θ,Θ˙)=0 G(Θ)=0 τ1=M(Θ)θ1¨

双连杆模型

在这里插入图片描述
速度微分(采用极坐标的方式)
对于连杆2
{ x = r c 2 y = r s 2 ⇒ { x ˙ = − θ 2 ˙ r s 2 y ˙ = θ 2 ˙ r c 2   v 2 2 = x 2 + y 2 = r 2 θ 2 ˙ 2 \begin{cases} x =rc_2 \\y=rs_2 \end{cases}\Rightarrow \begin{cases} \dot{x} =-\dot{\theta_2}rs_2 \\\dot{y}=\dot{\theta_2}rc_2 \end{cases}\\~\\ v_2^2 = x^2 + y^2 = r^2\dot{\theta_2}^2 {x=rc2y=rs2{x˙=θ2˙rs2y˙=θ2˙rc2 v22=x2+y2=r2θ2˙2
对于连杆3
{ x = l 2 c 2 + r c 23 y = l 2 s 2 + r c s 23 ⇒ { x ˙ = − θ 2 ˙ l 2 s 2 − r ( θ 2 ˙ + θ 3 ˙ ) s 23 y ˙ = θ 2 ˙ l 2 c 2 + r ( θ 2 ˙ + θ 3 ˙ ) c 23   v 3 2 = x 2 + y 2 = l 2 2 θ 2 ˙ 2 + r 2 ( θ 2 ˙ + θ 3 ˙ ) 2 + 2 l 2 r c 3 θ 2 ˙ ( θ 2 ˙ + θ 3 ˙ ) \begin{cases} x =l_2c_2 + rc_{23} \\y=l_2s_2 + rcs_{23} \end{cases}\Rightarrow \begin{cases} \dot{x} =-\dot{\theta_2}l_2s_2 - r(\dot{\theta_2}+\dot{\theta_3})s_{23} \\ \dot{y} =\dot{\theta_2}l_2c_2 + r(\dot{\theta_2}+\dot{\theta_3})c_{23} \end{cases}\\~\\ v_3^2 = x^2 + y^2 = l_2^2\dot{\theta_2}^2 + r^2(\dot{\theta_2}+\dot{\theta_3})^2 + 2l_2rc_3\dot{\theta_2}(\dot{\theta_2}+\dot{\theta_3}) {x=l2c2+rc23y=l2s2+rcs23{x˙=θ2˙l2s2r(θ2˙+θ3˙)s23y˙=θ2˙l2c2+r(θ2˙+θ3˙)c23 v32=x2+y2=l22θ2˙2+r2(θ2˙+θ3˙)2+2l2rc3θ2˙(θ2˙+θ3˙)
对于末端质点
v e 2 = l 2 2 θ 2 ˙ 2 + l 3 2 ( θ 2 ˙ + θ 3 ˙ ) 2 + 2 l 2 l 3 c 3 θ 2 ˙ ( θ 2 ˙ + θ 3 ˙ ) v_e^2 = l_2^2\dot{\theta_2}^2 + l_3^2(\dot{\theta_2}+\dot{\theta_3})^2 + 2l_2l_3c_3\dot{\theta_2}(\dot{\theta_2}+\dot{\theta_3}) ve2=l22θ2˙2+l32(θ2˙+θ3˙)2+2l2l3c3θ2˙(θ2˙+θ3˙)

动能求取
E 2 = 1 2 m 2 l 2 ∫ 0 l 2 v 2 2 d r   E 3 = 1 2 m 3 l 3 ∫ 0 l 3 v 3 2 d r   E e = 1 2 m e v e 2   E = E 2 + E 3 + E e E_2 = \frac{1}{2}\frac{m_2}{l_2}\int_{0}^{l_2} v_2^2\mathrm{d}r \\~\\ E_3 = \frac{1}{2}\frac{m_3}{l_3}\int_{0}^{l_3} v_3^2\mathrm{d}r \\~\\ E_e = \frac{1}{2}m_ev_e^2\\~\\ E = E_2 + E_3 + E_e E2=21l2m20l2v22dr E3=21l3m30l3v32dr Ee=21meve2 E=E2+E3+Ee
势能求取
G 2 = 1 2 m 2 g l 2 s 2   G 3 = m 3 g l 2 s 2 + 1 2 m 3 g l 3 s 23   G e = m e g l 2 s 2 + m e g l 3 s 23 G_2 = \frac{1}{2}m_2gl_2s_2\\~\\ G_3 = m_3gl_2s_2 + \frac{1}{2}m_3gl_3s_{23}\\~\\ G_e = m_egl_2s_2 + m_egl_3s_{23} G2=21m2gl2s2 G3=m3gl2s2+21m3gl3s23 Ge=megl2s2+megl3s23
创建动力学模型
将上述式子代入到拉格朗日公式中,即可求得
M 23 = [ m 3 l 2 2 + 1 3 m 2 l 2 2 + 1 3 m 3 l 3 2 + m 3 l 2 l 3 c 3 1 3 m 3 l 3 2 + 1 2 m 3 l 2 l 3 c 3 1 3 m 3 l 3 2 + 1 2 m 3 l 2 l 3 c 3 1 3 m 3 l 3 2 ]   M e = [ m e l 2 2 + m e l 3 2 + 2 m e l 2 l 3 c 3 m e l 3 2 + m e l 2 l 3 c 3 m e l 3 2 + m e l 2 l 3 c 3 m e l 3 2 ]   B 23 = [ − m 3 l 2 l 3 s 3 0 0 0 ]   B e = [ − 2 m e l 2 l 3 s 3 0 0 0 ]   C 23 = [ 0 − 1 2 m 3 l 2 l 3 s 3 1 2 m 3 l 2 l 3 s 3 0 ]   C e = [ 0 − m e l 2 l 3 s 3 m e l 2 l 3 s 3 0 ]   G 23 = [ ( 1 2 m 2 + m 3 ) g l 2 c 2 + 1 2 m 3 g l 3 c 23 1 2 m 3 g l 3 c 23 ]   G e = [ m e g l 2 c 2 + m e g l 3 c 23 m e g l 3 c 23   ]   M_{23} = \begin{bmatrix} m_3l_2^2+ \frac{1}{3}m_2l_2^2 + \frac{1}{3}m_3l_3^2 + m_3l_2l_3c_3& \frac{1}{3}m_3l_3^2 + \frac{1}{2}m_3l_2l_3c_3\\ \frac{1}{3}m_3l_3^2 + \frac{1}{2}m_3l_2l_3c_3& \frac{1}{3}m_3l_3^2 \end{bmatrix}\\~\\ M_e= \begin{bmatrix} m_el_2^2+ m_el_3^2 + 2m_el_2l_3c_3& m_el_3^2 + m_el_2l_3c_3\\ m_el_3^2 + m_el_2l_3c_3& m_el_3^2 \end{bmatrix}\\~\\ B_{23} = \begin{bmatrix} -m_3l_2l_3s_3& 0\\ 0& 0 \end{bmatrix}\\~\\ B_e = \begin{bmatrix} -2m_el_2l_3s_3& 0\\ 0& 0 \end{bmatrix}\\~\\ C_{23} = \begin{bmatrix} 0& -\frac{1}{2}m_3l_2l_3s_3\\ \frac{1}{2}m_3l_2l_3s_3& 0 \end{bmatrix}\\~\\ C_e = \begin{bmatrix} 0& -m_el_2l_3s_3\\ m_el_2l_3s_3& 0 \end{bmatrix}\\~\\ G_{23} = \begin{bmatrix} (\frac{1}{2}m_2 + m_3)gl_2c_2 + \frac{1}{2}m_3gl_3c_{23}\\ \frac{1}{2}m_3gl_3c_{23} \end{bmatrix}\\~\\ G_e = \begin{bmatrix} m_egl_2c_2 + m_egl_3c_{23}\\ m_egl_3c_{23}\ \end{bmatrix}\\~\\ M23=[m3l22+31m2l22+31m3l32+m3l2l3c331m3l32+21m3l2l3c331m3l32+21m3l2l3c331m3l32] Me=[mel22+mel32+2mel2l3c3mel32+mel2l3c3mel32+mel2l3c3mel32] B23=[m3l2l3s3000] Be=[2mel2l3s3000] C23=[021m3l2l3s321m3l2l3s30] Ce=[0mel2l3s3mel2l3s30] G23=[(21m2+m3)gl2c2+21m3gl3c2321m3gl3c23] Ge=[megl2c2+megl3c23megl3c23 ] 
合并结果
M ( Θ ) = M 23 + M e B ( Θ ) = B 23 + B e C ( Θ ) = C 23 + C e G ( Θ ) = G 23 + G e   ( Θ ˙ Θ ˙ ) = θ 2 ˙ θ 3 ˙   ( Θ ˙ 2 ) = [ θ 2 ˙ 2 θ 3 ˙ 2 ]   τ 23 = [ τ 2 τ 3 ] = M ( Θ ) Θ ¨ + B ( Θ ) ( Θ ˙ Θ ˙ ) + C ( Θ ) ( Θ ˙ 2 ) + G ( Θ ) M(\Theta) = M_{23} + M_e \\ B(\Theta) = B_{23} + B_e\\ C(\Theta) = C_{23} + C_e\\ G(\Theta) = G_{23} + G_e\\\\~\\ (\dot{\Theta}\dot{\Theta}) = \dot{\theta_2}\dot{\theta_3}\\\\~\\ (\dot{\Theta}^2) = \begin{bmatrix} \dot{\theta_2}^2\\ \dot{\theta_3}^2 \end{bmatrix}\\~\\ \tau_{23} = \begin{bmatrix} \tau_2\\ \tau_3 \end{bmatrix} = M(\Theta)\ddot{\Theta}+B(\Theta)(\dot{\Theta}\dot{\Theta})+C(\Theta) (\dot{\Theta}^2)+G(\Theta) M(Θ)=M23+MeB(Θ)=B23+BeC(Θ)=C23+CeG(Θ)=G23+Ge (Θ˙Θ˙)=θ2˙θ3˙ (Θ˙2)=[θ2˙2θ3˙2] τ23=[τ2τ3]=M(Θ)Θ¨+B(Θ)(Θ˙Θ˙)+C(Θ)(Θ˙2)+G(Θ)
合并两个模型的结果,得到完整模型(模型矩阵也可以进行合并,这里就不给出结果了,读者可以自行计算)
τ = [ τ 1 τ 23 ] T = [ τ 1 τ 2 τ 3 ] \tau = \begin{bmatrix} \tau_1& \tau_{23} \end{bmatrix}^T = \begin{bmatrix} \tau_1\\ \tau_2\\ \tau_3 \end{bmatrix} τ=[τ1τ23]T= τ1τ2τ3

代码实现

template <typename T>
void Dynamics(const Vec6<T>& q, const Vec6<T>& qd, const Vec6<T>& qdd, Vec6<T>* tau){
    /* define params */
    T m1 = _upperarmLinkMass;
    T m2 = _forearmLinkMass;
    T l1 = _upperarmLinkLength;
    T l2 = _forearmLinkLength;
    T t1 = M_PI_2 - q(1);
    T t2 = -q(2);

    /* ------------------------------------ double link model -------------------------------------------- */
    Mat2<T> M;
    M(0,0) = m2*pow(l1,2) + (1./3.)*m1*pow(l1,2) + (1./3.)*m2*pow(l2,2) + m2*l1*l2*cos(t2);
    M(0,1) = (1./3.)*m2*pow(l2,2) + (1./2.)*m2*l1*l2*cos(t2);
    M(1,0) = (1./3.)*m2*pow(l2,2) + (1./2.)*m2*l1*l2*cos(t2);
    M(1,1) = (1./3.)*m2*pow(l2,2);

    Mat2<T> A = Mat2<T>::Zero();
    A(0,1) = -(1./2.)*m2*l1*l2*sin(t2);
    A(1,0) = (1./2.)*m2*l1*l2*sin(t2);

    Mat2<T> B = Mat2<T>::Zero();
    B(0,0) = -m2*l1*l2*sin(t2);

    Vec2<T> G;
    T g = 9.81;
    G(0) = ((1./2.)*m1 + m2)*g*l1*cos(t1) + (1./2.)*m2*g*l2*cos(t1+t2);
    G(1) = (1./2.)*m2*g*l2*cos(t1+t2);

    /* consider tail mass */
    T me = *links_mass[3] + *links_mass[4] + *links_mass[5];

    /* adjustment coefficient */
    M(0,0) += me*pow(l1,2) + me*pow(l2,2) + 2*l1*l2*me*cos(t2);
    M(0,1) += me*pow(l2,2) + l1*l2*me*cos(t2);
    M(1,0) += me*pow(l2,2) + l1*l2*me*cos(t2);
    M(1,1) += me*pow(l2,2);

    A(0,1) += -me*l1*l2*sin(t2);
    A(1,0) += me*l1*l2*sin(t2);

    B(0,0) += -2*me*l1*l2*sin(t2);

    G(0) += me*g*l1*cos(t1) + me*g*l2*cos(t1+t2);
    G(1) += me*g*l2*cos(t1+t2);

    /* compute tau */
    Vec2<T> qd_2(pow(qd[1],2), pow(qd[2],2));
    Vec2<T> qd_mix(qd[1]*qd[2], qd[1]*qd[2]);
    Vec2<T> _qdd(qdd[1], qdd[2]);

    Vec2<T> V = A*qd_2 + B*qd_mix;
    Vec2<T> _tau = M*_qdd + V + G;
    tau->operator()(1) = -_tau(0);
    tau->operator()(2) = -_tau(1);

    /* ------------------------------------ sigle link model -------------------------------------------- */
    T _l1 = l1*cos(t1);
    T _l2 = l2*cos(t2);

    T A_0 = (1./3.)*m1*pow(_l1,2) + (1./3.)*m2*pow(_l2,2) + m2*pow(_l1,2) + m2*_l1*_l2;

    /* consider tail mass */
    A_0 += me*pow(_l1+_l2,2);

    /* compute tau */
    T tau_0 = A_0*qdd[0];
    tau->operator()(0) = tau_0;

    /* no control data for other three joint */
    tau->operator()(3) = 0;
    tau->operator()(4) = 0;
    tau->operator()(5) = 0;
}

3. 计算雅克比矩阵

雅克比矩阵同样是针对于上面简化后的模型进行求取。
运动学关系
x = ( l 2 c 2 + l 3 c 23 ) c 1 y = ( l 2 c 2 + l 3 c 23 ) s 1 z = l 2 s 2 + l 3 s 23 x = (l_2c_2 + l_3c_{23})c_1\\ y = (l_2c_2 + l_3c_{23})s_1\\ z = l_2s_2 + l_3s_{23} x=(l2c2+l3c23)c1y=(l2c2+l3c23)s1z=l2s2+l3s23
微分得雅克比矩阵
v = [ x ˙ y ˙ z ˙ ] = [ − l 2 s 1 c 2 − l 3 s 1 c 23 − l 2 c 1 s 2 − l 3 c 1 s 23 − l 3 c 1 s 23 l 2 c 1 c 2 + l 3 c 1 c 23 − l 2 s 1 s 2 − l 3 s 1 s 23 − l 3 s 1 s 23 0 l 2 c 2 + l 3 c 23 l 3 c 23 ] [ θ 1 ˙ θ 2 ˙ θ 3 ˙ ]   J = [ − l 2 s 1 c 2 − l 3 s 1 c 23 − l 2 c 1 s 2 − l 3 c 1 s 23 − l 3 c 1 s 23 l 2 c 1 c 2 + l 3 c 1 c 23 − l 2 s 1 s 2 − l 3 s 1 s 23 − l 3 s 1 s 23 0 l 2 c 2 + l 3 c 23 l 3 c 23 ] v = \begin{bmatrix}\dot{x} \\ \dot{y} \\ \dot{z} \end{bmatrix} = \begin{bmatrix} -l_2s_1c_2-l_3s_1c_{23} & -l_2c_1s_2-l_3c_1s_{23} & -l_3c_1s_{23} \\ l_2c_1c_2+l_3c_1c_{23} & -l_2s_1s_2-l_3s_1s_{23} & -l_3s_1s_{23} \\ 0 & l_2c_2+l_3c_{23} & l_3c_{23} \\ \end{bmatrix} \begin{bmatrix}\dot{\theta_1} \\ \dot{\theta_2} \\ \dot{\theta_3} \end{bmatrix} \\~\\ J = \begin{bmatrix} -l_2s_1c_2-l_3s_1c_{23} & -l_2c_1s_2-l_3c_1s_{23} & -l_3c_1s_{23} \\ l_2c_1c_2+l_3c_1c_{23} & -l_2s_1s_2-l_3s_1s_{23} & -l_3s_1s_{23} \\ 0 & l_2c_2+l_3c_{23} & l_3c_{23} \\ \end{bmatrix} v= x˙y˙z˙ = l2s1c2l3s1c23l2c1c2+l3c1c230l2c1s2l3c1s23l2s1s2l3s1s23l2c2+l3c23l3c1s23l3s1s23l3c23 θ1˙θ2˙θ3˙  J= l2s1c2l3s1c23l2c1c2+l3c1c230l2c1s2l3c1s23l2s1s2l3s1s23l2c2+l3c23l3c1s23l3s1s23l3c23

代码实现

template <typename T>
void computeJacobian(const Vec6<T>& q, Mat6<T>* J){
    T l2 = _upperarmLinkLength;
    T l3 = _forearmLinkLength;
    T t1 = q(0);
    T t2 = M_PI_2 - q(1);
    T t3 = -q(2);
    Mat6<T> J_ = Mat6<T>::Zero();
    Mat3<T> J_block;
    J_block(0, 0) = -l2*sin(t1)*cos(t2) - l3*sin(t1)*cos(t2+t3);
    J_block(0, 1) = -l2*cos(t1)*sin(t2) - l3*cos(t1)*sin(t2+t3);
    J_block(0, 2) = -l3*cos(t1)*sin(t2+t3);
    J_block(1, 0) = l2*cos(t1)*cos(t2) + l3*cos(t1)*cos(t2+t3);
    J_block(1, 1) = -l2*sin(t1)*sin(t2)  - l3*sin(t1)*sin(t2+t3);;
    J_block(1, 2) = -l3*sin(t1)*sin(t2+t3);    
    J_block(2, 0) = 0;
    J_block(2, 1) = l2*cos(t2) + l3*cos(t2+t3);
    J_block(2, 2) = l3*cos(t2+t3);     

    /* convert to model */
    Mat3<T> model_convert = Mat3<T>::Identity();
    model_convert(1,1) = -1;
    model_convert(2,2) = -1;
    J_block = J_block * model_convert;
    J_.block(0, 0, 3, 3) = J_block;
    *J = J_;
}

4. 优化

添加控制器
因为上述模型将末端等效为了一个节点,在仿真的时候,控制轨迹与理想轨迹是会存在有一定误差的,所以可以添加一个笛卡尔坐标系下的PID控制器,减小误差。
f = K p ( p d e s − p ) + K d ( v d e s − v )   τ o u t = J T f + τ f = K_p(p_{des} - p) + K_d(v_{des} - v)\\~\\ \tau_{out} = J^Tf + \tau f=Kp(pdesp)+Kd(vdesv) τout=JTf+τ
K p K_p Kp 3 × 3 3 \times 3 3×3阶对角矩阵,对角元素为各个轴的PID比例系数。
K d K_d Kd 3 × 3 3 \times 3 3×3阶对角矩阵,对角元素为各个轴的PID微分系数。
p d e s p_{des} pdes 3 × 1 3 \times 1 3×1阶矩阵,末端目标位置。
v d e s v_{des} vdes 3 × 1 3 \times 1 3×1阶矩阵,末端目标速度。
p p p 3 × 1 3 \times 1 3×1阶矩阵,末端当前位置。
v v v 3 × 1 3 \times 1 3×1阶矩阵,末端当前速度。
τ \tau τ 3 × 1 3 \times 1 3×1阶矩阵,上述动力学输出。

修改建模方向
在本文章建立的动力学模型中,关节2和关节3的转动的方向与上一篇运动学模型的方向相反。
【基于机械臂触觉伺服的物体操控研究】UR5e运动学建模及代码实现
这样子会导致实际应用时,需要修改部分数据的正负以适配模型
所以读者在建立自己的动力学模型时,可以注意这个点,保证动力学,运动学模型,以及实际物理模型的坐标系方向都一一对应

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/162997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

台阶问题-

台阶问题 题目描述 有NNN级的台阶&#xff0c;你一开始在底部&#xff0c;每次可以向上迈最多KKK级台阶&#xff08;最少111级&#xff09;&#xff0c;问到达第NNN级台阶有多少种不同方式。 输入格式 两个正整数N&#xff0c;K。 输出格式 一个正整数&#xff0c;为不同…

JVM(一)——架构基础

JVM java虚拟机 java gc 主要回收的是 方法区 和 堆中的内容&#xff0c;以下架构图是重点&#xff1a; 方法区和堆是线程共享&#xff0c;java栈、本机方法栈、程序计数器是线程私有。 运行时数据区可以用Runtime.getRuntime()获取 字节码执行引擎&#xff0c;修改程序计数器…

不要怀疑了,个人也是可以做好跨境电商的!

近几年随着跨境电商卖家们赚得盆满钵满&#xff0c;许多人都想从中分一杯羹&#xff0c;进而入住了跨境电商市场&#xff0c;有人与一些公司企业合作&#xff0c;也有人选择了自己做跨境电商平台&#xff0c;个人做的优劣势又有哪些呢&#xff1f; 个人做跨境电商平台最明显突…

A V L树

概念 在之前介绍了搜索二叉树&#xff0c;但是当我们插入的数据若是有序或者接近于有序&#xff0c;那么此时查找的效率底下&#xff0c;于是俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法&#xff1a;当向二叉搜索树中插入新结点后&am…

javaEE学生教学实习计划申报系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 javaEE学生教学实习计划申报系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql&…

正点原子【第四期】手把手教你学 Linux之驱动开发篇-01

学习目的 了解驱动开发和应用开发的过程&#xff0c;具有一定的基础就行 第一讲&#xff1a;linux驱动开发与裸机开发区别 刚开始听不懂很正常&#xff0c;等之后学了一点你就会知道它说啥了 第二讲&#xff1a;字符设备驱动开发基础 字符设备驱动是最简单的&#xff0c;块设…

C++ 移动语义

从拷贝说起我们知道&#xff0c;C中有拷贝构造函数和拷贝赋值运算符。那既然是拷贝&#xff0c;听上去就是开销很大的操作。没错&#xff0c;所谓拷贝&#xff0c;就是申请一块新的内存空间&#xff0c;然后将数据复制到新的内存空间中。如果一个对象中都是一些基本类型的数据的…

【Unity3D】绘制物体外框线条盒子

1 需求描述 点选物体、框选物体、绘制外边框 中介绍了物体投影到屏幕上的二维外框绘制方法&#xff0c;本文将介绍物体外框线条盒子绘制方法。 内框&#xff1a;选中物体后&#xff0c;绘制物体的内框&#xff08;紧贴物体、并与物体姿态一致的内框盒子&#xff09;外框&#…

Python与C++语法比较--字符串篇

tags: C Python 写在前面 刷lc从Python转向C, 不只是语法层面, 还要改变很多的API, 这次记录一下C和Python在字符串方面的一些区别, 供参考. 基本区别 Python字符串是不可变类型, 而C的String为容器(本质上是一个类的别名, 说容器有点不合适, 因为容器内的元素类型已经被指…

Kotlin中的Lambda编程

文章目录1.集合的创建与遍历2.集合的函数式API3.Java函数式API的使用1.集合的创建与遍历 传统意义上的集合主要是List和Set&#xff0c;再广泛一点的话&#xff0c;像Map这样的键值对数据结构也可以包含进来。List&#xff0c;Set和Map再Java中都是接口&#xff0c;List主要的…

Java设计模式-命令模式Command

介绍 命令模式&#xff08;Command Pattern&#xff09;&#xff1a;在软件设计中&#xff0c;我们经常需要向某些对象发送请求&#xff0c;但是并不知道请求的接收 者是谁&#xff0c;也不知道被请求的操作是哪个&#xff0c; 我们只需在程序运行时指定具体的请求接收者即可&…

数影周报:TikTok因在线跟踪被罚500万欧,Windows 7退出历史舞台

本周看点&#xff1a;TikTok因在线跟踪被法国罚款500万欧元 &#xff1b;思科已裁员近700 人&#xff1b;Windows 7退出历史舞台&#xff1b;亚马逊向所有卖家开放Buy with Prime服务&#xff1b;“全路程”完成2亿元C轮融资......数据安全那些事TikTok因在线跟踪被法国罚款500…

Android13 wifi无线调试adb连接设置

在进行adb调试的时候&#xff0c;有时候需要使用wifi连接&#xff0c;或者wifi连接较为方便&#xff0c;早些的Android上&#xff0c;需要设置端口等操作&#xff0c;adb tcpip 6666参考android wifi adb 调试 - 简书 (jianshu.com)好几步操作&#xff0c;在Android13上&#x…

Deque 的理解 STL中stack与queue为什么选择使用deque为底层模板容器

目录 一、Deque的引入 二、Deque是什么&#xff1f; 三、deque的遍历方式&#xff1f;deque的缺陷&#xff1f; 四、它为什么能更贴合与stack与queue&#xff1f; 五、STL中vector与list的底层实现 一、Deque的引入 Stack、Queue在之前的博客中我也是分别使用了更容易处理…

【蓝桥杯】历届真题 杨辉三角形 (省赛)Java

【问题描述】 下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列&#xff0c;可以得到如下数列: 1,1&#xff0c;1&#xff0c;1&#xff0c;2,1&#xff0c;1&#xff0c;3,3&#xff0c;1&#xff0c;1,4&#xff0c;6,4&#xff0c;1&…

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 (六)多功能数据处理器

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 &#xff08;六&#xff09;多功能数据处理器 &#x1f508;声明&#xff1a; &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN博客 &#x1f9e8;未经作者允许&#xff0c;禁止转载 &#x1f511;系列专栏&#xff1a;牛客…

react基础Day02-受控组件评论案例propscontext

React组件 目标 能够知道受控组件是什么能够写出受控组件了解非受控组件 表单处理 受控组件&#xff08;★★★&#xff09; HTML中的表单元素是可输入的&#xff0c;也就是有自己的可变状态而React中可变状态通常保存在state中&#xff0c;并且只能通过setState() 方法来…

[acwing周赛复盘] 第 86 场周赛20230114

[acwing周赛复盘] 第 86 场周赛20230114 一、本周周赛总结二、 4794. 健身1. 题目描述2. 思路分析3. 代码实现三、4795. 安全区域1. 题目描述2. 思路分析3. 代码实现四、4796. 删除序列1. 题目描述2. 思路分析3. 代码实现六、参考链接一、本周周赛总结 去吃羊蝎子了&#xff0…

基于汽车知识图谱的汽车问答多轮对话系统 详细教程

结果: 1 技术路线 该技术路线主要将KBQA分为三部分,实体识别与实体链接,关系识别,sparql查询,其中每个部分分为一到多种方法实现。具体的处理流程图如下:

大脑的记忆

AI神经网络中的记忆 当前AI发展进入一个瓶颈,大家都意识到还是要继续在人脑中获取AI方向的指引。当然也有科学家说物理世界与心理世界并非一一对应,人类的智能也没必要与物理世界一一对应,甚至本质上都可以是不同的,所以没必要研究大脑认知和大脑的机制,更不需要分子级别…