关于机器人机械臂参数辨识

这篇具有很好参考价值的文章主要介绍了关于机器人机械臂参数辨识。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前几天在逛github发现一个dynamic identification的仓库,代码非常全。同时也看了对应的文章,虽然参数辨识不是文章最终目的,但是仍能感受到作者在参数辨识领域的了解程度和功底。这篇博客主要记录一下这几天学习该仓库的一些心得吧,对机器人参数辨识有兴趣的小伙伴欢迎交流。


这是我用的仿真文件,有需要的小伙伴可以参考一下:
仿真文件地址

1.仓库地址

dynamic_calibration

2.文献地址

Practical Aspects of Model-Based Collision Detection,文章作者来自俄罗斯Innopolis University

3.代码简介

研究的机器人对象为UR10e,自重33.5kg、负载12.5kg、是UR公司主打一款大负载机械臂。
关于机器人机械臂参数辨识
开源代码涉及到比较全的机器人学知识,尤其是在动力学dynamics部分,主要包括拉格朗日法建立动力学模型,经典库伦粘滞摩擦模型 、 非线性摩擦模型 、动力学参数辨识模型、QR分解提取最小惯性参数集。参数辨识部分包含激励轨迹的设计、参数辨识、信号处理及最后的辨识结果验证。此外提供UR10e的URDF文件,可以说一条龙地从动力学到参数辨识进行了分享教学,个人觉得是非常好的一个学习机械臂动力学的仓库。
关于机器人机械臂参数辨识

4.文献简介

从文章标题不难得出本文是利用基于机器人动力学模型的方法进行碰撞检测,虽然不是Top期刊,但是读一读总是没有错的,接下来我们一起看一下他的参数辨识部分内容,按照7个部分1:

4.1 回归矩阵(Dynamic Model in Regressor Form)

第一部分其实就是我们所熟知的动力学模型线性化,即在不考虑摩擦的情况下,假设连杆均为刚体(不考虑连杆柔性),机器人动力学模型可以写成其惯性参数的线性形式
Y ( q , q ˙ , q ¨ ) π = τ Y(q,\dot{q},\ddot{q})\pi=\tau Y(q,q˙,q¨)π=τ
其中,我们要注意的是这里的 π \pi π,最开始我们所说的惯性参数集是完整惯性参数集standrad parameters),在很多地方会写成如下的形式:
π i = [ I i x x , I i x y , I i x z , I i y y , I i y z , I i z z , m i r x , m i r y , m i r z , m i ] T ∈ R 10 × 1 \pi_i=[I_{ixx},I_{ixy},I_{ixz},I_{iyy},I_{iyz},I_{izz},m_ir_x,m_ir_y,m_ir_z,m_i]^T\in{R^{10\times1}} πi=[Iixx,Iixy,Iixz,Iiyy,Iiyz,Iizz,mirx,miry,mirz,mi]TR10×1
其中, h i T = m i p i c , p i c = [ r x , r y , r z ] T h_i^T=m_ip_{ic},p_{ic}=[r_x,r_y,r_z]^T hiT=mipic,pic=[rx,ry,rz]T做质量一阶矩(the first moment of mass), L i L_i Li是相对于连杆坐标系的,与相对于质心的惯性张量有如下关系(Huygens-Steiner)2
L k = I k + 1 m i S ( l i ) T S ( l i ) = I k + m i S ( p i c ) 2 L_k=I_k+\frac1{m_i}S(l_i)^TS(l_i)=I_k+m_iS(p_{ic})^2 Lk=Ik+mi1S(li)TS(li)=Ik+miS(pic)2

相对质心的惯性张量是常数,但为什么要选择相对连杆坐标系的惯性张量呢?因为在dynamic calibration中我们很容易获取机器人的运动学参数,但是并不知道质心位置,因此选择相对连杆坐标系的惯性张量,且连杆坐标系{i}与其质心坐标系姿态保持一致

