这个例子展示了如何使用interactiveRigidBodyTree
物体移动机器人,设计轨迹,并重放。
加载“abbYumi”
机器人模型。使用初始化交互图形interactiveRigidBodyTree
.保存当前坐标轴。
机器人= loadrobot (“abbYumi”,“重力”, [0 0 -9.81]);iviz = interactiveRigidBodyTree(机器人);甘氨胆酸ax =;
创建一个环境,由一个代表地板的碰撞框、两个放置物体的架子和一个中间的桌子组成。
飞机= collisionBox (1.5, 1.5, 0.05);飞机。姿势= trvec2tform([0.25 0 -0.025]);表演(飞机,“父”、ax);leftShelf = collisionBox (0.25, 0.1, 0.2);leftShelf。姿势= trvec2form([0.3 -。65年0.1]);[~, patchObj] = show(leftShelf,“父”、ax);patchObj。[0 0 1];rightShelf = collisionBox (0.25, 0.1, 0.2);rightShelf。[0.3 .65 0.1] = trvec2form ([0.3 .65 0.1]);[~, patchObj] = show(rightShelf,“父”、ax);patchObj。[0 0 1];leftWidget = collisionCylinder(0.01, 0.07);leftWidget。= trvec2tform([0.3 -0.65 0.225]);[~, patchObj] = show(leftWidget,“父”、ax);patchObj。FaceColor = [1 0 0];右twidget = collisionBox(0.03, 0.02, 0.07);rightWidget。姿势= trvec2tform([0.3 0.65 0.225]);[~, patchObj] = show(right twidget,“父”、ax);patchObj。FaceColor = [1 0 0];centerTable = collisionBox (0.5, 0.3, 0.05);centerTable。姿势= trvec2tform([0.75 0 0.025]);[~, patchObj] = show(centerTable,“父”、ax);patchObj。[0 1 0];
使用交互式可视化来移动机器人并设置配置。当图形初始化后,机器人处于其家庭配置中,双臂交叉。放大并点击末端执行器以获得更多信息。
要选择物体作为末端执行器,右键单击物体以选择它。
标记体也可以从命令行分配:
iviz。MarkerBodyName =“gripper_r_base”;
设置主体之后,使用提供的标记元素移动标记,选择的主体随之移动。拖动中央灰色标记将在笛卡尔空间中移动标记。红色、绿色和蓝色的轴将标记沿着xyz相互重合。圆圈围绕相同颜色的轴旋转标记。
您还可以通过右键单击关节并单击来移动单个关节切换标记控制方法。
的MarkerControlMethod
属性设置为“JointControl”
.
这些步骤也可以通过直接更改对象的属性来完成。
iviz。MarkerBodyName =“yumi_link_2_r”;iviz。MarkerControlMethod =“JointControl”;
切换到关节控件会产生一个黄色标记,允许直接设置关节位置。
迭代地移动机器人,直到你有一个想要的配置。保存配置使用addConfiguration
.每次调用将当前配置添加到StoredConfigurations
财产。
addConfiguration (iviz)
在本例中,提供一组配置.mat
文件。
加载配置,并将它们指定为存储的配置集。第一个配置是通过更新配置
财产和调用addConfiguration
,您可以交互地完成,但其余的只需通过分配StoredConfigurations
直接的财产。
负载abbYumiSaveTrajectoryWaypts.matremoveConfigurations (iviz)清除已存储的配置%在有效的启动配置中启动iviz。配置= startingConfig;
addConfiguration (iviz)%指定整个路径点集合iviz。StoredConfigurations = [startingConfig,...graspApproachConfig,...graspPoseConfig,...graspDepartConfig,...placeApproachConfig,...placeConfig,...placeDepartConfig,...startingConfig];
一旦所有的路径点都被存储,构建一个机器人遵循的轨迹。对于本例,使用以下方法生成梯形速度剖面trapveltraj
.梯形速度曲线意味着机器人在每个路径点上都能平稳地停下来,但在运动过程中会达到设定的最大速度。
numSamples = 100 * (iviz大小。StoredConfigurations,2) + 1; [q,~,~, tvec] = trapveltraj(iviz.StoredConfigurations,numSamples,“EndTime”2);
通过迭代生成的轨迹来重放生成的轨迹问
矩阵,表示在每个路径点之间移动的一系列关节配置。在这种情况下,使用速率控制对象来确保回放速度反映实际执行速度。
iviz。ShowMarker = false;showFigure(iviz) rateCtrlObj = rateControl(numSamples/(max(tvec) + tvec(2)));为i = 1:numSamples配置= q(:,i); waitfor(rateCtrlObj);结束
图中显示机器人在所有定义的路径点之间执行平滑的轨迹。