生成的约束工作空间中的无碰撞轨迹。
您可以使用碰撞原语一个简单的环境。例如,假设机器人处于一个工作区,其目的是从一个表将对象移动到另一个,同时避免一个圆形灯具。这些对象可以被模拟成两个箱子和一个球体。更复杂的环境可以使用创建collisionMesh
对象。
%创建两个平台PLATFORM1 = collisionBox(0.5,0.5,0.25);platform1.Pose = trvec2tform([ - 0.5 0.4 0.2]);PLATFORM2 = collisionBox(0.5,0.5,0.25);platform2.Pose = trvec2tform([0.5 0.2 0.2]);%添加灯具,建模为球lightFixture = collisionSphere(0.1);lightFixture.Pose = trvec2tform([2 0 1。]);在一个单元阵列用于碰撞检查%商店worldCollisionArray = {PLATFORM1 PLATFORM2 lightFixture};
使用可视化,通过碰撞阵列遍历一个辅助函数的环境。
exampleHelperVisualizeCollisionEnvironment(worldCollisionArray);
一个Kinova机械手添加到原点的环境。加载提供机器人模型。可视化的障碍,并显示在同一图中的机器人。
机器人= loadrobot(“kinovaGen3”,“DATAFORMAT”,“柱”,“重力”,[0 0 -9.81]);AX = exampleHelperVisualizeCollisionEnvironment(worldCollisionArray);显示(机器人,homeConfiguration(机器人),“家长”,斧头);
创建从碰撞对象的数组rigidBodyTree
目的。这种方法使用了一个例子帮手,exampleHelperManipCollisionsFromVisuals
,提取从每个第一视觉的网眼刚体
目的。对于其他方法的概述,请参阅创建机器人碰撞检测碰撞对象。
%生成碰撞对象的从相关联的树的视觉效果的阵列collisionArray = exampleHelperManipCollisionsFromVisuals(机器人);
定义一个开始和结束姿势如位置和方向。用逆运动学
来求解基于期望姿态的关节位置。手动检查以验证配置是有效的。
startPose = trvec2tform([ - 0.5,0.5,0.4])* axang2tform([1个0 0π);endPose = trvec2tform([0.5,0.2,0.4])* axang2tform([1个0 0π);%使用固定随机种子,以确保可重复的结果RNG(0);IK =逆运动学(“RigidBodyTree”,机器人);权重=酮(1,6);startConfig = IK(“EndEffector_Link”,startPose,重量robot.homeConfiguration);endConfig = IK(“EndEffector_Link”,endPose,重量robot.homeConfiguration);%显示最初和最后的位置显示(机器人,startConfig);显示(机器人,endConfig);
使用梯形速度分布,产生从原始位置向起始位置的平滑的轨迹,然后到最后的位置。使用碰撞检查,看看这是否会造成任何冲突。
Q = trapveltraj([homeConfiguration(机器人),startConfig,endConfig],200,“时间结束”,2);%初始化输出isCollision =假(长度(q)中,1);%检查每个姿势是否在碰撞selfCollisionPairIdx =细胞(长度(q)中,1);%提供了在发生碰撞的尸体worldCollisionPairIdx =细胞(长度(q)中,1);%提供了在发生碰撞的尸体对于I = 1:长度(Q)[isCollision(i)中,selfCollisionPairIdx {I},worldCollisionPairIdx {I}] = exampleHelperManipCheckCollisions(机器人,collisionArray,worldCollisionArray,Q(:,i)中,假);结束isTrajectoryInCollision =任何(isCollision)
isTrajectoryInCollision =合乎逻辑1
通过检查碰撞,有发生2次碰撞。这些可视化配置,以进一步调查。
problemIdx1 =找到(isCollision,1);problemIdx2 =找到(isCollision,1,“持续”);%找出问题刚体problemBodies1 = [{selfCollisionPairIdx} problemIdx1 {worldCollisionPairIdx} problemIdx1 * [1 0]];problemBodies2 = [{selfCollisionPairIdx} problemIdx2 {worldCollisionPairIdx} problemIdx2 * [1 0]];%可视化环境AX = exampleHelperVisualizeCollisionEnvironment(worldCollisionArray);%添加机器人和突出问题机构节目(机器人,Q(:,problemIdx1),“家长”,斧头,“PreservePlot”,假);exampleHelperHighlightCollisionBodies(机器人,problemBodies1,斧);节目(机器人,Q(:,problemIdx2),“家长”',斧头);exampleHelperHighlightCollisionBodies(机器人,problemBodies2,斧);
为了避免这些冲突,增加中间路标,以确保绕过障碍物,机器人可前往[。
intermediatePose1 = trvec2tform([ - 3 -.2 0.6。])* axang2tform([0 1 0 -pi / 4]);%Out和球体周围intermediatePose2 = trvec2tform([0.2,0.2,0.6])* axang2tform([1个0 0π);%的从上方来intermediateConfig1 = IK(“EndEffector_Link”,intermediatePose1,权重,Q(:,problemIdx1));intermediateConfig2 = IK(“EndEffector_Link”,intermediatePose2,权重,Q(:,problemIdx2));%显示新的中间姿势AX = exampleHelperVisualizeCollisionEnvironment(worldCollisionArray);显示(机器人,intermediateConfig1,“家长”,斧头,“PreservePlot”,假);显示(机器人,intermediateConfig2,“家长”,斧头);
生成一个新的轨迹。
[Q,QD,检疫侦缉犬,T] = trapveltraj([homeConfiguration(机器人),intermediateConfig1,startConfig,intermediateConfig2,endConfig],200,“时间结束”,2);
验证它是免费的碰撞。
%初始化输出isCollision =假(长度(q)中,1);%检查每个姿势是否在碰撞collisionPairIdx =细胞(长度(q)中,1);%提供了在发生碰撞的尸体对于I = 1:长度(Q)[isCollision(i)中,collisionPairIdx {I}] = exampleHelperManipCheckCollisions(机器人,collisionArray,worldCollisionArray,Q(:,i)中,假);结束isTrajectoryInCollision =任何(isCollision)
isTrajectoryInCollision =合乎逻辑0
动画的结果。
%绘制环境AX2 = exampleHelperVisualizeCollisionEnvironment(worldCollisionArray);%可视化的机器人,它的首页设定显示(机器人,startConfig,“家长”,AX2);%更新轴线尺寸轴等于通过其它位置%循环对于I = 1:长度(q)中示出了(机器人,Q(:,i)中,“家长”,AX2,“PreservePlot”,假);%更新图的DrawNow结束
绘制随时间变化的共同立场。
图图(T,Q)xlabel(“时间”)ylabel(“共同立场”)