主要内容

manipulatorRRT

利用双向RRT规划刚体树运动

自从R2020b

描述

manipulatorRRTobject是一个针对机械臂的单查询规划器,它使用双向快速探索随机树(RRT)算法和可选的连接启发式来潜在地提高速度。

双向RRT规划器在指定的开始和目标配置处创建两个根节点的树。为了扩展每棵树,规划器生成一个随机配置,如果有效,则从最近的节点基于MaxConnectionDistance财产。在每个扩展之后,规划器尝试使用新的扩展和对面树上最近的节点在两个树之间连接。与环境冲突的无效配置或连接不会添加到树中。

对于更贪婪的搜索,启用EnableConnectHeuristic属性上的限制MaxConnectionDistance属性。

图像显示了从开始和结束目标开始的两个分支树的扩展。当EnableConnectHeurist为true时,连接步骤不受最大连接距离的限制。

设置EnableConnectHueristic财产属性的值将两个树之间的连接扩展距离限制为MaxConnectionDistance财产。

图像显示了从开始和结束目标开始的两个分支树的扩展。当EnableConnectHeurist为false时,连接步骤受最大连接距离限制。

对象使用rigidBodyTree机器人模型生成随机配置和节点之间的中间状态。碰撞对象在机器人模型中指定,以验证配置并检查与环境或机器人本身的碰撞。

若要规划开始配置和目标配置之间的路径,请使用计划对象的功能。方法在规划之后,可以沿路径插入状态插入对象的功能。若要尝试通过修剪边缘来缩短路径,请使用缩短对象的功能。

若要指定在目标构型附近对末端执行器姿态进行采样的区域,请创建workspaceGoalRegion对象,并将其指定为goalRegion输入计划对象的功能。若要更改对其他目标配置进行抽样的概率,请指定WorkspaceGoalRegionBias财产。

有关计算复杂度的详细信息,请参见规划的复杂性

创建

描述

例子

rrt =操作系统(robotRBT{})创建指定的双向RRT计划器rigidBodyTree机器人模型。空单元格数组表示环境中没有障碍物。

rrt =操作系统(robotRBTcollisionObjects为放置在环境中的碰撞对象的机器人模型创建一个规划器。计划器检查与这些对象的碰撞。

例子

rrt =操作系统(___地图=地图指定三维占用图地图代表环境。这需要导航工具箱™。

输入参数

全部展开

表示环境的三维占用图,指定为occupancyMap3D(导航工具箱)对象。注意manipulatorRRT对象不深度复制指定的映射,而是持有指定映射的句柄。

指定此输入参数需要“导航工具箱”。

属性

全部展开

计划配置之间的最大长度,指定为正标量。该物体计算运动的长度为两个关节构型之间的欧几里得距离。在扩展过程中,这是配置可以更改的最大距离。

当转动关节有无限极限时,两个关节位置之间的差值用angdiff函数。

如果EnableConnectheuristic属性设置为真正的,在连接阶段,对象在连接两棵树时忽略这个距离。

数据类型:

验证配置之间运动的距离分辨率,指定为正标量。验证距离决定了树中两个相邻节点之间插值的节点数。对象通过检查与机器人和环境的碰撞来验证每个插值节点。

数据类型:

生成的最大随机配置数,指定为正整数。

数据类型:

在规划器的连接阶段直接连接树,指定为逻辑1真正的)或0).将此属性设置为真正的属性使对象忽略MaxConnectionDistance属性时尝试将两个树连接在一起。

数据类型:逻辑

从工作空间目标区域采样目标状态的概率,指定为范围[0,1)中的正值。偏差定义了向树中添加其他目标状态的概率workspaceGoalRegion对象。当此值设置为0时,将workspaceGoalRegion对象仍然对计划器要计划的单个目标进行采样。

增加这个值会增加在目标区域中达到目标状态的可能性,但是可能会导致更长的计划时间,因为每个新的目标状态都会增加计划的复杂性。

依赖

你必须使用goalRegion调用计划对象的功能。

数据类型:

