主要内容

模拟MATLAB中的关节空间轨迹跟踪

该实例演示了如何在闭环控制下仿真机器人的关节空间运动。

定义机器人和初始状态

使用该载体从机器人库加载ABB IRB-120Tloadrobot.功能。

robot = loadrobot(“abbirb120t”“dataformat”“列”“重力”[0 0 -9.81]);numJoints =元素个数(homeConfiguration(机器人));

定义仿真参数,包括仿真轨迹的时间范围,初始状态为(联合配置;jointVelocity],关节空间设定点。

%设置模拟参数TSPAN = 0:0.01:0.5;q0 = zeros(numjoints,1);Q0(2)= PI / 4;%偏离中心qd0 = zeros(numjoints,1);initialstate = [q0;QD0];%建立联合控制目标targetjointposition = [pi / 2 pi / 3 pi / 6 2 * pi / 3-pi / 2-pi / 3]';targetjointvelocity = zeros(numjoints,1);targetjointacceleration = zeros(numjoints,1);

可视化目标位置。

显示(机器人,targetJointPosition)

图包含轴。轴包含24个类型的贴片物体,线。这些对象表示base_link,base,link_1,link_2,link_3,link_4,link_5,link_6,tool0,link_1_mesh,link_2_mesh,link_3_mesh,link_4_mesh,link_5_mesh,link_6_mesh,base_link_mesh。

ANS = AXES(主要)具有属性:XLIM:[-1 1] ylim:[-1 1] xscale:'linear'yscale:'linear'gridlamestyle:' - '位置:[0.1300 0.1100 0.7750 0.8150]单位:'标准化'显示所有属性

具有关节空间控制的模型行为

使用一个jointSpaceMotionModel对象,仿真了该模型在多种控制器下的闭环运动。这个例子比较了其中一些。每个实例使用衍生物函数来计算状态导数。这里,状态是2n -元素矢量(联合配置;联合速度],在那里N关节的数量是否相关rigidBodyTree目的。

计算 - 扭矩控制

计算 - 扭矩控制使用逆动态计算来补偿机器人动态。基于二阶响应,控制器驱动每个接头的闭环错误动态。

创建一个jointSpaceMotionModel并指定机器人模型。设置“motiontype”“ComputedTorqueControl”。使用时更新错误动态updateErrorDynamicsFromStep并分别指定所需的沉降时间和过冲。或者,您可以直接在对象中设置阻尼比和自然频率。

computedTorqueMotion = jointSpaceMotionModel (“刚性小孩”,机器人,“motiontype”“ComputedTorqueControl”);updateRordynamicsfromStep(ComputedTorQueMotion,0.2,0.1);

该运动模型需要提供位置,速度和加速度。

qDesComputedTorque = [targetJointPosition;targetJointVelocity;TargetJointAcceleration];

在Simulink中查看此控制器的示例,请参阅金宝app使用机器人操作机块进行安全轨迹跟踪控制的例子。

独立的联合控制

采用独立的关节控制,将每个关节建模为具有二阶跟踪响应的单独系统。这种类型的模型是一种理想化的行为,在响应较慢或动力学对合成轨迹没有显著影响时使用最好。在这些情况下,它的行为将与计算扭矩控制相同,但计算开销更小。

创建另一个joinSpaceMotionModel使用“IndependentJointMotion”运动类型。

IndepJointMotion = jointSpaceMotionModel (“刚性小孩”,机器人,“motiontype”“IndependentJointMotion”);updateErrorDynamicsFromStep (IndepJointMotion, 0.2, 0.1);

该运动模型需要提供位置,速度和加速度。

qdesindepjoint = [targetjointposition;targetJointVelocity;TargetJointAcceleration];

比例微分控制

比例导数控制,或PD控制,结合重力补偿与比例和导数增益。尽管相对于其他封闭形式的模型更简单,PD控制器对于所有正增益值都是稳定的,这使得它成为一个理想的选择。这里PD增益设为N——- - - - - -N矩阵,N关节的数量是否相关rigidBodyTree目的。对于这个机器人,N= 6.此外,PD控制不需要加速度,因此其状态向量仅为2N关节构型和关节速度的元向量。

