这个Sim金宝appulink示例演示了如何逆运动学块可以沿着指定的轨迹驱动机械手。所要求的轨迹被指定为机械手末端执行器的一系列紧间隔位姿。轨迹生成和路径点定义代表了许多机器人应用程序,如拾取和放置操作,从空间加速度和速度剖面计算轨迹,甚至使用摄像机和计算机视觉模拟关键帧的外部观察。一旦轨迹形成逆运动学利用块将其转化为关节空间的轨迹,然后利用该轨迹来模拟机械手和控制器的动力学。
加载模型以查看它是如何构造的。
Open_System(“IKTrajectoryControlExample.slx”);
该模型由四个主要操作组成:
目标构成一代
逆运动学
机械手动力学
姿态测量
此状态溢图选择了哪个航点是操纵器的当前目标。一旦操纵器进入当前目标的公差内,该图表将目标调整到下一个航点。图表还通过以下方式转换和组装航路点的组分成为均匀的转变eul2tform
函数。一旦没有更多的路径点可供选择,图表将终止模拟。
逆运动学计算了一组关节角度以产生末端效应器的所需姿势。使用逆运动学与一个刚性小组细胞
模型并指定端点效应的目标位姿为齐次变换。为求解的位置和姿态的相对公差约束指定一系列权值,并给出关节位置的初步估计。块输出一个关节位置矢量,该关节位置产生所需的姿态刚性小组细胞
块参数中指定的模型。为确保解决方案的平稳连续性,先前的配置解决方案用作求解器的起始位置。金宝搏官方网站如果目标姿势由于自上次仿真时间步长以来未更新,则这也降低了计算的冗余。
机械手的动力学由两个部分组成,一个是产生转矩信号的控制器,另一个是给出这些转矩信号的动力学模型。该例子中的控制器使用了通过机械手逆动力学计算的前馈组件和反馈PD控制器来纠正误差。机械手的模型采用前瞻性动态与之合作的块刚性小组细胞
对象。对于更复杂的动力学和可视化技术,可以考虑使用Control Systems Toolbox™区块集和Simscape Multibody™中的工具来替代Forward dynamics区块。
姿态测量从机械臂模型获取关节角度读数,并将其转换为齐次变换矩阵作为反馈路径选择部分。
本例中使用的机械手是Rethink Sawyer™机器人机械手。的刚性小组细胞
从URDF(机器人统一描述格式)文件中导入的描述机械手的对象importrobot
.
%将机械手导入为rigidBodyTree对象索耶= importrobot ('sawyer.urdf');Sawyer.DataFormat =“列”;定义末端执行器体名eename =“right_hand”;定义机械手的关节数numjoints = 8;%可视化操纵器显示(索耶);ylim([- 1.50 1.50]);zlim ([-1.02 - 0.98]);视图([128.88 - 10.45]);
在该示例中,操纵器的目标是能够挖掘图像中检测到的硬币的边界,Coins.png.
.首先,处理图像以找到硬币的边界。
我= 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;
还必须定义每个点处所需末端效应器取向的欧拉角。
eorientation = [0, pi, 0];
在这个例子中,选择的方向使末端执行器总是垂直于图像的平面。
一旦这些信息被定义,每一组所需的坐标和欧拉角就可以被编译成一个航路点。每个路径点都表示为一个六元素向量,其前三个元素对应于所需的元素XYZ-机械手在世界框架中的位置。最后三个元素对应于所需方向的ZYX欧拉角。
路点被连接起来形成一个n6组,n是轨迹中的总位姿数。数组中的每一行都对应于轨迹中的一个路径点。
清除以前的路点并开始建立路点数组清除路点%从图像原点上方开始waypt0 = [imageOrigin + [0 0 .2],eeOrientation];%触摸图像的起源waypt1 = [imageOrigin, eeOrientation];%插值每个元素平滑的运动到图像的原点为I = 1:6 interp = linspace(waypt0(I),waypt1(I),100);锚点(:,i) =插值函数”;结束
总共有10枚硬币。为了简单和快速,可以通过限制传递到路径点的总数来追踪较小的硬币子集。下面,numTraces = 3个硬币在图像中被追踪。
%定义要追踪的硬币数量numTraces = 3;%组装边界跟踪的航点为i = 1:min(numtraces,size(边界,1))%选择一个边界并映射到物理大小段={我}*规模边界;边界之间进场航路点和升降机航路点的Pad数据段= [段(1,:);部分(:,:);细分(结束,:)];在边界之间移动的%z偏移量段(1、3)= .02点;段(结尾,3)= .02点;%翻译到图像的原点Cartesiancoord = imageorigin +段;%重复期望的方向以匹配添加的路径点的数量eulerangles = Repmat(Eeorientation,尺寸(段,1),1);%附加数据到以前的wayPoints的结束路点=[锚点;cartesianCoord eulerAngles);结束
这个数组是模型的主要输入。
必须在运行模型之前初始化几个参数。
%初始化q0尺寸,t=0时机器人关节构型。这将%将被第一个路标所取代。q0 = 0 (numJoints, 1);定义模拟的采样率。Ts = . 01;%定义一个[1x6]方向上的相对权重向量逆运动学求解器的位置误差。重量= 1 (1,6);%将第一个路径点转换为齐次变换矩阵进行初始化initTargetPose = eul2tform(锚点(6));initTargetPose(1:3) =路标点(1:3)';求q0,使机械手从第一个路径点开始ik = underedkinematics(“RigidBodyTree”,锯割);[Q0,Solinfo] = IK(eEname,inittargetpose,权重,q0);
要模拟该模型,使用sim卡
命令。该模型生成输出数据集,jointData
并展示了两个情节的进展:
的X Y情节显示了操纵器的追踪运动的自上视图。圆圈之间的线路由于操纵器从一个硬币轮廓转换到下一个硬币。
的航点跟踪绘图可视化3D的进度。绿点表示目标位置。红色点表示通过反馈控制通过末端执行器实现的实际末端效应位置。
关闭当前打开的数字关闭全部%打开并模拟模型Open_System(“IKTrajectoryControlExample.slx”);SIM(“IKTrajectoryControlExample.slx”);
该模型输出两个数据集,可用于仿真后的可视化。关节配置如下jointData
.机器人末端执行器姿势输出为postata.
.
%删除不必要的网格,以更快的可视化clearMeshes(索耶);%映射映像的数据[m, n] =大小(我);(X, Y) = meshgrid (0 0: m: n);X = imageOrigin(1) + X*scale;Y = imageOrigin(2) + Y*scale;Z = 0(大小(X));Z = Z + imageOrigin(3);关闭所有打开的数字关闭全部初始化一个新的数字窗口图;集(gcf,'可见的',“上”);绘制机器人初始位置显示(索耶,jointData (: 1) ');持有在初始化末端执行器绘图位置p = plot3 (0, 0, 0,“。”);经(X, Y, Z,我');%改变视角和轴视图(65,45)轴([-。1 - 25。25.75 0 0.75])%以10个样本的间隔迭代输出以可视化结果为j = 1:10:长度(jointData)%显示操纵器模型展示(Sawyer,Thepdata(J,:)',“帧”,“关闭”,'preserveplot'、假);从齐次变换输出得到末端执行器位置pos = postata(1:3,4,j);%更新绘图的末端执行器位置p.xdata = [p.xdata pos(1)];p.ydata = [p.ydata pos(2)];p.zdata = [p.zdata pos(3)];%更新图drawnow结束