在MATLAB模拟关节空间轨迹跟踪
这个例子展示了如何模拟闭环控制下的一个机器人机械手的关节空间运动。
定义机器人和初始状态
加载一个ABB irb - 120 t的图书馆使用机器人loadrobot
函数。
机器人= loadrobot (“abbIrb120T”,“DataFormat”,“列”,“重力”[0 0 -9.81]);numJoints =元素个数(homeConfiguration(机器人));
定义仿真参数,包括时间范围的轨迹模拟,初始状态(联合配置;jointVelocity]
和关节空间设置点。
%设置仿真参数tSpan = 0:0.01:0.5;q0 = 0 (numJoints, 1);q0(2) =π/ 4;%的东西偏离中心qd0 = 0 (numJoints, 1);initialState = [q0;qd0];%建立联合控制的目标targetJointPosition =(π/ 2π/ 3π/ 2 * 6π/ 3 -π/ 2 -π/ 3)';targetJointVelocity = 0 (numJoints, 1);targetJointAcceleration = 0 (numJoints, 1);
可视化的目标位置。
显示(机器人,targetJointPosition)
ans =轴(初级)属性:XLim: [1] YLim: [1] XScale:“线性”YScale:“线性”GridLineStyle:“-”位置:[0.1300 0.1100 0.7750 0.8150)单位:“规范化”显示所有属性
行为与关节空间控制模型
使用一个jointSpaceMotionModel
对象,模拟模型的闭环运动在不同的控制器。这个例子比较了其中的一些。每个实例使用导数
函数导数计算状态。在这里,国家是2n -元素的向量(联合配置;关节速度)
,在那里n相关的关节数量吗rigidBodyTree
对象。
Computed-Torque控制
Computed-torque控制使用一个逆动力学计算补偿机器人动力学。控制器驱动各关节的闭环误差动态基于二阶响应。
创建一个jointSpaceMotionModel
并指定机器人模型。设置“MotionType”
来“ComputedTorqueControl”
。更新动态使用的错误updateErrorDynamicsFromStep
并分别指定所需的沉降时间和超调。或者,您可以直接设置阻尼比和固有频率的对象。
computedTorqueMotion = jointSpaceMotionModel (“RigidBodyTree”,机器人,“MotionType”,“ComputedTorqueControl”);updateErrorDynamicsFromStep (computedTorqueMotion, 0.2, 0.1);
这个运动模型需要的位置、速度和加速度提供。
qDesComputedTorque = [targetJointPosition;targetJointVelocity;targetJointAcceleration];
查看在实践中该控制器在模型的一个例子,看到万博1manbetx执行安全使用机器人机械手轨迹跟踪控制块的例子。
独立的联合控制
与独立的联合控制,模型每个联合作为一个独立的系统,都有一个二阶跟踪响应。这种类型的模型是一个理想的行为,是最好的用于响应缓慢,或者当动力学不会产生重大影响的轨迹。在这些情况下,将computed-torque控制相同,但计算开销较小。
创建另一个joinSpaceMotionModel
使用“IndependentJointMotion”
运动类型。
IndepJointMotion = jointSpaceMotionModel (“RigidBodyTree”,机器人,“MotionType”,“IndependentJointMotion”);updateErrorDynamicsFromStep (IndepJointMotion, 0.2, 0.1);
这个运动模型需要的位置、速度和加速度提供。
qDesIndepJoint = [targetJointPosition;targetJointVelocity;targetJointAcceleration];
比例微分控制
比例微分控制,或PD控制,结合重力补偿比例和衍生品收益。尽管简单自然相对于其他封闭模型,所有积极的PD控制器可以稳定的增益值,这使得它的理想选择。在这里,设置为PD的收益n——- - - - - -n矩阵,n相关的关节数量吗rigidBodyTree
对象。这个机器人,n= 6。此外,PD控制不需要加速,所以它的状态向量是一个2n元向量的联合配置和关节速度。
pdMotion = jointSpaceMotionModel (“RigidBodyTree”,机器人,“MotionType”,“PDControl”);pdMotion。Kp =诊断接头(300 * (1,6);pdMotion。Kd =诊断接头(10 * 1 (1,6);
这个运动需要提供位置和速度模型。
qDesPD = [targetJointPosition;targetJointVelocity];
模拟使用ODE求解器进行求解
的导数
函数输出状态的导数,可以综合使用一个常微分方程(ODE)解算器等数值
。对于每一个运动模型,ODE求解器输出米元列向量覆盖tspan
和2 -米矩阵的2n有效状态向量在每个瞬间。
计算每个运动的轨迹模型,对每个系统使用最合适的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 *(1,长度(tComputedTorque)),“——”)%联合定位点标题(计算转矩运动:关节位置的)包含(“时间(s)”)ylabel (“位置(rad)”次要情节(2,1,2)情节(tComputedTorque, yComputedTorque (:, numJoints + 1:结束)%连接速度标题(“联合速度”)包含(“时间(s)”)ylabel (“速度(rad / s)”)
在接下来的情节,使用独立的联合控制确认计算转矩运动行为等同于在某些简化假设。
%独立联合运动图次要情节(2,1,1)情节(tIndepJoint, yIndepJoint (:, 1: numJoints))所有情节(tIndepJoint targetJointPosition *(1,长度(tIndepJoint)),“——”)标题(“独立的联合运动:位置”)包含(“时间(s)”)ylabel (“位置(rad)”次要情节(2,1,2);情节(tIndepJoint yIndepJoint (:, numJoints + 1:结束)标题(“联合速度”)包含(“时间(s)”)ylabel (“速度(rad / s)”)
最后,PD控制器使用相当大的收益实现类似的上升时间,但与其他方法不同的是,各个关节的行为会有所不同,因为每个关节和相关的身体稍微不同的动态属性,不补偿控制器。
% PD与重力补偿图次要情节(2,1,1)情节(兼总经理,yPD (:, 1: numJoints))所有情节(兼总经理,targetJointPosition *(1,长度(兼总经理)),“——”)标题(“PD控制的联合运动:位置”)包含(“时间(s)”)ylabel (“位置(rad)”次要情节(2,1,2)情节(兼总经理,yPD (:, numJoints + 1:结束)标题(“联合速度”)包含(“时间(s)”)ylabel (“速度(rad / s)”)
作为一个动画可视化轨迹
在3 d看到这种行为是什么样子,下面的例子辅助情节机器人运动。第三个输入是每个样本之间的帧数。
exampleHelperRigidBodyTreeAnimation(机器人yComputedTorque 1);
exampleHelperRigidBodyTreeAnimation(机器人yIndepJoint 1);
exampleHelperRigidBodyTreeAnimation(机器人yPD 1);