在计划期间忽略自冲突,指定为逻辑。如果此属性设置为真正的,计划函数跳过了物体之间的碰撞检查,只将物体与环境进行比较。通过不检查自冲突,您可以提高计划阶段的速度。

数据类型:逻辑

跳过用于检查自碰撞的体对,指定为任意一种“父”“附近”

  • “父”-跳过子体和父体之间的碰撞检查。

  • “附近”—跳过相邻指标上的体间碰撞检查。

看到改变自我碰撞检查行为获取更多信息。

数据类型:字符|字符串

对象的功能

计划 使用RRT为操作器规划路径
插入 从RRT沿着路径插值状态
缩短 修剪边缘以缩短RRT的路径

例子

全部折叠

使用manipulatorRRT对象在有障碍物的环境中为刚体树机器人模型规划路径。用插值状态可视化规划路径。

将机器人模型加载到工作区中。使用库卡LBR iiwa©机械手臂。

机器人=装载机器人(“kukaIiwa14”“DataFormat”“行”);

为机器人生成环境。创建碰撞对象并指定它们相对于机器人基座的姿势。想象环境。

env = {collisionBox(0.5, 0.5, 0.05) collisionSphere(0.3)};env{1}。姿态(3,end) = -0.05;env{2}。Pose(1:3, end) = [0.1 0.2 0.8];显示(机器人);持有显示(env {1}) (env {2})

图中包含一个轴对象。具有xlabel X, ylabel Y的axes对象包含31个类型为patch, line的对象。这些对象代表world、iiwa_link_0、iiwa_link_1、iiwa_link_2、iiwa_link_3、iiwa_link_4、iiwa_link_5、iiwa_link_6、iiwa_link_7、iiwa_link_ee、iiwa_link_ee_kuka、iiwa_link_0_mesh、iiwa_link_1_mesh、iiwa_link_2_mesh、iiwa_link_3_mesh、iiwa_link_4_mesh、iiwa_link_5_mesh、iiwa_link_6_mesh、iiwa_link_7_mesh。

为机器人模型创建RRT计划器。

rrt =机械手rrt(机器人,env);rrt。SkippedSelfCollisions =“父”

指定开始和目标配置。

startConfig = [0.08 -0.65 0.05 0.02 0.04 0.49 0.04];goalConfig = [2.97 -1.05 0.05 0.02 0.04 0.49 0.04];

规划路径。由于RRT算法的随机性,请设置rng种子的可重复性。

rng(0) path = plan(rrt,startConfig,goalConfig);

想象路径。要添加更多的中间状态,请对路径进行插值。默认情况下,插入对象函数使用的值ValidationDistance属性确定中间状态的数目。的循环显示插值路径的每20个元素。

interpPath =插值(rrt,路径);clfi = 1:20:size(interpPath,1) show(robot,interpPath(i,:));持有结束Show (env{1}) Show (env{2}) hold

图中包含一个轴对象。带有xlabel X, ylabel Y的axes对象包含437个类型为patch, line的对象。这些对象代表world、iiwa_link_0、iiwa_link_1、iiwa_link_2、iiwa_link_3、iiwa_link_4、iiwa_link_5、iiwa_link_6、iiwa_link_7、iiwa_link_ee、iiwa_link_ee_kuka、iiwa_link_0_mesh、iiwa_link_1_mesh、iiwa_link_2_mesh、iiwa_link_3_mesh、iiwa_link_4_mesh、iiwa_link_5_mesh、iiwa_link_6_mesh、iiwa_link_7_mesh。

在您的工作空间中指定一个目标区域,并在这些范围内规划一条路径。的workspaceGoalRegion对象上的边界xyz-安置和zyx股票机器人末端执行器的欧拉方向。的manipulatorRRT对象根据目标区域规划路径,并对边界内的随机姿势进行采样。

加载现有的机器人模型作为rigidBodyTree对象。

机器人=装载机器人(“kinovaGen3”“DataFormat”“行”);Ax = show(机器人);