然而,在实际情况下,仍需要考虑关节摩擦和关节转动惯量 J i J_i Ji对力矩的影响。因此,有如下表达式:
π i = [ I i x x , I i x y , I i x z , I i y y , I i y z , I i z z , m i r x , m i r y , m i r z , m i , J i , f v i , f c i , f 0 i ] T ∈ R 14 × 1 \pi_i=[I_{ixx},I_{ixy},I_{ixz},I_{iyy},I_{iyz},I_{izz},m_ir_x,m_ir_y,m_ir_z,m_i,J_i,f^i_v,f^i_c,f^i_0]^T\in{R^{14\times1}} πi=[Iixx,Iixy,Iixz,Iiyy,Iiyz,Iizz,mirx,miry,mirz,mi,Ji,fvi,fci,f0i]TR14×1

下面结合代码来看他的回归矩阵 Y ( ⋅ ) Y(\cdot) Y()是如何得到的,采用符号工具箱进行了推导。

% 首先创建了关节的广义坐标及其一阶和二阶导数
q_sym = sym('q%d',[6,1],'real');
qd_sym = sym('qd%d',[6,1],'real');
q2d_sym = sym('q2d%d',[6,1],'real');

% ------------------------------------------------------------------------
% 求能量函数
% ------------------------------------------------------------------------
T_pk = sym(zeros(4,4,6));     %连杆之间的转换矩阵
w_kk(:,1) = sym(zeros(3,1));  % 坐标系K的角速度
v_kk(:,1) = sym(zeros(3,1));  %坐标系K原点 的线速度
g_kk(:,1) = sym([0,0,9.81])'; % 重力加速度向量
p_kk(:,1) = sym(zeros(3,1));  % 坐标系K的原点

