MATLAB机器人可视化运动仿真

MATLAB机器人可视化运动仿真

摘要
本文在前文SolidWorks转.urdf格式机器人模型导入Matlab中提到的方法基础上,对导入Matlab环境中的机器人模型进行可视化运动仿真,主要运用MATLAB App Designer进行操作界面的简单设计,实现对机器人基于关节运动和TCP运动的手动操作可视化运动仿真。

一 MATLAB App Designer

MATLAB App Designer是Matlab2016b以上版本新出的UI设计软件,详细教程见:https://www.mathworks.com/products/matlab/app-designer.html
其是基于面向对象的编程模式,使用简单方便。

二 关节运动

主要思想是:利用滚动滑条(或键盘输入)设置各关节值,然后用show(app.robot,app.q);不断刷新画面,起到运动仿真的效果。并且通过机器人正运动学实时刷新TCP坐标并显示。部分代码片段如下:

%画面刷新函数
function fShowRobot(app)            	
    app.q=[app.q1 app.q2 app.q3 app.q4 app.q5 app.q6];                   
    show(app.robot,app.q);                  
    axis([-2,2,-2,2,-3,1]);            
    fCurrentTcpPosition(app);        
end  
%当前TCP坐标值显示                      
function fCurrentTcpPosition(app)                 
    Current_T=app.robot.getTransform(app.q,'Link6');    %正运动学            
    app.XEditField.Value=Current_T(1,4);            
    app.YEditField.Value=Current_T(2,4);            
    app.ZEditField.Value=Current_T(3,4);            
    R=tform2eul(Current_T, 'ZYX');            
    app.PXEditField.Value=R(1);              
    app.PYEditField.Value=R(2);             
    app.PZEditField.Value=R(3);                         
    app.XSpinner.Value=app.XEditField.Value;            
    app.YSpinner.Value=app.YEditField.Value;            
    app.ZSpinner.Value=app.ZEditField.Value;            
    app.PXSpinner.Value=app.PXEditField.Value;            
    app.PYSpinner.Value=app.PYEditField.Value;            
    app.PZSpinner.Value=app.PZEditField.Value;                   
end

可视化仿真效果
在这里插入图片描述

三 TCP运动

主要思想是通过手动输入(或微调)TCP位姿坐标【包含位置坐标(x,y,z)和Roll-Pitch-Yaw 角度】,然后通过机器人逆运动学逆解求出关节坐标,最后如二中一样不断刷新机器人显示画面以达到可视化运动仿真的效果。部分代码段如下:


%逆运动学
function fIK(app)           
    if (app.XSpinner.Value<3 && app.XSpinner.Value>-3) &&...            
    (app.YSpinner.Value<3 && app.YSpinner.Value>-3) &&...                
    (app.ZSpinner.Value<3 && app.ZSpinner.Value>-3)                 
         app.TargetPos(1,4)=app.XSpinner.Value;              
         app.TargetPos(2,4)=app.YSpinner.Value;                
         app.TargetPos(3,4)=app.ZSpinner.Value;             
     end             
     rr=eul2tform([app.PXSpinner.Value app.PYSpinner.Value 
     app.PZSpinner.Value],'ZYX');             
     app.TargetPos(1:3,1:3)=rr(1:3,1:3);             
     ik = robotics.InverseKinematics('RigidBodyTree', app.robot);%新建逆解器
     [app.q,app.info]=ik('Link6',app.TargetPos,ones(1,6),app.robot.homeConfiguration);%ones(1,6)代表各关节误差,robot.homeConfiguration代表迭代初始值
end

% Button pushed function: SendPositionButton        
function SendPositionButtonPushed(app, event)            
    fIK(app);                        
    app.q1=app.q(1);            
    app.q1ValEditField.Value=app.q(1)/pi*360;            
    app.J1Slider.Value=app.q(1)/pi*360;            
    app.q2=app.q(2);            
    app.q2ValEditField.Value=app.q(2)/pi*360;            
    app.J2Slider.Value=app.q(2)/pi*360;            
    app.q3=app.q(3);            
    app.q3ValEditField.Value=app.q(3)/pi*360;            
    app.J3Slider.Value=app.q(3)/pi*360;            
    app.q4=app.q(4);            
    app.q4ValEditField.Value=app.q(4)/pi*360;            
    app.J4Slider.Value=app.q(4)/pi*360;            
    app.q5=app.q(5);            
    app.q5ValEditField.Value=app.q(5)/pi*360;            
    app.J5Slider.Value=app.q(5)/pi*360;            
    app.q6=app.q(6);            
    app.q6ValEditField.Value=app.q(6)/pi*360;            
    app.J6Slider.Value=app.q(6)/pi*360;                        
    fShowRobot(app);       
end

% Value changed function: StepPrecisionDropDown        
function StepPrecisionDropDownValueChanged(app, event)            
    if app.StepPrecisionDropDown.Value=="1"                
        app.XSpinner.Step=1;                
        app.YSpinner.Step=1;                
        app.ZSpinner.Step=1;               
        app.PXSpinner.Step=1;                
        app.PYSpinner.Step=1;                
        app.PZSpinner.Step=1;            
    elseif app.StepPrecisionDropDown.Value=="0.1"                
        app.XSpinner.Step=0.1;                
        app.YSpinner.Step=0.1;                
        app.ZSpinner.Step=0.1;                
        app.PXSpinner.Step=0.1;                
        app.PYSpinner.Step=0.1;                
        app.PZSpinner.Step=0.1;            
    elseif app.StepPrecisionDropDown.Value=="0.01"                
        app.XSpinner.Step=0.01;                
        app.YSpinner.Step=0.01;                
        app.ZSpinner.Step=0.01;                
        app.PXSpinner.Step=0.01;                
        app.PYSpinner.Step=0.01;                
        app.PZSpinner.Step=0.01;            
    elseif app.StepPrecisionDropDown.Value=="0.001"                
        app.XSpinner.Step=0.001;                
        app.YSpinner.Step=0.001;                
        app.ZSpinner.Step=0.001;                
        app.PXSpinner.Step=0.001;                
        app.PYSpinner.Step=0.001;                
        app.PZSpinner.Step=0.001;            
    end        
end   

可视化仿真效果
在这里插入图片描述备注:逆解速度较慢,故用TCP运动时会出现卡顿不连贯的现象。

后记:笔者才疏学浅,如有错误,望指出。


版权声明:本文为Dashuaixiaoping原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>