图中包含一个轴对象。带有xlabel X, ylabel Y的axes对象包含25个类型为patch, line的对象。这些对象代表base_link, Shoulder_Link, HalfArm1_Link, HalfArm2_Link, ForeArm_Link, Wrist1_Link, Wrist2_Link, Bracelet_Link, EndEffector_Link, Shoulder_Link_mesh, HalfArm1_Link_mesh, HalfArm2_Link_mesh, ForeArm_Link_mesh,腕表1_link_mesh,腕表2_link_mesh, Bracelet_Link_mesh, base_link_mesh。

创建路径规划器

为机器人创建一个快速探索随机树(RRT)路径规划器。这个例子使用了一个空的环境,但是这个工作流在混乱的环境中也能很好地工作。方法向环境中添加碰撞对象collisionBoxcollisionMesh对象。

planner =机械手rrt(机器人,{});计划。SkippedSelfCollisions =“父”

定义目标区域

使用机器人的末端执行器主体名称创建工作空间目标区域。

为您的工作区定义目标区域参数。目标区域包括一个参考姿态,xyz的位置限制和方向限制zyx股票欧拉角。属性上的边界xy平面,并允许旋转z-轴以弧度表示。

goalRegion = workspaceGoalRegion(robot.BodyNames{end});goalRegion。ReferencePose = trvec2tform([0.5 0.5 0.2]);goalRegion。Bounds(1,:) = [-0.2 0.2];% X边界goalRegion。Bounds(2,:) = [-0.2 0.2];% Y边界goalRegion。Bounds(4,:) = [-pi/2 pi/2];%绕z轴旋转

你也可以对区域内采样的所有姿势应用固定偏移量。这个偏移量可以解释抓取工具或工作区中尺寸的变化。对于这个例子,应用一个固定的变换,将末端执行器放置在工作区上方5厘米。

goalRegion。endffectoroffsetpose = trvec2tform([0 0 0.05]);持有显示(goalRegion);

图中包含一个轴对象。带有xlabel X, ylabel Y的axes对象包含35个类型为line, patch的对象。这些对象代表base_link, Shoulder_Link, HalfArm1_Link, HalfArm2_Link, ForeArm_Link, Wrist1_Link, Wrist2_Link, Bracelet_Link, EndEffector_Link, Shoulder_Link_mesh, HalfArm1_Link_mesh, HalfArm2_Link_mesh, ForeArm_Link_mesh,腕表1_link_mesh,腕表2_link_mesh, Bracelet_Link_mesh, base_link_mesh。

计划通往目标区域的路径

从机器人的主配置规划到目标区域的路径。由于RRT算法的随机性,本例设置rng播种以确保可重复的结果。

rng(0) path = plan(planner,homeConfiguration(robot),goalRegion);

显示机器人执行路径。为了可视化更真实的路径,可以在路径配置之间插入点。

interpConfigurations =插值(规划器,路径,5);i = 1: size(interpConfigurations) show(robot,interpConfigurations(i,:),“PreservePlot”、假);集(ax,“ZLim”(-0.05 - 0.75),“YLim”(-0.05 - 1),“XLim”(-0.05 - 1),...“CameraViewAngle”5) drawnow结束持有

图中包含一个轴对象。带有xlabel X, ylabel Y的axes对象包含35个类型为line, patch的对象。这些对象代表base_link, Shoulder_Link, HalfArm1_Link, HalfArm2_Link, ForeArm_Link, Wrist1_Link, Wrist2_Link, Bracelet_Link, EndEffector_Link, Shoulder_Link_mesh, HalfArm1_Link_mesh, HalfArm2_Link_mesh, ForeArm_Link_mesh,腕表1_link_mesh,腕表2_link_mesh, Bracelet_Link_mesh, base_link_mesh。

调整末端执行器姿态

注意,机械臂从底部接近工作空间。若要翻转最终位置的方向,请添加π旋转到y轴作为参考姿态。

goalRegion。EndEffectorOffsetPose =...goalRegion。endffectoroffsetpose *eul2tform([0 pi 0],“ZYX股票”);

