轨迹控制建模反向运动学

这个例子演示了反向运动学块可以驱动机械手沿着指定的轨迹。期望轨迹被指定为一系列用于机械手的端部执行器紧密间隔的姿势。轨迹生成和航点定义表示许多机器人应用像拾取和放置操作,从空间的加速度和速度分布计算的轨迹,或甚至使用模拟照相机和计算机视觉的关键帧的外部观测。一旦生成的轨迹,所述反向运动学块用于此转换为一个关节空间轨迹,然后可将其用于模拟机械手和控制器的动态。

模型概述

加载模型,看看它是如何构建的。

open_system('IKTrajectoryControlExample.slx');

该模型是由四个主要业务:

  • 目标姿势代

  • 反向运动学

  • 机器人动力学

  • 姿态测量

目标姿势代

这个状态图选择哪个航路点是机械手当前的目标。一旦机械手到达当前目标的允许范围内,图表就会将目标调整到下一个航路点。此图表还将waypoint的组件转换和组装为一个齐次转换eul2tform功能。一旦没有更多的航点选择,图表终止模拟。

反向运动学

逆运动学计算了一组关节角度以产生末端执行器所需的位姿。使用反向运动学rigidBodyTree模型,并指定结束效果均匀转化的靶姿态。指定一系列权重对所述溶液的位置和方位的相对公差约束的,并且得到的关节位置的初始估计。该块输出从产生所需姿态关节位置的向量rigidBodyTree模型中指定的块参数。为了保证解的平滑连续性,我们使用前面的组态解作为求解器的起始位置。万博 尤文图斯这也减少了冗余计算,如果目标位姿没有更新,自最后一个模拟时间步。

机器人动力学

操纵器动力学由两个部分组成,一个控制器产生的转矩信号和一个动力学模型来给定的这些扭矩信号操纵器的动力学模型。在该示例中,控制器使用通过机械手和一个反馈PD控制器以校正误差的逆动力学计算出的前馈分量。机械手的模型使用前进动力和a一起工作的块rigidBodyTree宾语。对于更复杂的动力学和可视化技术,考虑利用从控制系统工具箱™模块集和多体的Simscape™工具更换正动力学块。

姿态测量

姿态测量花费从操纵模型并将它们转换的关节角度读数成均匀的变换矩阵被用作在反馈航点选择部分。

机械手定义

用于该实施例的操纵器是反思锯工™机器人操纵器。该rigidBodyTree描述机械手对象从URDF(统一机器人描述格式)文件采用进口importrobot

%进口机械手作为rigidBodyTree对象锯工= importrobot('sawyer.urdf');索耶。DataFormat ='柱';%定义末端执行器主体名称eeName ='右手';%定义在机械手关节的数量numJoints = 8;%可视化机械手显示有关(Sawyer);XLIM([ -  1.00 1.00])ylim([ -  1.00 1.00]);zlim([ -  1.02 0.98]);视图([128.88 10.45]);

航点代

在这个例子中,机械手的目标是能够描绘出图像中检测到的硬币的边界,coins.png。首先,图像处理找到了硬币的边界。

