此示例示出了如何以模拟机器人操纵器的下闭环控制关节空间运动。
从机器人库加载一个ABB IRB-120Tloadrobot
函数。
机器人= loadrobot (“abbIrb120T”,“DataFormat”,“柱子”,“重力”,[0 0 -9.81]);numJoints = numel(homeConfiguration(机器人));
定义仿真参数,包括仿真弹道的时间范围,初始状态为(联合配置;jointVelocity]
和联合空间集中点。
%设置模拟参数tSpan = 0:0.01:0.5;q0 = 0 (numJoints, 1);q0(2) =π/ 4;某处偏离中心qd0 = 0 (numJoints, 1);initialState = [q0;qd0];%建立联合控制指标targetJointPosition = [pi/2 pi/3 pi/6 2*pi/3 -pi/2 -pi/3]';targetJointVelocity = 0 (numJoints, 1);targetJointAcceleration = 0 (numJoints, 1);
想象目标位置。
节目(机器人,targetJointPosition)
ans = Axes (Primary) with properties: XLim: [-1 1] YLim: [-1 1] XScale: 'linear' YScale: 'linear' GridLineStyle: '-' Position: [0.1300 0.1100 0.7750 0.8150] Units: 'normalized'显示所有属性
用一个jointSpaceMotionModel
对象,模拟在各种控制器的模型的闭环运动。这个例子比较其中的几个。每一个实例使用导数
函数来计算的状态衍生物。在这里,状态是2N-元素的向量(联合配置;关节速度)
, 在哪里n是关节的在相关的数rigidBodyTree
对象。
计算力矩控制使用反动力学计算来补偿机器人的动力学。该控制器基于一个二阶响应来驱动每个关节的闭环误差动力学。
创建一个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控制不需要加速度轮廓,因此状态向量为2n关节构造和关节速度的 - 元素矢量。
pdMotion = jointSpaceMotionModel (“RigidBodyTree”,机器人,“MotionType”,“PDControl”);pdMotion.Kp = DIAG(300个*也是(1,6));pdMotion.Kd = DIAG(10个*也是(1,6));
这个运动模型需要提供位置和速度。
qDesPD = [targetJointPosition;targetJointVelocity];
的导数
函数输出状态导数,可以使用常微分方程(ODE)求解器进行积分,例如数值
。对于每个运动模型,ODE求解器输出a米- 元素的列向量,其覆盖TSPAN
和2-逐米2的矩阵n在每个时间瞬间 - 元素状态向量。
计算每个运动模型的轨迹,利用每个系统的最合适的ODE解算器。
[tComputedTorque,yComputedTorque] = ODE45(@(T,Y)衍生物(computedTorqueMotion,Y,qDesComputedTorque),TSPAN,初始化状态);[tIndepJoint,yIndepJoint] = ODE45(@(T,Y)衍生物(IndepJointMotion,Y,qDesIndepJoint),TSPAN,初始化状态);[TPD,YPD] = ode15s(@(T,Y)衍生物(pdMotion,Y,qDesPD),TSPAN,初始化状态);
一旦模拟完成,将结果并排进行比较。每个图在顶部显示关节位置,在底部显示速度。虚线表示参考轨迹,实线显示模拟响应。
%计算转矩控制图副区(2,1,1)情节(tComputedTorque,yComputedTorque(:,1:numJoints))%共同立场持有全部情节(tComputedTorque targetJointPosition *(1,长度(tComputedTorque)),' - ')%联合设定标题(“计算力矩运动:关节位置”)包含('时间(s)') ylabel (“位置(弧度)”次要情节(2,1,2)情节(tComputedTorque, yComputedTorque (:, numJoints + 1:结束)%连接速度标题(“联合速度”)包含('时间(s)') ylabel (“速度(rad / s)”)
在下面的曲线图中,使用独立的联合控制来确认等效下一些简化的假设所计算的扭矩运动的行为。
独立关节运动%图subplot(2,1,1) plot(tIndepJoint,yIndepJoint(:,1:numJoints)) hold全部情节(tIndepJoint targetJointPosition *(1,长度(tIndepJoint)),' - ') 标题(“独立关节运动:位置”)包含('时间(s)') ylabel (“位置(弧度)”次要情节(2,1,2);情节(tIndepJoint yIndepJoint (:, numJoints + 1:结束)标题(“联合速度”)包含('时间(s)') ylabel (“速度(rad / s)”)
最后,PD控制器使用相当积极的收益来实现类似的上升时间,但不像其他方法,各个关节的行为不同,因为每个关节和相关的机构有不通过控制器补偿稍有不同的动态特性。
% PD与重力补偿figure subplot(2,1,1) plot(tPD,yPD(:,1: numjoint)) hold全部情节(兼总经理,targetJointPosition *(1,长度(兼总经理)),' - ') 标题('PD控制关节运动:位置')包含('时间(s)') ylabel (“位置(弧度)”)副区(2,1,2)情节(TPD,YPD(:,numJoints + 1:结束))标题(“联合速度”)包含('时间(s)') ylabel (“速度(rad / s)”)
要了解这种行为看起来像在3 d,下面的例子助手绘制在时间上的机器人运动。第三输入是每个样本之间的帧的数目。
exampleHelperRigidBodyTreeAnimation(机器人yComputedTorque 1);
exampleHelperRigidBodyTreeAnimation(机器人yIndepJoint 1);
exampleHelperRigidBodyTreeAnimation(机器人yPD 1);