重新规划路径,并再次可视化机器人运动。机器人现在从顶部靠近。

持有显示(goalRegion);path = plan(planner,homeConfiguration(robot),goalRegion);interpConfigurations =插值(规划器,路径,5);i = 1: size(interpConfigurations) show(robot, interpConfigurations(i,:),“PreservePlot”、假);集(ax,“ZLim”(-0.05 - 0.75),“YLim”(-0.05 - 1),“XLim”,[-0.05 1])结束持有

图中包含一个轴对象。带有xlabel X, ylabel Y的axes对象包含45个类型为line, patch的对象。这些对象代表base_link, Shoulder_Link, HalfArm1_Link, HalfArm2_Link, ForeArm_Link, Wrist1_Link, Wrist2_Link, Bracelet_Link, EndEffector_Link, Shoulder_Link_mesh, HalfArm1_Link_mesh, HalfArm2_Link_mesh, ForeArm_Link_mesh,腕表1_link_mesh,腕表2_link_mesh, Bracelet_Link_mesh, base_link_mesh。

装载Kinova Gen 3机器人。

装载机器人(“kinovagen3”DataFormat =“行”);

创建一个三维占用地图,并设置坐标为[0.4 0.0 0.4]占领。

map = occuancymap3d (10);map.setOccupancy([0.4 0.0 0.4],1);

在地图中显示机器人。

显示(地图);持有显示(rbt);轴(“平等”) xlim([-1,1.0]) ylim([-1,1.0]) zlim([-0.5,1.2])

定义启动配置。

Startconfig = [2.2131,-1.3950,0.1618,0.2053,-0.1624,1.1684,-2.1886];

定义一个目标配置,该配置除了第一个关节外与起始配置相同。

Goalconfig = startconfig;Goalconfig (1) = 3.4;

方法为机器人创建机械手RRT规划器,并将映射指定为环境地图论点。

planner = manipulatorRRT(rbt,{},Map= Map);planner.ValidationDistance = 0.1;planner.MaxConnectionDistance = 0.2;计划。SkippedSelfCollisions =“父”

在开始和目标配置之间规划一条路径。然后在路径之间进行插值。

Plannedpath = plan(planner,startconfig,goalconfig);Interpoalatedpath = interpolate(planner,plannedpath);

动画机器人沿着路径。

rc = rateControl (10);视图((π/ 3π/ 2π/ 4]);i = 1:size(interpoalatedpath,1) show(rbt,interpoalatedpath(i,:),FastUpdate=true,PreservePlot=false);等待(rc);结束

图中包含一个轴对象。标题为Occupancy Map的坐标轴对象,xlabel X [meters], ylabel Y [meters]包含了26个类型为patch, line的对象。

提示

规划的复杂性

  • 当规划树中节点之间的运动时,会生成一组配置并进行验证。规划器的计算时间与生成的配置数成正比。节点之间的配置数由MaxConnectionDistanceValidationDistance属性。为了缩短规划时间,可以考虑增加验证距离或减小最大连接距离。

  • 验证每个配置的复杂度为O(mn + m2),碰撞体的数量是多少rigidBodyTree对象和n碰撞对象的数量在吗worldObjects.使用大量的网格来表示机器人或环境会增加验证每个配置的时间。

无限关节极限

  • 如果你的rigidBodyTree机器人模型具有无限范围的关节极限(例如,极限为的转动关节)(负无穷到正无穷)),manipulatorRRT对象使用的限制(1) e10 1 e10)在节理范围内进行均匀随机抽样。

参考文献

[1]库夫纳,J. J.和S. M.拉瓦尔。RRT-Connect:单查询路径规划的有效方法在2000年ICRA。年会议。IEEE机器人与自动化国际会议。专题讨论会论文集(Cat。No.00CH37065), 2:995 - 1001。旧金山,加州,美国:IEEE, 2000。https://doi: 10.1109 / ROBOT.2000.844730。

扩展功能

C/ c++代码生成
使用MATLAB®Coder™生成C和c++代码。

版本历史

R2020b中介绍

全部展开

Baidu
map