for i = 1:6
    jnt_axs_k = str2num(ur10.robot.joint{i}.axis.Attributes.xyz)';
    % Transformation from parent link frame p to current joint frame
    rpy_k = sym(str2num(ur10.robot.joint{i}.origin.Attributes.rpy));
    R_pj = RPY(rpy_k);
    R_pj(abs(R_pj)<sqrt(eps)) = sym(0); % to avoid numerical errors
    p_pj = str2num(ur10.robot.joint{i}.origin.Attributes.xyz)';
    T_pj = sym([R_pj, p_pj; zeros(1,3), 1]); % to avoid numerical errors
    % Tranformation from joint frame of the joint that rotaties body k to
    % link frame. The transformation is pure rotation
    R_jk = Rot(q_sym(i),sym(jnt_axs_k));
    p_jk = sym(zeros(3,1));
    T_jk = [R_jk, p_jk; sym(zeros(1,3)),sym(1)];
    % Transformation from parent link frame p to current link frame k
    T_pk(:,:,i) = T_pj*T_jk;
    z_kk(:,i) = sym(jnt_axs_k);
        
    w_kk(:,i+1) = T_pk(1:3,1:3,i)'*w_kk(:,i) + sym(jnt_axs_k)*qd_sym(i);
    v_kk(:,i+1) = T_pk(1:3,1:3,i)'*(v_kk(:,i) + cross(w_kk(:,i),sym(p_pj)));
    g_kk(:,i+1) = T_pk(1:3,1:3,i)'*g_kk(:,i);
    p_kk(:,i+1) = T_pk(1:3,1:3,i)'*(p_kk(:,i) + sym(p_pj));
     
    % 动能   
    beta_K(i,:) = [sym(0.5)*w2wtlda(w_kk(:,i+1)),...
                   v_kk(:,i+1)'*vec2skewSymMat(w_kk(:,i+1)),...
                   sym(0.5)*v_kk(:,i+1)'*v_kk(:,i+1)];
    % 势能
    beta_P(i,:) = [sym(zeros(1,6)), g_kk(:,i+1)',...
                   g_kk(:,i+1)'*p_kk(:,i+1)];
end


% ---------------------------------------------------------------------
% 递归拉格朗日求回归函数
% ---------------------------------------------------------------------
beta_Lf = [beta_K(1,:) - beta_P(1,:), beta_K(2,:) - beta_P(2,:),...
         beta_K(3,:) - beta_P(3,:), beta_K(4,:) - beta_P(4,:),...
         beta_K(5,:) - beta_P(5,:), beta_K(6,:) - beta_P(6,:)];
dbetaLf_dq = jacobian(beta_Lf,q_sym)';
dbetaLf_dqd = jacobian(beta_Lf,qd_sym)';
tf = sym(zeros(6,60));
for i = 1:6
   tf = tf + diff(dbetaLf_dqd,q_sym(i))*qd_sym(i)+...
                diff(dbetaLf_dqd,qd_sym(i))*q2d_sym(i);
end
Y_f = tf - dbetaLf_dq;

4.2 最小惯性参数集(Base Parameters)

通过淘汰对动力学模型无影响的参数同时对剩下的参数进行重新组合从而形成最小惯性参数集合,这里一般有两种方法,解析法34数值法5。解析法是利用机器人的运动学和机器人构型进行复杂的推导判断而得出,霍伟教授编撰的《机器人动力学与控制》中有详细的介绍;数值法一般是基于QRSVD分解进行的,其中QR分解是首选的计算方法。

我们可以首先回顾一下什么是QR分解

QR分解常用于解决线性最小二乘问题,是特定特征值算法的基础。若 A A A是一个方阵,则有 A = Q R A=QR A=QR Q Q Q是一个正交矩阵( Q T = Q − 1 Q^T=Q^{-1} QT=Q1), R R R是一个上三角矩阵。但可能通常我们面对的是非方阵,即 A m × n A^{m\times{n}} Am×n,且 m > n m>n m>n。那么有
A = Q R = Q [ R 1 0 ] = [ Q 1 Q 2 ] [ R 1 0 ] = Q 1 R 1 A=QR=Q\left[ \begin{array}{c} R_1 \\0 \end{array} \right ]=\left[ \begin{array}{c} Q_1 \\Q_2 \end{array} \right ]\left[ \begin{array}{c} R_1 \\0 \end{array} \right ]=Q_1R_1 A=QR=Q[R10]=[Q1Q2][R10]=Q1R1
QR分解与格拉姆-施密特正交化的相关知识可参考这儿

接下来看一下一般的步骤,我按照1990年的一篇文章(参考文献5)提到的方法进行阐述一下:
1. 剔除不会影响动力学模型的参数

如果 Y ( ⋅ ) Y(\cdot) Y()的某一列(假设为第 i i i列)对于任何的 ( q , q ˙ , q ¨ ) (q,\dot{q},\ddot{q}) (q,q˙,q¨)都为0,那么其对应的 π i \pi_i πi则不会对模型产生影响。我们可以给随机的 ( q , q ˙ , q ¨ ) (q,\dot{q},\ddot{q}) (q,q˙,q¨)来简单判断这些列,并将它们剔除,假设最后只剩下 c c c列,我们称之为 Y ( ⋅ ) c Y(\cdot)_c Y()c

3. 惯性参数重组
我们给 e e e组随机 ( q , q ˙ , q ¨ ) (q,\dot{q},\ddot{q}) (q,q˙,q¨)并生成回归矩阵序列 W r × c W^{r\times{c}} Wr×c,如下所示:
W = [ Y ( 1 ) c Y ( 2 ) c . . . Y ( e ) c ] , r = n × e ⩾ c W=\left[ \begin{array}{c} Y(1)_c \\ Y(2)_c \\ ... \\ Y(e)_c \end{array} \right ], r=n\times{e}\geqslant{c} W= Y(1)cY(2)c...Y(e)c ,r=n×ec
接下来采用QR分解:
Q T W = R = [ R 1 c × c 0 ( r − c ) × c ] Q^TW=R=\left[ \begin{array}{c} R_1^{c\times{c}} \\ 0^{(r-c)\times{c}} \end{array} \right ] QTW=R=[R1c×c0(rc)×c]
Q Q Q是正交矩阵,所以放到左边了。 R 1 R_1 R1是一个上三角矩阵。如果 W W W不是满秩的,即 r a n k ( W ) = b < c rank(W)=b<c rank(W)=b<c,那么它就不会有唯一的 Q R QR QR分解。 R 1 R_1 R1中其实会有 b b b个非零的对角元素, c − b c-b cb个近似为0的对角元素(因为舍入误差的原因,所以近似为0,本该是为0的)。对于那些近似为0的对角线元素 R 1 i i R_1ii R1ii所对应的惯性参数是无法单独辨识。

但我们可以寻找一个置换矩阵 E E E,使得 W ∗ E W*E WE是有唯一分解的, W ∗ E = Q ∗ R W*E=Q*R WE=QR,即
W E = Q R = [ Q 1 Q 2 ] [ R 1 b × b R 2 b × c − b 0 ( r − b ) × b 0 ( r − b ) × c − b ] WE=QR=\left[ \begin{array}{c} Q_1 & Q_2 \end{array} \right ]\left[ \begin{array}{cc} R_1^{b\times{b}} & R_2^{b\times{c-b}} \\ 0^{(r-b)\times{b}} & 0^{(r-b)\times{c-b}} \end{array} \right ] WE=QR=[Q1Q2][R1b×b0(rb)×bR2b×cb0(rb)×cb]
且这个置换矩阵也满足如下:
E T π = [ π 1 b × 1 π 2 ( c − b ) × 1 ] E^T\pi=\left[ \begin{array}{c} \pi_1^{b\times{1}} \\ \pi_2^{(c-b)\times{1}} \end{array} \right ] ETπ=[π1b×1π2(cb)×1]
因此有
W = [ W 1 W 2 ] = [ Q 1 R 1 Q 2 R 2 ] W= \left[ \begin{array}{c} W_1 & W_2 \end{array} \right ]=\left[ \begin{array}{c} Q_1R_1& Q_2R_2 \end{array} \right ] W=[W1W2]=[Q1R1Q2R2]
通过上式可以得出 W 1 = W 2 β , β = R 1 − 1 R 2 W_1=W_2\beta,\beta=R_1^{-1}R_2 W1=W2β,β=R11R2,这其实意味着 W 2 W_2 W2 ( c − b ) (c-b) (cb)列是 W 1 W_1 W1 b b b列的线性组合。那么,惯性参数其实就呼之欲出了:
π b = π 1 + β π 2 \pi_b=\pi_1+{\beta\pi_2} πb=π1+βπ2
3. 辨识方程
其对应的回归矩阵为 W b = W E ( : , 1 : b ) W_b=WE(:,1:b) Wb=WE(:,1:b),对应的辨识方程为 τ = W b π b \tau=W_b\pi_b τ=Wbπb.
下面我们可以看一下他这块的代码:

% Seed the random number generator based on the current time
rng('shuffle');

% ------------------------------------------------------------------------
% 位置速度和加速度限制
% ------------------------------------------------------------------------
q_min = -pi*ones(6,1);
q_max = pi*ones(6,1);
qd_max = 3*pi*ones(6,1);
q2d_max = 6*pi*ones(6,1); 

% -----------------------------------------------------------------------
% 完整动力学参数集的符号形式
% -----------------------------------------------------------------------
m = sym('m%d',[6,1],'real');
hx = sym('h%d_x',[6,1],'real');
hy = sym('h%d_y',[6,1],'real');
hz = sym('h%d_z',[6,1],'real');
ixx = sym('i%d_xx',[6,1],'real');
ixy = sym('i%d_xy',[6,1],'real');
ixz = sym('i%d_xz',[6,1],'real');
iyy = sym('i%d_yy',[6,1],'real');
iyz = sym('i%d_yz',[6,1],'real');
izz = sym('i%d_zz',[6,1],'real');
im = sym('im%d',[6,1],'real');

% Load parameters attached to the end-effector
syms ml hl_x hl_y hl_z il_xx il_xy il_xz il_yy il_yz il_zz      real 

% 组成60*1的向量
for i = 1:6
    if includeMotorDynamics
        pi_lgr_sym(:,i) = [ixx(i),ixy(i),ixz(i),iyy(i),iyz(i),izz(i),...
                           hx(i),hy(i),hz(i),m(i),im(i)]';
    else
        pi_lgr_sym(:,i) = [ixx(i),ixy(i),ixz(i),iyy(i),iyz(i),izz(i),...
                           hx(i),hy(i),hz(i),m(i)]';
    end
end
[nLnkPrms, nLnks] = size(pi_lgr_sym);
pi_lgr_sym = reshape(pi_lgr_sym, [nLnkPrms*nLnks, 1]);


% -----------------------------------------------------------------------
% 寻找独立列和相关列之间的关系(线性组合关系)
% -----------------------------------------------------------------------
% 获取回归矩阵
W = [];    
for i = 1:25
    q_rnd = q_min + (q_max - q_min).*rand(6,1);
    qd_rnd = -qd_max + 2*qd_max.*rand(6,1);
    q2d_rnd = -q2d_max + 2*q2d_max.*rand(6,1);
    
    if includeMotorDynamics
        Y = regressorWithMotorDynamics(q_rnd,qd_rnd,q2d_rnd);
    else
        Y = full_regressor_UR10E(q_rnd,qd_rnd,q2d_rnd);
    end
    W = vertcat(W,Y);
end

% QR分解: W*E = Q*R
%   R is 上三角矩阵
%   Q is 酉矩阵
%   E is 置换矩阵
[Q, R, E] = qr(W);

% W的秩为b,即base parameter的数量
bb = rank(W);

% R = [R1 R2; 
%      0  0]
% R1 is bbxbb上三角正则矩阵
% R2 is bbx(c-bb) matrix where c is number of standard parameters
R1 = R(1:bb,1:bb);
R2 = R(1:bb,bb+1:end);
beta = R1\R2; % the zero rows of K correspond to independent columns of WP
beta(abs(beta)<sqrt(eps)) = 0; % get rid of numerical errors
% W2 = W1*beta

% 确保关系成立
W1 = W*E(:,1:bb);
W2 = W*E(:,bb+1:end);
assert(norm(W2 - W1*beta) < 1e-6,... 
        'Found realationship between W1 and W2 is not correct\n');

% -----------------------------------------------------------------------
% 最小惯性参数集
% -----------------------------------------------------------------------
pi1 = E(:,1:bb)'*pi_lgr_sym; % independent paramters
pi2 = E(:,bb+1:end)'*pi_lgr_sym; % dependent paramteres

% all of the expressions below are equivalent
pi_lgr_base = pi1 + beta*pi2;
% pi_lgr_base = [eye(bb) beta]*[pi1;pi2];
% pi_lgr_base = [eye(bb) beta]*E'*pi_lgr_sym;

4.3 轨迹规划(trajectory planning)

4.4 数据采集(Data Collecting)

4.5 数据处理(Data Processing)

4.6 参数估计(Parameters Estimation)

4.7 结果验证(Results Validation)

5.自身学习

我准备先在仿真里面进行测试,即在simscape中对机器人模型进行参数辨识,与已知结果(三维软件测量)进行对比。


2022.08.02更新:仿真结果不错,下面简单介绍一下:

5.1 仿真环境

我选取了一个七轴协作机械臂模型,具体型号就不说了。拿到一个机器人三维模型的第一件事,根据模型的几何参数,采用MDH法定义其连杆坐标系。然后在soldworks中进行相关设置(质量分配、坐标系定义、旋转轴设定及其方向确定)并导出其URDF文件,URDF文件里面包含了我们做动力学仿真所需要的一切参数,参数辨识的结果可以和solidworks中的质量参数进行比较。最后将URDF文件导入MATLAB的SimScape中,如下图所示。
关于机器人机械臂参数辨识

5.2 最小参数集

因为是做仿真,可以不考虑摩擦和电机惯量等因素,因此我设立的完整惯性参数集为 P 70 × 1 P^{70\times{1}} P70×1,如下所示:
P i = [ I i x x , I i x y , I i x z , I i y y , I i y z , I i z z , m i r x , m i r y , m i r z , m i ] T ∈ R 10 × 1 P_i=[I_{ixx},I_{ixy},I_{ixz},I_{iyy},I_{iyz},I_{izz},m_ir_x,m_ir_y,m_ir_z,m_i]^T\in{R^{10\times1}} Pi=[Iixx,Iixy,Iixz,Iiyy,Iiyz,Iizz,mirx,miry,mirz,mi]TR10×1
使用仓库提供的源码进行最小惯性参数集的计算,一共43个参数,其符号表达式如下所示:

P1 = i7_xz
P2 = i7_yz
P3 = i7_xy
P4 = i7_zz
P5 = i6_xz
P6 = i6_xy
P7 = mh7_x
P8 = i6_yz
P9 = mh7_y
P10 = mh6_y + mh7_z
P11 = i5_xz
P12 = i5_yz
P13 = mh6_x
P14 = i6_xx - i6_yy + i7_yy
P15 = i6_xx + i7_xx - i6_yy
P16 = (33*m5)/80 + (33*m6)/80 + (33*m7)/80 + mh4_y + mh5_z
P17 = i5_xy
P18 = i6_yy + i5_zz
P19 = i4_xz
P20 = mh5_y + mh6_z
P21 = i4_yz
P22 = i4_xy
P23 = mh4_x
P24 = mh5_x
P25 = i3_yz
P26 = (7*m3)/16 + (7*m4)/16 + (7*m5)/16 + (7*m6)/16 + (7*m7)/16 + mh2_y + mh3_z
P27 = i6_yy - i6_xx + i6_zz
P28 = i3_xz
P29 = i2_yy - i3_xx - i2_xx + i3_zz + (49*m3)/256 + (49*m4)/256 + (49*m5)/256 + (49*m6)/256 + (49*m7)/256 + (7*mh2_y)/8
P30 = i3_xy
P31 = i2_xx + i3_xx - i2_yy + i4_xx + i5_xx + i6_yy - (49*m3)/256 - (49*m4)/256 - (1157*m5)/3200 - (1157*m6)/3200 - (1157*m7)/3200 - (7*mh2_y)/8 - (33*mh4_y)/40
P32 = i2_yy + i1_zz
P33 = i2_xz
P34 = mh3_x
P35 = i2_yy - i3_xx - i2_xx - i4_xx + i4_zz + (49*m3)/256 + (49*m4)/256 + (49*m5)/256 + (49*m6)/256 + (49*m7)/256 + (7*mh2_y)/8
P36 = i2_yz
P37 = mh3_y + mh4_z
P38 = mh2_x
P39 = i2_xy
P40 = i2_xx + i3_xx - i2_yy + i4_yy - (49*m3)/256 - (49*m4)/256 - (49*m5)/256 - (49*m6)/256 - (49*m7)/256 - (7*mh2_y)/8
P41 = i2_xx - i2_yy + i3_yy - (49*m3)/256 - (49*m4)/256 - (49*m5)/256 - (49*m6)/256 - (49*m7)/256 - (7*mh2_y)/8
P42 = i2_yy - i2_xx + i2_zz
P43 = i2_xx + i3_xx - i2_yy + i4_xx + i5_yy - (49*m3)/256 - (49*m4)/256 - (1157*m5)/3200 - (1157*m6)/3200 - (1157*m7)/3200 - (7*mh2_y)/8 - (33*mh4_y)/40

其实到这里,以上帝视角看,我是已知最小惯性参数集的具体数值了。同样地,我在这里把他们列出来,后面参数辨识可以进行对比。

P1 = 0.000009
P2 = 0.003829
P3 = -0.000001
P4 = 0.001917
P5 = -0.000001
P6 = -0.000002
P7 = 0.000035
P8 = 0.000646
P9 = 0.018383
P10 = 0.381724
P11 = -0.000003
P12 = 0.000691
P13 = -0.000032
P14 = 0.072779
P15 = 0.507504
P16 = 2.221642
P17 = 0.000000
P18 = 0.009096
P19 = 0.000000
P20 = -0.021990
P21 = 0.001478
P22 = -0.000002
P23 = -0.000079
P24 = 0.000025
P25 = 0.000696
P26 = 4.939345
P27 = 0.001759
P28 = 0.000000
P29 = 2.316072
P30 = 0.000001
P31 = -3.308536
P32 = 0.040089
P33 = 0.000000
P34 = 0.000005
P35 = 2.304700
P36 = 0.003501
P37 = 0.020232
P38 = -0.000019
P39 = -0.000005
P40 = -2.301731
P41 = -2.312715
P42 = 0.008138
P43 = -3.315313

5.3 轨迹规划

不像文章中采用的傅里叶级数+多项式的组合,我只用五阶傅里叶级数,其系数的确定使用优化算法,可以通过matlab自带的优化算法工具箱进行确定。优化结果如下,横坐标单位是0.01s:
关于机器人机械臂参数辨识

5.4 数据采集

这部分很简单,将规划好的轨迹输入至simscape中,机器人按照给定的位置、速度和加速度信号进行运动,我们因而可以获取运动中的力矩信息。
关于机器人机械臂参数辨识

关于机器人机械臂参数辨识

5.5 数据处理

这一步需要对输出的位置数据进行微分,获取速度和加速度信息。

tor = out.tor(1:num,:);
pos = out.pos(1:num,:);
vel = zeros(num,N);
acc = zeros(num,N);
for i = 2:1:num-1
    vel(i,:) = (pos(i+1,:) - pos(i-1,:))/(2*dt);
end
vel(1,:) = vel(2,:);
for i = 2:num-1
    acc(i,:) = (pos(i+1,:) - 2*pos(i,:) + pos(i-1,:))/(dt^2);
end

5.6 参数估计

有了轨迹的力矩和运动信息,按照前述方法直接求解即可,最小惯性参数结果如下。如果和前面标称的参数相比,数值上已经是十分接近了。

P1 = -0.000008
P2 = -0.003822
P3 = -0.000002
P4 = 0.001895
P5 = -0.000002
P6 = 0.000006
P7 = 0.000040
P8 = -0.000668
P9 = 0.018384
P10 = 0.381750
P11 = 0.000007
P12 = -0.000670
P13 = -0.000018
P14 = 0.072790
P15 = 0.073986
P16 = 2.221165
P17 = -0.000008
P18 = 0.009164
P19 = 0.000016
P20 = -0.021984
P21 = -0.001544
P22 = 0.000017
P23 = 0.000001
P24 = 0.000039
P25 = -0.000716
P26 = 4.937972
P27 = 0.001690
P28 = 0.000309
P29 = 2.314043
P30 = -0.000085
P31 = -3.305995
P32 = 0.040127
P33 = 0.000148
P34 = -0.000001
P35 = 2.302938
P36 = -0.003511
P37 = 0.020192
P38 = -0.000026
P39 = 0.000081
P40 = -2.299960
P41 = -2.310878
P42 = 0.008014
P43 = -3.312780

然后我们用最小惯性参数预测力矩,并且和实际仿真力矩进行对比,结果如下:
关于机器人机械臂参数辨识
我们可以看到误差非常小,不到0.001Nm。

6.引用


  1. Swevers J, Verdonck W, De Schutter J. Dynamic model identification for industrial robots[J]. IEEE control systems magazine, 2007, 27(5): 58-71. ↩︎

  2. Sousa C D, Cortesao R. Inertia tensor properties in robot dynamics identification: A linear matrix inequality approach[J]. IEEE/ASME Transactions on Mechatronics, 2019, 24(1): 406-411. ↩︎

  3. Gautier M, Khalil W. Direct calculation of minimum set of inertial parameters of serial robots[J]. IEEE Transactions on robotics and Automation, 1990, 6(3): 368-373. ↩︎

  4. 《机器人动力学与控制》,霍伟著. ↩︎

  5. Gautier M. Numerical calculation of the base inertial parameters of robots[J]. Journal of robotic systems, 1991, 8(4): 485-506. ↩︎文章来源地址https://www.toymoban.com/news/detail-436448.html

到了这里,关于关于机器人机械臂参数辨识的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器人强化学习-双机械臂

    基于 robosuite 库,进行双臂机器人学习训练 下面展示下分别控制两个机械手随机运动的画面: 双臂显示场景如下:双臂调用代码如下: 值得注意的是,与单机械手控制相比,只需要将 action 改成 16维的就可以。 ps :对于单机器人控制, action 是7维的,但是在这里,两个机器

    2024年01月16日
    浏览(48)
  • 机械臂的动力学分析-工业机器人

    工业机器人动力学研究采用的方法有很多,例如拉格朗日法、牛顿-欧拉法、高斯法、凯恩法等,在此重点介绍牛顿-欧拉法和拉格朗日法。牛顿-欧拉法需要从运动学出发求得加速度,并计算各内作用力。对于较复杂的系统,此种分析方法十分复杂与麻烦。而拉格朗日法,只需

    2023年04月08日
    浏览(43)
  • Matlab机械臂建模:机器人工具箱的使用&&导入自己的机械臂模型

            本文主要介绍 如何在matlab中建立机械臂模型( 前提要下载了Robotics Toolbox机器人工具箱~ ),并进行基于正逆运动学计算的轨迹运动 。对于已有的Solidworks机械臂三维模型,如何导入Matlab,并对其进行运动控制。         关于 机器人工具箱的安装 及函数的详细

    2024年02月07日
    浏览(59)
  • 【机械臂算法】机械臂动力学参数辨识仿真

    本文以puma560m机械臂为例子进行动力学参数辨识的讲解,puma560m可以在robotic toolbox中找到,这里以它真实机械臂对他的动力学参数进行辨识。 此外这里还有要说的是,机械臂参数辨识其实是一个系统工程,其中和机械、电子、嵌入式都有着很深的联系,并不是仿真这么简单的

    2024年02月15日
    浏览(102)
  • 遨博协作机器人ROS开发 - 机械臂自主避障

    目录 一、简介 二、环境版本 三、学习目标  五、任务实施 六、任务拓展 七、课堂小结 八、课后练习 大家好,欢迎关注遨博学院带来的系列技术分享文章(协作机器人ROS开发),今天我们来学习一下“机械臂自主避障”。 主机系统版本:Windwos10 64位 处理器型号:Intel-i7 虚

    2023年04月10日
    浏览(42)
  • 基于ROS的机器人模型建立及3D仿真【物理/机械意义】

    在前面的博客中,我们已经学习过了如何对目标机器人进行数学意义上的模型建立,以便实现基础控制,而在实际生活中,由于机器人造价高昂,我们往往难以获得实际的目标机器人进行部署研究,这就需要我们对目标进行仿真,采用编程或可视化方法建立机器人3D模型,从

    2024年02月09日
    浏览(68)
  • 自动化革命:大象机器人的Mercury A1机械臂

    大象机器人的Mercury系列,是面向工业自动化和智能制造的新型机械臂产品线。这些机械臂不仅在设计上创新,还在材料选择上使用了碳纤维、铝合金和工程塑料等轻质强韧材料,搭载高精度谐波减速器。Mercury系列的推出,反映了大象机器人对机器人技术未来趋势的洞察,旨

    2024年01月16日
    浏览(48)
  • 机器人制作开源方案 | 桌面级机械臂--本体说明+驱动及控制

            该桌面级机械臂为模块化设计,包含主机模块1个、转台模块1个、二级摆动模块1个、可编程示教盒1个、2种末端执行器、高清摄像头,以及适配器、组装工具、备用零件等。可将模块快速组合为一个带被动关节的串联3自由度机械臂,亦可进一步加装、更换执行器、传

    2024年02月11日
    浏览(79)
  • 机器人制作开源方案 | 基于混合现实的可移动机械臂平台

     作者: 董泽宇 李肖兵 叶彤 李秉宸 吴雅霏 单位: 广西大学 电气工程学院 指导老师: 李勇 雷圆媛       为应对特殊条件下不便于实地进行移动式操作的问题,本作品设计了一套基于混合现实的可移动机械臂操作控制系统。该系统分为人机交互、机械驱动、虚拟现实三个

    2024年01月22日
    浏览(49)
  • [足式机器人]Part5 机械设计 Ch00/01 绪论+机器结构组成与连接 ——【课程笔记】

    本文仅供学习使用 本文参考: 《机械设计》 王德伦 马雅丽 课件与日常作业可登录网址 http://edu.bell-lab.com/manage/#/login ,选择观摩登录,查看 2023机械设计2 。 机械设计 Machines Design ,在传统课程中,更倾向于 机械零件设计 Machine Elements Design :预期 装置 (运动/结构)与 性能

    2024年02月12日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包