pdmotion = ConnectspaceMotionModel(“刚性小孩”,机器人,“motiontype”“PDControl”);pdMotion。Kp =诊断接头(300 * (1,6);pdMotion。Kd =诊断接头(10 * 1 (1,6);

该运动模型需要提供位置和速度。

qdespd = [targetjointposition;targetjointvelocity];

模拟使用ODE求解器

衍生物功能输出状态导数,可以使用常微分方程(ode)解算器集成,例如ODE45.。对于每个运动模型,ode求解器输出am-元素列向量覆盖tspan和2 -m2的矩阵N每个时刻的元素状态向量。

计算每个运动模型的轨迹,使用最合适的ODE求解器为每个系统。

[tComputedTorque, yComputedTorque] =数值(@ (t, y)导数(computedTorqueMotion y qDesComputedTorque) tSpan, initialState);[tIndepJoint, yIndepJoint] =数值(@ (t, y)导数(IndepJointMotion y qDesIndepJoint) tSpan, initialState);(兼总经理,yPD) = ode15s (@ (t, y)导数(pdMotion y qDesPD) tSpan, initialState);

绘图结果

仿真完成后,将结果并排进行比较。每个曲线显示顶部的关节位置,底部的速度。虚线表示参考轨迹,而实线显示模拟响应。

计算转矩控制图次要情节(2,1,1)情节(tComputedTorque, yComputedTorque (:, 1: numJoints))%接头位置抓住所有绘图(tcomputedtorque,targetjointposition * ofter(1,长度(Tcomputedtorque)),“——”%联合定位点标题(“计算扭矩运动:关节位置”)xlabel(“时间(s)”) ylabel (“位置(rad)”)子图(2,1,2)绘图(TComputedTorque,YcomputedTorque(:,numjoints + 1:结束))%联合速度标题('联合速度')xlabel(“时间(s)”) ylabel (“速度(rad / s)”

图包含2个轴。带有标题计算扭矩运动的轴1:接头位置包含12个类型的线。带有标题关节速度的轴2包含6个类型的线。

在下面的图中,使用独立的关节控制来确认所计算的力矩运动在某些简化的假设下是等效的。

%独立关节运动图形子图(2,1,1)plot(tindepjoint,yindepjoint(:,1:numjoints)保持所有绘图(tindepjoint,targetjointposition *那些(1,长度(tindepjoint)),“——”)标题(“独立关节运动:位置”)xlabel(“时间(s)”) ylabel (“位置(rad)”)子图(2,1,2);plot(tindepjoint,yindepjoint(:,numjoints + 1:结束))标题('联合速度')xlabel(“时间(s)”) ylabel (“速度(rad / s)”

图包含2个轴。轴1带标题独立关节运动:位置包含12个类型的线。带有标题关节速度的轴2包含6个类型的线。

最后,PD控制器使用相当激进的增益来实现类似的上升时间,但与其他方法不同的是,单个关节的行为不同,因为每个关节和相关的机构有轻微不同的动态特性,这些动态特性没有被控制器补偿。

% PD与重力补偿图形子图(2,1,1)绘图(TPD,YPD(:,1:numjoints))保持所有情节(兼总经理,targetJointPosition *(1,长度(兼总经理)),“——”)标题('PD控制关节运动:位置')xlabel(“时间(s)”) ylabel (“位置(rad)”) subplot(2,1,2) plot(tPD,yPD(:, numnodes +1:end))'联合速度')xlabel(“时间(s)”) ylabel (“速度(rad / s)”

图包含2个轴。带有标题PD控制的关节运动的轴1:位置包含12个类型的线。带有标题关节速度的轴2包含6个类型的线。

将轨迹可视化为动画

为了查看这种行为在3-D中是什么样子,下面的示例帮助实时绘制机器人运动。第三个输入是每个样本之间的帧数。

examplehelperrigidbodytreeAnmation(机器人,ycomptedtorque,1);

图包含轴。具有标题框架= 51的轴的51包含7个类型的贴片物体。这些对象表示base_link,base,link_1,link_2,link_3,link_4,link_5,link_6,tool0,link_1_mesh,link_2_mesh,link_3_mesh,link_4_mesh,link_5_mesh,link_6_mesh,base_link_mesh。

examplehelperrigidbodytreeAnmation(机器人,yindepjoint,1);

图包含轴。具有标题框架= 51的轴的51包含7个类型的贴片物体。这些对象表示base_link,base,link_1,link_2,link_3,link_4,link_5,link_6,tool0,link_1_mesh,link_2_mesh,link_3_mesh,link_4_mesh,link_5_mesh,link_6_mesh,base_link_mesh。

examplehelperrigidbodytreeanimation(机器人,ypd,1);

图包含轴。具有标题框架= 51的轴的51包含7个类型的贴片物体。这些对象表示base_link,base,link_1,link_2,link_3,link_4,link_5,link_6,tool0,link_1_mesh,link_2_mesh,link_3_mesh,link_4_mesh,link_5_mesh,link_6_mesh,base_link_mesh。