使用KINOVA Gen3机械手规划和执行无碰撞轨迹
机器人描述和姿势
robot=装载机器人( “kinovaGen3” , '数据格式' , '列' );
numJoints=numel(homeConfiguration(robot));
末端效应器= “EndEffector_Link” ;
%初始末端效应器姿势 taskInit=trvec2tform([0.4 0 0.2]])*axang2tforms([0 1 0 pi]); %使用反向运动学计算当前机器人关节配置 ik=反向运动学( “刚体树” ,机器人); 例如:。 解算器参数。 AllowRandomRestart=false; 权重=[1 1 1 1 1 1]; currentRobotJConfig=ik(endEffector,taskInit,weights,robot.homeConfiguration); %IK解算器尊重关节限制,但对于那些具有无限大的关节 %范围,它们必须被包装成区间[-pi,pi]上的有限范围。 %由于其他关节已在此范围内绑定,因此 %足以对整个机器人配置调用wrapToPi %而不仅仅是在无限范围的关节上。 currentRobotJConfig=wrapToPi(current机器人JConfig); %最终(所需)末端效应器姿势 taskFinal=trvec2表格([0.35 0.55 0.35])*axang2表格(+0 1 0 pi]); 角度最终值=rotm2eul(taskFinal(1:3,1:3), “XYZ” ); poseFinal=[taskFinal(1:3,4);角度Final’]; %最终姿势的6x1矢量:[x,y,z,phi,theta,psi]
碰撞网格和障碍物
isMovingObst=真;
helperCreateObstaclesKINOVA;
x0=[currentRobotJConfig',零(1,numJoints)]; helperInitialVisualizerKINOVA;
安全距离=0.01;
非线性模型预测控制器的设计
helperDesignNLMPCobjKINOVA;
机器人关节模型由双积分器描述。 模型的状态为 ,其中7个接头位置表示为 它们的速度表示为 模型的输入是联合加速度 模型的动力学由下式给出
的成本函数 nlobj公司 是一个自定义非线性成本函数,其定义方式类似于二次跟踪成本加终端成本。
为了避免冲突,控制器必须满足以下不等式约束。
闭环轨迹规划
最大值=50; u0=零(1,numJoints); mv=u0; 时间=0; goalReached=false;
位置=零(numJoints,maxIters); 位置(:,1)=x0(1:numJoints)'; 速度=零(numJoints,maxIters); 速度(:,1)=x0(numJoints+1:结束)'; 加速度=零(numJoints,maxIters); 加速度(:,1)=u0'; 时间戳=零(1,maxIters); 时间戳(:,1)=时间;
选项=nlmpcmoveopt; 对于 时间步长=1:maxIters 显示([ '在时间步计算控件' ,num2str(时间步)]); %优化下一个轨迹点 [mv,options,info]=nlmpcmove(nlobj,x0,mv,[],[]); 如果 信息。 退出标志<0 显示( “无法计算可行的轨迹。 正在中止…' ) 打破 ; 结束 %更新下一次迭代的状态和时间 x0=信息。 Xopt(2,:); 时间=时间+nlobj.Ts; %存储轨迹点 位置(:,时间步+1)=x0(1:numJoints)'; 速度(:,时间步+1)=x0(numJoints+1:结束)'; 加速度(:,timestep+1)=信息。 MVopt(2,:)'; timestamp(timestep+1)=时间; %检查目标是否实现 帮助检查目标达到KINOVA; 如果 已达成目标 打破 ; 结束 %如果障碍物正在移动,则更新障碍物姿势 如果 正在移动Obst helperUpdateMovingObstaclesKINOVA; 结束 结束
在时间步长1计算控制
在自定义成本函数中未使用或归零的松弛变量。 所有约束都很难实现。
在时间步骤2计算控制
在自定义成本函数中未使用或归零的松弛变量。 所有约束都很难实现。
在时间步骤3计算控制
在自定义成本函数中未使用或归零的松弛变量。 所有约束都很难实现。
在时间步骤4计算控制
在自定义成本函数中未使用或归零的松弛变量。 所有约束都很难实现。
在时间步骤5计算控制
在自定义成本函数中未使用或归零的松弛变量。 所有约束都很难实现。
在时间步骤6计算控制
在自定义成本函数中未使用或归零的松弛变量。 所有约束都将是困难的。
在时间步骤7计算控制
在自定义成本函数中未使用或归零的松弛变量。 所有约束都很难实现。
已达到目标配置。
使用Joint-Space机器人仿真和控制执行计划轨迹
tFinal=时间步长+1; positions=位置(:,1:t最终); 速度=速度(:,1:t最终); 加速度=加速度(:,1:t最终); timestamp=时间戳(:,1:t最终); visTimeStep=0.2;
motionModel=关节空间运动模型( “刚体树” ,机器人); %利用低维模型控制机器人到目标轨迹点的仿真 initState=[位置(:,1);速度(:,2)]; targetStates=[位置;速度;加速度]'; [t,robotStates]=ode15s(@(t,state)helperTimeBasedStateInputsKINOVA(运动模型,时间戳,目标状态,t,状态), ... [时间戳(1):visTimeStep:时间戳(结束)],initState);
helperFinalVisualizerKINOVA;