I = imread('coins.png');bwBoundaries = imread('coinBoundaries.png');图次要情节(1、2、1)imshow(我“边界”'紧')标题(“原始图像”)副区(1,2,2)imshow(bwBoundaries,“边界”'紧')标题(“与边界检测处理的图像”

经过图像处理后,提取硬币的边缘作为像素位置。数据从mat文件中加载,boundaryData边界是其中每个单元包含描述为一个单一的检测到的边界的像素坐标阵列的单元阵列。如何产生该数据的更全面的观点可以在示例中找到,“边界追踪在图像”(需要图像处理工具箱)。

加载boundaryData.mat边界谁是边界
类属性边界10x1 25376单元

此数据映射到世界坐标系,我们需要定义在图像位于与像素坐标和空间坐标之间的比例系数。

图像原点坐标imageOrigin = (0.4, 0.2, 0.08);从像素的物理距离%比例系数转换标度= 0.0015;

欧拉角为所需的末端执行器的方向在每个点也必须被定义。

eeOrientation = [0,PI,0];

在此实例中的取向被选择为使得端部执行器总是垂直于所述图像的平面中。

一旦这个信息被定义每一组所希望的坐标和欧拉角的可编译成一个航点。每个路点被表示为,其前三个元素对应于所需的六元向量XYZ-在世界坐标系机械手的位置。最后三个元件对应的期望的取向的向ZYX欧拉角。

路标 = [ X ÿ ž ϕ ž ϕ ÿ ϕ X ]

航点连接起来以形成一个ñ-by-6阵列,其中ñ在轨道姿态的总数。阵列中的每一行对应于在轨迹的路点。

%清除以前的航点,并开始建立航点阵列清晰的航点%开始略高于图像原点waypt0 = [imageOrigin + [0 0 0.2],eeOrientation];%触摸图像的原点waypt1 = [imageOrigin,eeOrientation];%插值的顺畅动作的图像的原点的每个元素对于I = 1:6的interp = linspace(waypt0(i)中,waypt1(I),100);路点(:,1)= interp的';结束

总共有10枚硬币。对于simiplicity和速度,硬币的一个较小的子集可以通过限制传递给路点的总数进行跟踪。下面,numTraces = 3枚硬币被跟踪在图像中。

%定义硬币跟踪的数numTraces = 3;组装边界跟踪的路径点对于I = 1:分钟(numTraces,大小(边界,1))%选择边界并映射到物理尺寸段=边界{I} *规模;进场航路点和边界之间升降的航点%填充数据段=[段(1:);段(:,);段(,)):;在边界之间移动的z偏移量%段(1,3)= 0.02;段(结束,3)= 0.02;%转换为图像的原点cartesianCoord = imageOrigin +线段;%重复期望的方向以匹配被添加沿途停车点的数量为:eulerAngles = repmat(eeOrientation,尺寸(段,1),1);%追加数据以前的航点的端航点= [航点;cartesianCoord,为:eulerAngles];结束

该数组是主要的输入到模型中。

模型设置

该模型可以运行之前几个参数必须被初始化。

Q0的%初始化大小,在t = 0的机器人关节构造。这会%以后由第一航点来代替。Q0 =零(numJoints,1);%定义为模拟的采样率。TS = 0.01;%定义的相对权重的[1X6]载体上的方位和为逆运动学解算器%的位置误差。权重=酮(1,6);%转换第一航点均匀变换矩阵进行初始化initTargetPose = eul2tform(航点(1,4:6));initTargetPose(1:3,结束)=路点(1,1:3)';%求解Q0,使得操纵器始于第一航点IK =逆运动学('RigidBodyTree'索耶);本土知识[q0 solInfo] = (eeName initTargetPose,权重q0);

模拟机械手运动

为了模拟模型,使用SIM卡命令。模型生成输出数据集,jointData并显示在两个地块的进展:

  • X Y情节显示机械手跟踪运动的自顶向下视图。当机械手从一个硬币轮廓过渡到下一个轮廓时,圆之间的线就出现了。

  • 路径跟踪情节可视化三维的进展。绿点表示目标位置。红点指示通过使用反馈控制端部执行器实现的实际端部执行器的位置。

%关闭当前打开的数字所有%开和模拟模型open_system('IKTrajectoryControlExample.slx');sim卡('IKTrajectoryControlExample.slx');

可视化的结果

该模型输出,可以模拟后可用于可视化两个数据集。联合的配置被提供为jointData。机器人末端执行器姿态输出为poseData

更快的可视化%去除不必要的网眼clearMeshes有关(Sawyer);用于映射图像%数据[M,N] =尺寸(I);[X,Y] = meshgrid(0:M,0:N);X = imageOrigin(1)+ X *规模;Y = imageOrigin(2)+ Y *规模;Z =零(大小(X));Z = Z + imageOrigin(3);%关闭所有打开的人物所有%初始化一个新的图形窗口数字;集(GCF,'可见''上');%画出初始机器人位置显示有关(Sawyer,jointData(1,:)');保持%初始化端部执行标绘位置P = plot3(0,0,0,'');经纱(X,Y,Z,I');%变化视角和轴视图(65,45)轴线([ -  25 1 -.25 0.75 0 0.75])%通过迭代的输出以10个采样间隔进行可视化的结果对于J = 1:10:长度(jointData)%显示机械手模型显示(索耶,jointData (j:) ',“框架”“关”“PreservePlot”,假);从homoegenous变换输出%获取末端执行器的位置pos = poseData (1:3 4 j);%,持续更新的情节末端执行器位置p。XData = [p.XData pos(1)]; p.YData = [p.YData pos(2)]; p.ZData = [p.ZData pos(3)];%更新图的DrawNow结束