检查环境碰撞与机器人

生成的约束工作空间中的无碰撞轨迹。

定义环境

您可以使用碰撞原语一个简单的环境。例如,假设机器人处于一个工作区,其目的是从一个表将对象移动到另一个,同时避免一个圆形灯具。这些对象可以被模拟成两个箱子和一个球体。更复杂的环境可以使用创建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(“共同立场”