精华内容
下载资源
问答
  • Matlab】SimMechanics机械臂建模流程

    千次阅读 热门讨论 2020-03-12 18:20:14
    最近做毕业设计使用了SimMechanics进行机械臂建模仿真,网上资料也比较少,当然官方的文档才是最香的:https://ww2.mathworks.cn/help/physmod/sm/rigid-bodies-1.html?s_tid=CRUX_lftnav 自己摸爬滚打后,终于...

    1.前言

    最近做毕业设计使用了SimMechanics进行机械臂的建模仿真,网上资料也比较少,当然官方的文档才是最香的:https://ww2.mathworks.cn/help/physmod/sm/rigid-bodies-1.html?s_tid=CRUX_lftnav

    自己摸爬滚打后,终于成功实现了建模并和S-Function写的控制算法一起仿真成功。这里记录一下自己的使用流程。

    Matlab版本:2018及以上,本人使用2016a和2019b,当用到部分只在2018以上版本才有的功能时才使用2019b,太卡了,平时主力还是2016a。

    本文采用i关节连接i个连杆方式,即每个Link与首端关节坐标系固连。

    2.坐标系建立

    我比较喜欢先把机械臂的坐标系照着实物建好,如果有需要的话可以先列出DH参数,在进行建立。

    使用AxGlyph软件画的坐标关系图,这软件真香,支持国产!买买买!接下来就是在SimMechanics中建立该组坐标系。

    3.使用smnew命令建立新的SimMechanics仿真文件,也即启动Simulink

    中间的World Frame顾名思义就是惯性系,我们可以通过将其连接到Solid、Frame,来确定惯性系与我们坐标系的关系,在本例中,惯性系与机械臂第一个关节坐标系相连。

    4.使用Frame Transform进行坐标系之间的变换

    注意:本文坐标系之间只考虑旋转变化,平移变化由Link实现,具体做法就是让Link的两端都是同一方向坐标系,再连接一个Transform

    因第一个坐标系与惯性系之间不需要变换,故设置保持默认为none

    第二个关节为第一个关节绕x1轴旋转-90°,故设置为

    后面如法炮制,把每个关节坐标系之间的关系表示出来。

    5.添加Link和关节

    这一步就很简单了,主要是要注意Link两端的坐标系要与该Link首端关节坐标系一致,如果需要用到质心位置,则也要将质心位置的坐标系调整到与关节一致。可以设置Link的惯性参数,如果为了省事可以直接设置成由形状计算,只需要设定质量or密度即可。

    关节则直接使用Joint模块,连接Transform和Link即可

    全部连接上即可。

    6.一些需要用到的参数的测量

    6.1.两个关节之间的位置关系

    使用Transform Sensor即可,注意设置测量参考坐标系,如果以该Link的首段关节坐标系为参考,则将模块的B连接至该坐标系,F连接目标坐标系,设置为Base即可。

    6.2.质量、转动惯量测量

    此功能只有2018以上才有,我每次测量这些量的时候,就切换至2019。

    使用Inertia Sensor,同样需要设置参考系和Sensor Extent,Sensor Extent的说明就不翻译了,以关节为终点,可以参考官方文档https://ww2.mathworks.cn/help/physmod/sm/ref/inertiasensor.html

    附录 控制器仿真报错

    可能出现了除以0或者NAN等情况,如果确认程序算法没问题,可以通过调参数或者更换solver解决

    展开全文
  • 机械臂——六轴机械臂构型分析与MATLAB建模

    万次阅读 多人点赞 2018-08-26 14:15:56
    机械臂逆解计算 一、六轴机械臂构型分析 关节机器人,是应用于当前工业领域中最为广泛的工业机器人的构型之一,它也被称作关节型手臂机器人或者关节型机械手臂。它可应用于诸多工业领域,例如喷漆、自动装配、...

    环境:Robotics Toolbox 10.3(版本不一致有可能会报错

    Robotics Toolbox配置

    机械臂逆解计算

     

    一、六轴机械臂构型分析

    关节机器人,是应用于当前工业领域中最为广泛的工业机器人的构型之一,它也被称作关节型手臂机器人或者关节型机械手臂。它可应用于诸多工业领域,例如喷漆、自动装配、焊接等工作。多自由度关节机器人中以六自由度关节机器人最为常见,它的关节分布参考人体手臂进行设计,以与地面垂直的腰部旋转轴为主轴,带动小臂旋转的肘部旋转轴以及小臂前端的手腕等构成,手腕部分通常拥有2到3个自由度。因为该构型机器人的动作空间与球体类似,所以也被称为多关节球面机器人。自由度关节机器人的主要优点有两个,第一为可通过连续控制实现复杂的运动轨迹,第二为通过各关节配合可获得多种末端姿态。六自由度关节机器人根据不同的工作环境也有不同的类别,下图是几种较为常见的六自由度关节机器人。

                                 

                             a) 垂直六关节L型手腕机器人      b)垂直六关节串联机器人             c)关节码垛机器人

     

    二、数学模型的建立与分析

    标准D-H参数法常用于建立关节型机器人的数学模型,D-H参数法是一种对连杆的坐标描述,而关节机器人本质上就是一系列连杆通过关节连接起来而组成的空间开式运动链。对于连杆本身,其功能在于保持其两端的关节轴线具有固定的几何关系,连杆的特性由轴线决定,如下图所示,通常用四个连杆参数来描述,连杆长度a _i,连杆扭转角\alpha _i,连杆偏移量d_i和关节角\Theta _i

     

    这里所设计的机械臂由六个转动副构成,关节分布方式参考现有成熟的工业机器人进行设计,如下图所示。第一轴为垂直于地面的旋转轴,第二轴、第三轴和第五轴都为平行与地面的旋转轴,第四轴和第六轴则是与连杆方向平衡的旋转轴。

    根据标准D-H参数法,建立机械臂的D-H参数模型,其对应的参数表如下表所示,该表的参数根据自己的机器人实物进行设定。

    以上表的参数构建机械臂的模型如下图所示。 

    机械臂建模MATLAB程序

    %机械臂为六自由度机械臂
    clear L;
    
    %角度转换
    du=pi/180;     %度
    radian=180/pi; %弧度
    
    %关节长度
    L1=4.324;L2=16;L3=2.35;L4=16.085;L5=14.675;
    
    %% 字符串法建立模型,
    q0=0;L0=0;%过渡关节
    % hand = 'Rz(q1).Tz(L1).Ry(q2).Tz(L2).Ry(q3).Tz(L3).Rx(q4).Tx(L4).Ry(q5).Rz(q6).Tz(L5)';
    % dhand = DHFactor(hand)
    % six_hand =eval(dhand.command('hand'));
    % plotopt = {'noraise', 'nowrist', 'nojaxes', 'delay',0};
    % tool_dh=[1 0 0 0;
    %          0 1 0 0;
    %          0 0 1 0;
    %          0 0 0 1];
    % six_link=SerialLink(six_hand,'name','six hand','tool',tool_dh)
    
    %% DH法建立模型,关节角,连杆偏移,连杆长度,连杆扭转角,关节类型(0转动,1移动)
    L(1) = Link( 'd',L1  ,  'a',0,   'alpha',-pi/2, 'offset',0   );
    L(2) = Link( 'd',0   ,  'a',-L2, 'alpha',0    , 'offset',pi/2);
    L(3) = Link( 'd',0   ,  'a',-L3, 'alpha',pi/2 , 'offset',0   );
    L(4) = Link( 'd',L4  ,  'a',0 ,  'alpha',-pi/2, 'offset',0   );
    L(5) = Link( 'd',0   ,  'a',0,   'alpha',pi/2 , 'offset',pi/2);
    L(6) = Link( 'd',L5  ,  'a',0,   'alpha',0   ,  'offset',0   );
    plotopt = {'noraise', 'nowrist', 'nojaxes', 'delay',0};
    tool_char=[1 0 0 0;
               0 1 0 0;
               0 0 1 0;
               0 0 0 1];
    six_link=SerialLink(L,'name','six link','tool',tool_char);
    
    %显示机械臂
    figure(1)
    hold on 
    six_link.plot([0 0 0 0 0 0], plotopt{:});
    hold off

     

    三、工作空间的计算

    3.1 数值法

    机器人的工作空间是机器人在运转过程中,手部参考点在空间所能达到的点的集合。工作空间是一种重要的运动学指标,常用于衡量机器人活动范围,机器人无法到达处于工作空间以外的目标。机器人的工作空间的种类有三种,分别是全工作空间,可达工作空间和灵巧工作空间,本课题中计算的是机器人给定所有位姿时,末端可到达目标点的集合,即全工作空间。

    这里采用数值法进行机器人全工作空间的绘制,具体流程如下图所示。首先是设置各关节角度限制,然后以某一步距值对各关节分别进行累加并计算正解获得末端点位置,当各关节都到达最大限制角度后停止计算,最后对获得的所有末端点进行处理绘制出机器人的边界曲线,根据这些边界曲线可以绘制出代表机器人的工作空间的边界曲面。

     

     程序实现

    %六轴机械臂工作空间计算
    clc;
    clear;
    format short;%保留精度
    
    %角度转换
    du=pi/180;  %度
    radian=180/pi; %弧度
    
    %% 模型导入
    robot_hand;
    
    %% 求取工作空间
        %关节角限位
        q1_s=-180; q1_end=180;
        q2_s=0;    q2_end=90;
        q3_s=-90;  q3_end=90;
        q4_s=-180; q4_end=180;
        q5_s=-90;  q5_end=90;
        q6_s=0;    q6_end=360;
        
        %设置step
        step=10;%计算步距
        step1= (q1_end -q1_s) / step;
        step2= (q2_end -q2_s) / step;
        step3= (q3_end -q3_s) / step;
        step4= (q4_end -q4_s) / step;
        step5= (q5_end -q5_s) / step;
        step6= (q6_end -q6_s) / step;
        
        %计算工作空间
        tic;%tic1
        i=1;
        T = zeros(3,1);
        T_x = zeros(1,step1*step2*step3*step4*step5);
        T_y = zeros(1,step1*step2*step3*step4*step5);
        T_z = zeros(1,step1*step2*step3*step4*step5);  
        for  q1=q1_s:step:q1_end
            for  q2=q2_s:step:q2_end
                  for  q3=q3_s:step:q3_end
                      for  q4=q4_s:step:q4_end
                          for q5=q5_s:step:q5_end
                                  T=six_link.fkine([q1*du q2*du q3*du q4*du q5*du 0]).t;%正向运动学仿真函数
                                  T_x(1,i) = T(1); 
                                  T_y(1,i) = T(2); 
                                  T_z(1,i) = T(3); 
                                  i=i+1;
                          end
                     end
                 end
            end 
        end
        disp(['循环运行时间:',num2str(toc)]); 
        t1=clock;
         
    %% 绘制工作空间
    figure('name','六轴机械臂工作空间')
    hold on
    plotopt = {'noraise', 'nowrist', 'nojaxes', 'delay',0};
    six_link.plot([0 0 0 0 0 0], plotopt{:});
    plot3(T_x,T_y,T_z,'r.','MarkerSize',3);
    disp(['绘制工作空间运行时间:',num2str(etime(clock,t1))]);  
    
    %获取X,Y,Z空间坐标范围
    Point_range=[min(T_x) max(T_x) min(T_y) max(T_y) min(T_z) max(T_z)]
    hold off

    程序效果 

     

    3.2 蒙特卡罗法

    蒙特卡罗方法(英语:Monte Carlo method),也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。

    使用蒙特卡罗法计算工作空间相较于数值化,优势在于用时较短,以100000个点为例,用时在2到3分钟内(根据关节运动范围和关节数不同而不同),劣势在于蒙特卡罗方法只能趋近于结果而不能完全得到真实的结果,但经过测试,只要数据的数量足够大,也能获得较为准确的结果。

    蒙特卡罗法一般实现步骤

    1. 用蒙特卡罗方法模拟某一过程时,需要产生各种概率分布的随机变量。
    2. 用统计方法把模型的数字特征估计出来,从而得到实际问题的数值解。

    蒙特卡罗法工作空间求解步骤

    1. 产生各关节的随机变量
    2. 计算正解

    程序实现 

    clc;
    clear;
    
    %% 准备
        %保留精度
        format short;
        
        %角度转换
        du=pi/180;  %度
        radian=180/pi; %弧度
        
        %模型导入
        robot_hand;
    
    %% 参数
        %关节角限位
        q1_s=-180; q1_end=180;
        q2_s=0;    q2_end=90;
        q3_s=-90;  q3_end=90;
        q4_s=-180; q4_end=180;
        q5_s=-90;  q5_end=90;
        q6_s=0;    q6_end=360;
        
        %计算点数
        num=100000;
    
    %% 求取工作空间
        %设置轴关节随机分布,轴6不对工作范围产生影响,设置为0
        q1_rand = q1_s + rand(num,1)*(q1_end - q1_s);
        q2_rand = q2_s + rand(num,1)*(q2_end - q2_s);
        q3_rand = q3_s + rand(num,1)*(q3_end - q3_s);
        q4_rand = q4_s + rand(num,1)*(q4_end - q4_s);
        q5_rand = q5_s + rand(num,1)*(q5_end - q5_s);
        q6_rand = rand(num,1)*0;
        q = [q1_rand q2_rand q3_rand q4_rand q5_rand q6_rand];
        
        %正运动学计算工作空间
        tic;
        T_cell = cell(num,1);
        [T_cell{:,1}]=six_link.fkine(q).t;%正向运动学仿真函数
        disp(['运行时间:',num2str(toc)]);
     
     %% 分析结果
        %绘制工作空间
        t1=clock;
        figure('name','机械臂工作空间')
        hold on
        plotopt = {'noraise', 'nowrist', 'nojaxes', 'delay',0};
        six_link.plot([0 0 0 0 0 0], plotopt{:});
         figure_x=zeros(num,1);
         figure_y=zeros(num,1);
         figure_z=zeros(num,1);
         for cout=1:1:num
             figure_x(cout,1)=T_cell{cout}(1);
             figure_y(cout,1)=T_cell{cout}(2);
             figure_z(cout,1)=T_cell{cout}(3);
         end
         plot3(figure_x,figure_y,figure_z,'r.','MarkerSize',3);
         hold off
         disp(['绘制工作空间运行时间:',num2str(etime(clock,t1))]);  
         
         %获取X,Y,Z空间坐标范围
         Point_range=[min(figure_x) max(figure_x) min(figure_y) max(figure_y) min(figure_z) max(figure_z)];

     程序效果

     

    参考

    熊有伦. 机器人技术基础[M]. 华中理工大学出版社, 1996.

    徐卫良. 机器人工作空间分析的蒙特卡洛方法[J]. 东南大学学报(自然科学版), 1990, 20(1):1-8.

     

    展开全文
  • 提示:同前几节一样,这些教程重点阐述Simulink对机械臂建模的操作,对于机械臂的运动学、动力学部分,几乎不涉及,默认受众为已基本了解机械臂运动学和动力学内容的人。 针对关节控制部分,主要涉及到的知识点为: ...

    五、单关节控制

    提示:同前几节一样,这些教程重点阐述Simulink对机械臂建模的操作,对于机械臂的运动学、动力学部分,几乎不涉及,默认受众为已基本了解机械臂运动学和动力学内容的人。

    针对关节控制部分,主要涉及到的知识点为:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    因此:在alpha=I,belt=0的情况下,单关节控制需要的考量就非常简单了!
    我们需要对前面建立的轨迹规划模块进行修改,使其能够输出速度v和加速度a。
    在这里插入图片描述

    再根据闭环方程建立一个闭环控制器,注意:其输出为扭矩!

    在这里插入图片描述
    kp,kv为闭环增益,在系统为临界阻尼的情况下,kv=2根号kp,
    在这里插入图片描述
    其中,kp为期望的闭环刚度,由于模拟条件限制,我们认为的设置其闭环刚度为16。
    其单关节控制器模块如图所示:
    在这里插入图片描述
    调整Simulink-PS模块的单位:
    在这里插入图片描述
    调整关节的属性,设置为扭矩驱动,增加Sensor菜单的位置、速度输出量,也可以增加扭矩输出量查看扭矩的变化情况。
    在这里插入图片描述
    连线,如果想查看那些输出了,可以增加scope模块查看,注意传感器的输出量要经过PS-Simulink Converter模块的转换才能进行信号处理,注意设置其单位!
    在这里插入图片描述
    由此,单关节控制器完成。同上一节的内容联合起来,就是将上一节的开环控制改为闭环控制!

    下一节内容将对机械臂的建模进行细化,并将建模过程简单处理,增加其内部的物理属性。


    补充:
    该机械臂类型为RRPR类型机械臂,最有还有一个旋转关节,其中,前三个关节控制末端执行器的位置,最后一个关节确定他的姿态,所以,我们在一开始建立的逆运动学模块中,加入theta变量,其直接作用于最后一个旋转关节。这部分内容,大家可以自行完成。由于本系列教程只是对机械臂建模仿真的教学,许多细节地方还需要大家自己检查完善!

    展开全文
  • 工业机械臂建模

    2019-11-28 17:36:52
    本文介绍如何在MATLAB中进行工业机械臂建模以及动力学仿真,翻译于Modeling an industrial arm 平台:MATLAB R2017a 机械臂模型由三部分组成:电机(Motor),减速机(Gear-box),臂结构(Arm structure),各部分...

    本文介绍如何在MATLAB中进行工业机械臂建模以及动力学仿真,翻译于Modeling an industrial arm
    平台:MATLAB R2017a
    机械臂模型由三部分组成:电机(Motor),减速机(Gear-box),臂结构(Arm structure),各部分都有各自的质量,分别绕着一个不受重力影响的轴转动。如图1所示。
    tuyi
    图1:工业机械臂原理图
    这个模型在两方面进行了简化:1.假设运动围绕一个不受重力影响的轴。一些机械臂(比如SCARA)由于结构的关系,建模时可以忽略重力项的影响,所以这种化简是合理的。2.令减速比r = 1。我们之后可以通过直接换算减速比来获得真实的物理参数,所以这种化简也是合理的。
    具体的原理可以参考论文:E. Wernholt and S. Gunnarsson. Nonlinear Identification of a Physically Parameterized Robot Model. In preprints of the 14th IFAC Symposium on System Identification, pages 143-148, Newcastle, Australia, March 2006.
    一. 建立状态空间方程
    状态空间方程是整个现代控制理论的基础,让我们看看如何建立各个关节的状态空间方程。
    状态变量:
    在这里插入图片描述
    对三个质量应用力矩平衡方程,得到状态空间方程:
    在这里插入图片描述
    其中J_m, J_g, J_a分别是电机,减速机,臂结构的惯量矩;d_g, d_a是“弹簧”阻尼系数,k_a是臂结构刚度。(弹簧代表刚体弹性)
    机器人的输入为电机产生的转矩u(t)=tau(t),电机的角速度y(t) = d/dt q_m(t)为测量输出(可以通过码盘读出)。质量被建模在齿轮箱之后和臂结构的末端,所以他们的角位置:q_g(t)和q_a(t)是不可测量的。齿轮箱的弹性由非线性弹簧建模,由弹簧扭矩tau_s(t)描述,它位于电机和第二个质量之间;而臂结构的灵活性则由线性弹簧在最后两个质量之间建模。系统的摩擦主要作用于第一个质量,这里用非线性摩擦力矩tau_f(t)来建模。
    齿轮箱摩擦扭矩tau_f(t),被建模为包括库仑摩擦、粘滞摩擦并考虑Stribeck效应(将静摩擦转换为动摩擦的过渡阶段视作自然指数增长)的模型:
    在这里插入图片描述
    其中Fv是粘滞系数,Fc是库仑摩擦系数,Fcs和是反映Stribeck效应的系数,beta是用来获得x3(t)速度从负向正平稳过渡的参数。
    弹簧的扭矩tau_s(t),用一个无平方项的三次多项式来描述:
    在这里插入图片描述
    其中k_g1和k_g3为齿轮箱弹簧刚度参数。
    因为总体惯量J已知,故引入待定的比例因子a_m和a_g,进行参数重整化:
    在这里插入图片描述
    综上所述得到最终的状态空间结构,涉及13个不同的参数:Fv, Fc, Fcs, alpha, beta, J, a_m, a_g, k_g1, k_g3, d_g, k_a, d_a(其中前六个固定,后七个待求)
    在这里插入图片描述
    二. IDNLGREY机械臂模型对象
    上面的模型结构被输入到一个名为robotarm_c的C(mex)文件中。(整个文件可以通过命令“type robotarm_c.c”查看)。在状态更新函数中,注意我们在这里使用了两个中间双变量,一方面是为了增强方程的可读性,另一方面是为了提高执行速度(tau在方程中出现了两次,但是只计算了一次)。

      /* State equations. */
      void compute_dx(double *dx, double *x, double *u, double **p)
      {
          /* Declaration of model parameters and intermediate variables. */
          double *Fv, *Fc, *Fcs, *alpha, *beta, *J, *am, *ag, *kg1, *kg3, *dg, *ka, *da;
          double tauf, taus;   /* Intermediate variables. */
          /* Retrieve model parameters. */
          Fv    = p[0];    /* Viscous friction coefficient.            */
          Fc    = p[1];    /* Coulomb friction coefficient.            */
          Fcs   = p[2];    /* Striebeck friction coefficient.          */
          alpha = p[3];    /* Striebeck smoothness coefficient.        */
          beta  = p[4];    /* Friction smoothness coefficient.         */
          J     = p[5];    /* Total moment of inertia.                 */
          am    = p[6];    /* Motor moment of inertia scale factor.    */
          ag    = p[7];    /* Gear-box moment of inertia scale factor. */
          kg1   = p[8];    /* Gear-box stiffness parameter 1.          */
          kg3   = p[9];    /* Gear-box stiffness parameter 3.          */
          dg    = p[10];   /* Gear-box damping parameter.              */
          ka    = p[11];   /* Arm structure stiffness parameter.       */
          da    = p[12];   /* Arm structure damping parameter.         */
          /* Determine intermediate variables. */
          /* tauf: Gear friction torque. (sech(x) = 1/cosh(x)! */
          /* taus: Spring torque. */
          tauf = Fv[0]*x[2]+(Fc[0]+Fcs[0]/(cosh(alpha[0]*x[2])))*tanh(beta[0]*x[2]);
          taus = kg1[0]*x[0]+kg3[0]*pow(x[0],3);
          /* x[0]: Rotational velocity difference between the motor and the gear-box. */
          /* x[1]: Rotational velocity difference between the gear-box and the arm. */
          /* x[2]: Rotational velocity of the motor. */
          /* x[3]: Rotational velocity after the gear-box. */
          /* x[4]: Rotational velocity of the robot arm. */
          dx[0] = x[2]-x[3];
          dx[1] = x[3]-x[4];
          dx[2] = 1/(J[0]*am[0])*(-taus-dg[0]*(x[2]-x[3])-tauf+u[0]);
          dx[3] = 1/(J[0]*ag[0])*(taus+dg[0]*(x[2]-x[3])-ka[0]*x[1]-da[0]*(x[3]-x[4]));
          dx[4] = 1/(J[0]*(1.0-am[0]-ag[0]))*(ka[0]*x[1]+da[0]*(x[3]-x[4]));
      }
      /* Output equation. */
      void compute_y(double y[], double x[])
      {
          /* y[0]: Rotational velocity of the motor. */
          y[0] = x[2];
      }
    

    下一步是创建一个反映建模情况的IDNLGREY(非线性灰盒)对象。这里需要注意的是,为机械臂找到合适的初始参数值需要一些预先的知识。在Wernholt和Gunnarsson的论文中,这是在前面两个步骤中进行的,其中使用了其他模型参数辨识技术。下面使用的初始参数值是这些识别实验的结果。

    FileName      = 'robotarm_c';               % File describing the model structure.
    Order         = [1 1 5];                    % Model orders [ny nu nx].
    Parameters    = [ 0.00986346744839  0.74302635727901 ...
                      3.98628540790595  3.24015074090438 ...
                      0.79943497008153  0.03291699877416 ...
                      0.17910964111956  0.61206166914114 ...
                     20.59269827430799  0.00000000000000 ...
                      0.06241814047290 20.23072060978318 ...
                      0.00987527995798]';       % Initial parameter vector.
    InitialStates = zeros(5, 1);                % Initial states.
    Ts            = 0;                          % Time-continuous system.
    nlgr = idnlgrey(FileName, Order, Parameters, InitialStates, Ts, ...
                    'Name', 'Robot arm',                            ...
                    'InputName', 'Applied motor torque',            ...
                    'InputUnit', 'Nm',                              ...
                    'OutputName', 'Angular velocity of motor',      ...
                    'OutputUnit', 'rad/s',                          ...
                    'TimeUnit', 's');
    

    为了方便记忆,状态名称需要简化

    nlgr = setinit(nlgr, 'Name', {'Angular position difference between the motor and the gear-box'…
                           'Angular position difference between the gear-box and the arm'…
                           'Angular velocity of motor'…
                           'Angular velocity of gear-box'…
                           'Angular velocity of robot arm'}');
    nlgr = setinit(nlgr, 'Unit', {'rad' 'rad' 'rad/s' 'rad/s' 'rad/s'});
    

    之后详细指定参数名称。此外,所有的参数都应该是正的,即将每个参数的最小值设置为0。在Wernholt和Gunnarsson的论文中,前6个参数:Fv, Fc, Fcs, alpha, beta, J十分精确,所以不需要被估计。

    nlgr = setpar(nlgr, 'Name', {'Fv   : Viscous friction coefficient'            ... % 1.
                          'Fc   : Coulomb friction coefficient'            ... % 2.
                          'Fcs  : Striebeck friction coefficient'          ... % 3.
                          'alpha: Striebeck smoothness coefficient'        ... % 4.
                          'beta : Friction smoothness coefficient'         ... % 5.
                          'J    : Total moment of inertia'                 ... % 6.
                          'a_m  : Motor moment of inertia scale factor'    ... % 7.
                          'a_g  : Gear-box moment of inertia scale factor' ... % 8.
                          'k_g1 : Gear-box stiffness parameter 1'          ... % 9.
                          'k_g3 : Gear-box stiffness parameter 3'          ... % 10.
                          'd_g  : Gear-box damping parameter'              ... % 11.
                          'k_a  : Arm structure stiffness parameter'       ... % 12.
                          'd_a  : Arm structure damping parameter'         ... % 13.
                         });
    nlgr = setpar(nlgr, 'Minimum', num2cell(zeros(size(nlgr, 'np'), 1)));   % All parameters >= 0!
    for parno = 1:6   % Fix the first six parameters.
        nlgr.Parameters(parno).Fixed = true;
    end
    

    到目前为止进行的建模步骤完成了一个初始的机械臂模型,其属性如下:

    present(nlgr);
    

    三. 输入-输出数据
    实验机器人采集了大量真实世界的数据集。为了保持机器人在其工作点附近,同时也是出于安全考虑,数据收集采用了实验反馈控制安排,随后允许离线计算关节控制器的参考信号。
    在这个例子中,我们将讨论限制在四个不同的数据集中,其中之一用于估计(estimation),另三个用于验证(validation)。在每种情况下,使用大约10秒的周期激励信号为控制器生成参考速度。选择的采样频率为2 kHz(采样时间Ts = 0.0005秒)。对于数据集,使用了三种不同类型的输入信号:(ue:估计数据集的输入信号;uv1、uv2、uv3:三个验证数据集的输入信号)
    ue, uv1:在1- 40hz的频率范围内,峰值为16 rad/s的平坦幅度谱的复合正弦波信号。复合正弦波信号叠加在振幅为20 rad/s,截止频率为1 Hz的滤波方波上。
    uv2:类似于ue和uv1,但是没有方波。
    uv3:频率为0.1、0.3、0.5 Hz,峰值为40 rad/s的复合正弦波信号。
    让我们加载可用数据,并将所有四个数据集放到一个IDDATA类型的对象z中:

    load(fullfile(matlabroot, 'toolbox', 'ident', 'iddemos', 'data', 'robotarmdata'));
    z = iddata({ye yv1 yv2 yv3}, {ue uv1 uv2 uv3}, 0.5e-3, 'Name', 'Robot arm');
    z.InputName = 'Applied motor torque';
    z.InputUnit = 'Nm';
    z.OutputName = 'Angular velocity of motor';
    z.OutputUnit = 'rad/s';
    z.ExperimentName = {'Estimation' 'Validation 1'  'Validation 2' 'Validation 3'};
    z.Tstart = 0;
    z.TimeUnit = 's';
    present(z);
    

    输入如下代码,显示四个实验的输入-输出数据:

    figure('Name', [z.Name ': input-output data'],...
       'DefaultAxesTitleFontSizeMultiplier',1,...
       'DefaultAxesTitleFontWeight','normal',...
       'Position',[100 100 900 600]);
    for i = 1:z.Ne
        zi = getexp(z, i);
        subplot(z.Ne, 2, 2*i-1);   % Input.
        plot(zi.u);
        title([z.ExperimentName{i} ': ' zi.InputName{1}],'FontWeight','normal');
        if (i < z.Ne)
            xlabel('');
        else
            xlabel([z.Domain ' (' zi.TimeUnit ')']);
        end
        subplot(z.Ne, 2, 2*i);     % Output.
        plot(zi.y);
        title([z.ExperimentName{i} ': ' zi.OutputName{1}],'FontWeight','normal');
        if (i < z.Ne)
            xlabel('');
        else
            xlabel([z.Domain ' (' zi.TimeUnit ')']);
        end
    end
    

    在这里插入图片描述
    图2:实验机械臂的测量输入-输出数据
    四. 初始机械臂模型的性能
    最初的机械臂模型有多好?让我们使用COMPARE来模拟模型输出(对于所有四个实验),并将结果与相应的测量输出进行比较。对于所有四个实验,我们知道前两种状态(x1, x2)的值恒为0(固定),而其余三种状态(x3, x4, x5)的初值设置为开始时的测量输出(不固定)。然而,在默认情况下,COMPARE估计所有的初始状态,而z包含四个不同的实验,也就是4 * 5 = 20次初始状态估计。即使固定了前两种状态,4 * 3 = 12个初始状态仍然需要估计(如果遵循内部模型初始状态策略)。因为数据集相当大,这将导致冗长的计算。为了避免这种情况,我们使用PREDICT来预测4 * 3不固定的初始状态 (将初始状态作为初始状态传递结构),但限制估计前十个可用数据。然后我们指示COMPARE使用得到的5×4初始状态矩阵X0init,而不是执行初始状态估计。

    zred = z(1:round(zi.N/10));
    nlgr = setinit(nlgr, 'Fixed', {true true false false false});
    X0 = nlgr.InitialStates;
    [X0.Value] = deal(zeros(1, 4), zeros(1, 4), [ye(1) yv1(1) yv2(1) yv3(1)], ...
        [ye(1) yv1(1) yv2(1) yv3(1)], [ye(1) yv1(1) yv2(1) yv3(1)]);
    [~, X0init] = predict(zred, nlgr, [], X0);
    nlgr = setinit(nlgr, 'Value', num2cell(X0init(:, 1)));
    clf
    compare(z, nlgr, [], compareOptions('InitialCondition', X0init));
     
    

    在这里插入图片描述
    图3:测量输出与初始机械臂模型仿真输出的比较。
    从图中可以看出,初始机器人手臂模型的性能相当好。这三种类型的数据集对ye和yv1的适合度约为79%,对yv2的适合度为37%,对yv3的适合度为95%。请注意,与yv2相比,ye/yv1的拟合程度很高,这是由于初始模型能够捕获方波,而复合正弦波部分的捕获效果并不理想。我们还可以看看这四个实验的预测误差:

    pe(z, nlgr, peOptions('InitialCondition',X0init));
    

    在这里插入图片描述
    图4:初始机械臂模型预测误差。
    五. 参数估计
    现在我们通过估计z的第一个实验(估计数据集)的7个待定模型参数和3个待定初始状态来提高初始机械臂模型的性能。这个估计需要一些时间(通常是几分钟)。

    nlgr = nlgreyest(nlgr, getexp(z, 1), nlgreyestOptions('Display', 'on'));
    

    六. 估计机械臂模型的表现
    再次使用COMPARE来评估估计机械臂模型的性能。我们依然在这里指示COMPARE不执行任何初始状态估计。在第一个实验中,我们用NLGREYEST估计的初始状态代替了猜测的初始状态,在剩下的三个实验中,我们使用PREDICT基于简化的IDDATA对象zred估计初始状态。

    X0init(:, 1) = cell2mat(getinit(nlgr, 'Value'));
    X0 = nlgr.InitialStates;
    [X0.Value] = deal(zeros(1, 3), zeros(1, 3), [yv1(1) yv2(1) yv3(1)], ...
        [yv1(1) yv2(1) yv3(1)], [yv1(1) yv2(1) yv3(1)]);
    [yp, X0init(:, 2:4)] = predict(getexp(zred, 2:4), nlgr, [], X0);
    clf
    compare(z, nlgr, [], compareOptions('InitialCondition', X0init));
    

    在这里插入图片描述
    图5:机械臂模型的实测输出与仿真输出对比。
    比较图显示了在拟合方面的改进。ye和yv1的拟合度现在约为85%(之前:79%),yv2约为63%(之前:37%),yv3略低于95.5%(之前:也略低于95.5%)。这种改进在第二个验证数据集中表现得最为明显,在第二个验证数据集中,输入是一个没有任何方波的复合正弦波信号。然而,估计模型对ye和yv1多轴部分的跟踪能力也得到了显著提高(但这并没有反映在拟合图形中,因为这些图形更受方波拟合的影响)。预测误差图还显示,残差现在比最初的机械臂模型要小:

    figure;
    pe(z, nlgr, peOptions('InitialCondition',X0init));
    

    在这里插入图片描述
    图6:估计机械臂模型的预测误差。
    我们通过对估计机械臂模型的各种特性进行文本总结来结束本例研究。

    present(nlgr);
    

    在这里插入图片描述

    七. 结论
    系统辨识技术广泛应用于机器人领域。良好的机器人模型对于现代机器人控制的实现至关重要,通常被认为是满足不断增长的速度和精度要求的必要条件。这些模型在各种机器人诊断应用中也是至关重要的组成部分,用于预测与磨损相关的问题和检测机器人故障的成因。

    展开全文
  • 机械臂建模的补充内容 我们再来观察Solid的属性设置,还是以砖型为例: Dimensions是设置其长宽高,不用多说,注意单位即可,Interia为其内部物理特性,在Custom选项中,Mass为其质量,Center of Mass为其质量中心...
  • 三、机械臂的运动仿真模拟 1.在第一节中,我们已经搭建了机械臂的模型,但他目前只是一个刚体模型,不具备任何运动条件,现在我们需要在他的关节处添加关节模型。目前,我们只需要旋转关节和平动关节,如图所示: ...
  • 四自由度机械臂matlab建模与仿真

    千次阅读 2019-10-23 22:03:56
    四自由度机械臂matlab建模与仿真 建模过程使用机器人工具箱Robotics Toolbox 机械臂有四个旋转自由度,模型近似如下,使用ADAMS建模 首先建立DH参数 matlab代码如下 clear;clc; L(1)=Link([0 0 0 -pi/2]); L(2)=...
  • 所写内容主要是根据博主某门课程的课设,对adept机器人进行SimMechanics 的建模仿真,默认你已经对其正、逆运动学以及轨迹规划,关节控制内容有所了解,主要偏向内容为SimMechanics仿真的学习。
  • 一安装Robotics Toolbox for MATLAB 1下载该工具箱迅雷搜狗下载 2将压缩包解压到一个文件夹下面 3打开MATLAB在File菜单下选择Set Path打开如下对话框 4单击Add With SubFolder选择...PUMA560的MATLAB仿真 要建立PUMA
  • 复杂的表达式是通过简单的四则运算(加减乘除)表达出来的,同样,在Matlab的Simulink中,定义好输出输出端口,通过若干个加减乘除模块组合,来表达出复杂的表达式。 我们主要用到的模块有: 模块的作用,就如同他...
  • 四、轨迹规划模块 轨迹规划部分分为关节空间的轨迹... 点击运行,即可看到机械臂在缓慢的转动,10s,达到目标点。同样的方法,每个关节添加一个轨迹规划模块,即可完成对每个关节的控制,这部分,这里就不再多加描述。
  • Matab六自由度机械臂建模的偷懒方法

    千次阅读 2019-03-12 21:25:33
    我们在用matlab学习机械臂建模时,最基本的操作就是根据D-H矩阵来进行机械臂建模。我在最初学习这部分内容时,根据D-H矩阵来写matlab的程序,但是不知为什么,建出来模型从直观上看都是错的。 最后我想出了一种...
  • 最近写的一个作业,记录分享一下,主要是对机械臂在MATLAB中的仿真,其中包括机械臂建模,机械臂轨迹规划,机械臂避障路径规划等。 前面两个博文中: 机械臂建模,轨迹规划,避障路径规划(介绍+代码)(一) 机械臂...
  • 最近写的一个作业,记录分享一下,主要是对机械臂在MATLAB中的仿真,其中包括机械臂建模,机械臂轨迹规划,机械臂避障路径规划等。 机械臂建模 机械臂建模一般采用dh建模方法,dh建模分为标准dh和改进dh,两种建模...
  • simmechanics Matlab Multibody module for machine simulation
  • 在此提交中,我们对一个小的三自由度(DOF)机器人手臂进行了建模,该机器人手臂是从MATLAB Simscape的www.roboholicmaniacs.com购买的。该中使用的执行器是步进电机。这3个自由度的主要输入是这些执行器的扭矩...
  • 最近写的一个作业,记录分享一下,主要是对机械臂在MATLAB中的仿真,其中包括机械臂建模,机械臂轨迹规划,机械臂避障路径规划等。这部分主要记录机械臂轨迹绘制。 工作空间获取 因为要对机械臂进行轨迹绘制,所以...
  • 在本次提交中,我们在 MATLAB Simscape 中对从www.roboholicmaniacs.com购买的小型三自由度 (DOF) 机械臂进行建模。 该臂中使用的执行器是步进电机。 这3个自由度臂的主要输入是这些执行器的扭矩角,这些扭矩角将...
  • 双臂Matlab仿真建模:正运动学

    千次阅读 多人点赞 2020-10-11 21:38:50
    实际上,如果就把双臂中的每个臂当做单个的机械臂进行规划,那么用matlab进行双臂建模就没有太大必要,只需要对每个单臂进行单独规划即可。但是,如果涉及到双臂之间的协同轨迹规划,如上图所示,这时用mat
  • 文章目录写在前面2连杆机械臂RTB建模仿真与验证源代码 写在前面 本文使用的工具为matlab以及Peter Corke的RTB(Robotics Toolbox)。基于RTB 10.3.1版本,我写了RTE(Robotics Toolbox Extension),增加了一些移动...
  • MATLAB机器人工具箱6轴机械臂DH建模仿真

    万次阅读 多人点赞 2018-12-25 22:09:06
    1、SDH建模仿真: L1 = Link('d', 0, 'a', 0, 'alpha', pi/2); L2 = Link('d', 0, 'a', 0.5, 'alpha', 0,'offset',pi/2); L3 = Link('d', 0, 'a', 0, 'alpha', pi/2,'offset',pi/4); L4 = Link('d', 1, 'a', 0, ...
  • 以实验室的KUKA youBot五自由度机械臂为切入点,记得当时和实验室的同学在这上面花费了好长时间,最后也没搞定,而这又算是基础中的基础,不能忽视。 DH一般分为标准DH和改进的DH,以John J.Craig的《机器人学导论...
  • 文章目录四轴机械臂实物Robotic ToolBox机械臂建模1.建立机械臂的D-H表建立机械臂坐标系根据坐标系建立D-H表2.代码建模机械臂运动学仿真1.正运动学仿真2.逆运动学仿真 为了能够实现机械臂的运动轨迹规划,同时更加...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 131
精华内容 52
关键字:

matlab机械臂建模

matlab 订阅