在MATLAB中模拟关节空间轨迹跟踪
本例展示了如何在闭环控制下模拟机械臂的关节空间运动。
定义机器人和初始状态
从机器人库中加载ABB IRB-120Tloadrobot
函数。
机器人=装载机器人(“abbIrb120T”,“DataFormat”,“列”,“重力”,[0 0 -9.81]);numjoint = nummel (homeConfiguration(robot));
定义仿真参数,包括弹道被模拟的时间范围,初始状态为(联合配置;jointVelocity]
,关节空间设定点。
设置仿真参数tSpan = 0:0.01:0.5;q0 = 0 (num关节,1);Q0 (2) = pi/4;%某物偏离中心qd0 = 0 (num关节,1);initialState = [q0;qd0];建立联合控制目标targetJointPosition = [pi/2 pi/3 pi/6 2*pi/3 -pi/2 -pi/3]';targetJointVelocity = 0 (num关节,1);targetJointAcceleration = 0 (num关节,1);
想象一下目标位置。
显示(机器人,targetJointPosition)
ans =轴(主要)与属性:XLim: [-1 1] YLim: [-1 1] XScale: '线性' YScale: '线性' GridLineStyle: '-'位置:[0.1300 0.1100 0.7750 0.8150]单位:'归一化'显示所有属性
关节空间控制的行为模型
使用一个jointSpaceMotionModel
对象,模拟模型在各种控制器下的闭环运动。这个例子比较了其中的一些。每个实例都使用导数
函数来计算状态导数。这里,状态是2n -元素的向量(联合配置;关节速度)
,在那里n关节的数量是相关的吗rigidBodyTree
对象。
Computed-Torque控制
计算转矩控制采用逆动力学计算来补偿机器人的动力学。该控制器基于二阶响应驱动每个关节的闭环误差动态。
创建一个jointSpaceMotionModel
并指定机器人模型。设置“MotionType”
来“ComputedTorqueControl”
.使用更新错误动态updateErrorDynamicsFromStep
并分别指定所需的沉降时间和超调量。或者,您可以直接在对象中设置阻尼比和固有频率。
computedTorqueMotion = jointSpaceMotionModel(“RigidBodyTree”,机器人,“MotionType”,“ComputedTorqueControl”);updateErrorDynamicsFromStep (computedTorqueMotion, 0.2, 0.1);
这个运动模型需要提供位置、速度和加速度。
qDesComputedTorque = [targetJointPosition;targetJointVelocity;targetJointAcceleration];
要在Simulink中查看此控制器的实际示例,请参见金宝app使用机器人机械手块执行安全轨迹跟踪控制的例子。
独立联合控制
对于独立的关节控制,将每个关节建模为具有二阶跟踪响应的独立系统。这种类型的模型是一种理想化的行为,当响应较慢,或者当动力学对所得到的轨迹没有重大影响时,最好使用这种模型。在这些情况下,它的行为将与计算扭矩控制相同,但计算开销更少。
创建另一个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 Control不需要加速度剖面,所以它的状态向量只是2n-关节构型和关节速度的单元向量。
pdMotion = jointSpaceMotionModel(“RigidBodyTree”,机器人,“MotionType”,“PDControl”);pdMotion。Kp = diag(300*ones(1,6));pdMotion。Kd = diag(10*ones(1,6));
这个运动模型需要提供位置和速度。
qDesPD = [targetJointPosition;targetJointVelocity];
使用ODE求解器进行模拟
的导数
函数输出状态导数,可以使用常微分方程(ODE)求解器进行积分,例如数值
.对于每个运动模型,ODE求解器输出一个米-元素列向量覆盖tspan
还有一个2 ×米2的矩阵n-元素的状态向量。
计算每个运动模型的轨迹,为每个系统使用最合适的ODE求解器。
[tComputedTorque,yComputedTorque] = ode45(@(t,y)derivative(computedTorqueMotion,y,qDesComputedTorque),tSpan,initialState);[tIndepJoint,yIndepJoint] = ode45(@(t,y)derivative(IndepJointMotion,y,qDesIndepJoint),tSpan,initialState);[tPD,yPD] = ode15s(@(t,y)derivative(pdMotion,y,qDesPD),tSpan,initialState);
阴谋的结果
模拟完成后,将结果并排比较。每个图在顶部显示关节位置,在底部显示速度。虚线表示参考轨迹,实线显示模拟响应。
计算转矩控制图subplot(2,1,1) plot(tComputedTorque,yComputedTorque(:,1: num关节))%关节位置持有所有情节(tComputedTorque targetJointPosition *(1,长度(tComputedTorque)),“——”)%关节设定点标题(“计算扭矩运动:关节位置”)包含(“时间(s)”) ylabel (“位置(rad)”) subplot(2,1,2) plot(tComputedTorque,yComputedTorque(:, numjoint +1:end))关节速度%标题(“联合速度”)包含(“时间(s)”) ylabel (“速度(rad / s)”)
在下面的图中,使用独立的关节控制来确认在一些简化假设下计算的扭矩运动是等效的。
%独立关节运动图subplot(2,1,1) plot(tIndepJoint,yIndepJoint(:,1: numjoint))持有所有情节(tIndepJoint targetJointPosition *(1,长度(tIndepJoint)),“——”)标题(“独立关节运动:位置”)包含(“时间(s)”) ylabel (“位置(rad)”次要情节(2,1,2);情节(tIndepJoint yIndepJoint (:, numJoints + 1:结束)标题(“联合速度”)包含(“时间(s)”) ylabel (“速度(rad / s)”)
最后,PD控制器使用相当积极的增益来实现类似的上升时间,但与其他方法不同的是,各个关节的行为不同,因为每个关节和相关的物体具有轻微不同的动态特性,不由控制器补偿。
% PD与重力补偿图subplot(2,1,1) plot(tPD,yPD(:,1: num关节))保持所有情节(兼总经理,targetJointPosition *(1,长度(兼总经理)),“——”)标题(PD控制关节运动:位置)包含(“时间(s)”) ylabel (“位置(rad)”) subplot(2,1,2) plot(tPD,yPD(:, numjoint +1:end))“联合速度”)包含(“时间(s)”) ylabel (“速度(rad / s)”)
将轨迹可视化为动画
要了解这种行为在3d中是什么样子的,下面的示例助手按时间绘制机器人运动。第三个输入是每个样本之间的帧数。
exampleHelperRigidBodyTreeAnimation(机器人yComputedTorque 1);
exampleHelperRigidBodyTreeAnimation(机器人yIndepJoint 1);
exampleHelperRigidBodyTreeAnimation(机器人yPD 1);