主要内容

逆运动学轨迹控制建模

这个Simulink示例演示了如何逆运动学块可以沿指定的轨迹驱动机械手。所期望的轨迹被指定为机械手末端执行器一系列紧密间隔的姿态。轨迹生成和路径点定义代表了许多机器人应用,如拾取和放置操作,从空间加速度和速度剖面计算轨迹,甚至使用相机和计算机视觉模拟关键帧的外部观察。一旦轨迹生成,逆运动学块用于将其转换为关节空间轨迹,然后可用于模拟机械手和控制器的动力学。

模型概述

加载模型以查看它是如何构造的。

open_system (“IKTrajectoryControlExample.slx”);

该模型由四个主要操作组成:

  • 目标构成一代

  • 逆运动学

  • 机械手动力学

  • 姿态测量

目标构成一代

这个状态流图选择哪个路径点是操纵器的当前目标。一旦操作器到达当前目标的公差范围内,图表将调整目标到下一个航路点。方法将路径点的组件转换和组装为齐次转换eul2tform函数。一旦没有更多的路径点可以选择,图表将终止模拟。

逆运动学

逆运动学计算一组关节角,以产生末端执行器所需的姿态。使用逆运动学与一个rigidBodyTree将末端效应的目标位姿建模并指定为齐次变换。为解的位置和方向上的相对公差约束指定一系列权值,并给出关节位置的初始估计。该块输出一个关节位置向量,该关节位置从rigidBodyTree在块参数中指定的模型。为了保证解的平滑连续性,使用前面的配置解作为求解器的起始位置。这也减少了计算的冗余,如果目标姿势没有更新自最后一个仿真时间步。

机械手动力学

机械手动力学由两个部分组成,一个是产生力矩信号的控制器,一个是在给定力矩信号的情况下对机械手动力学建模的动力学模型。示例中的控制器使用通过机械手的逆动力学计算的前馈组件和反馈PD控制器来纠正错误。机械手的型号采用前进动力rigidBodyTree对象。对于更复杂的动力学和可视化技术,可以考虑使用来自控制系统工具箱™块集和Simscape多体™的工具来取代Forward dynamics块。

姿态测量

位姿测量从机械臂模型中获取关节角度读数,并将其转换为齐次变换矩阵,作为系统的反馈路径选择部分。

汇率操纵国的定义

本例中使用的机械手是Rethink Sawyer™机器人机械手。的rigidBodyTree对象从URDF(统一机器人描述格式)文件中导入importrobot

将机械手作为rigidBodyTree对象导入索耶= importrobot (“sawyer.urdf”);索耶。DataFormat =“列”定义末端执行器主体名称eeName =“right_hand”定义机械手中关节的数量numJoints = 8;形象化操纵者显示(索耶);Xlim ([- 1.50 1.50]) 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,“边界”“紧”)标题(“带有边界检测的处理图像”

图中包含2个轴对象。标题为Original Image的axis对象1包含一个Image类型的对象。标题为processing Image with Boundary Detection的Axes对象2包含一个类型为Image的对象。

图像处理后,提取硬币的边缘作为像素位置。数据从mat文件中加载,boundaryData边界单元格数组,其中每个单元格包含描述单个检测边界像素坐标的数组。关于如何生成该数据的更全面的视图可以在示例“图像中的边界跟踪”中找到(需要图像处理工具箱)。

负载boundaryData.mat边界边界
名称大小字节类属性边界10x1 25376单元格

为了将该数据映射到世界框架,我们需要定义图像的位置以及像素坐标和空间坐标之间的缩放。

%图像原点坐标imageOrigin = (0.4, 0.2, 0.08);%比例因子将像素转换为物理距离规模= 0.0015;

还必须定义每个点上所需的末端执行器方向的欧拉角。

eeOrientation = [0, pi, 0];

在本例中,选择的方向使末端执行器始终垂直于图像的平面。

一旦定义了这些信息,每组所需的坐标和欧拉角就可以编译成一个路径点。每个路径点都表示为一个六元素向量,其前三个元素对应于所需的向量xyz -机械手在世界框架中的位置。后三个元素对应所需方向的ZYX欧拉角。

路标 X Y Z ϕ z ϕ y ϕ x

这些路径点被连接起来形成一个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(bounds,1))选择边界并映射到物理大小段={我}*规模边界;在边界之间填写进近航路点和上升航路点的数据段=[段(1:);段(:,);段(,)):;在边界之间移动的% z偏移量段(1、3)= .02点;段(结尾,3)= .02点;%翻译到图像的原点cartesianCoord = imageOrigin + segment;重复所需的方向以匹配被添加的路径点的数量eulerAngles = repmat (eeOrientation、大小(段,1),1);将数据追加到以前的路径点的末尾路点=[锚点;cartesianCoord eulerAngles);结束

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

模型设置

在运行模型之前,必须初始化几个参数。

初始化大小q0, t=0时的机器人关节构型。这将%后被第一个路径点替换。q0 = 0 (numJoints, 1);为模拟定义采样率。Ts = . 01;定义一个[1x6]矢量的相对权重的方向和逆运动学求解器的%位置误差。重量= 1 (1,6);将第一个路径点转换为齐次变换矩阵进行初始化initTargetPose = eul2tform(锚点(6));initTargetPose(1:3) =路标点(1:3)';解出q0,使操纵器从第一个路径点开始本土知识= inverseKinematics (“RigidBodyTree”索耶);本土知识[q0 solInfo] = (eeName initTargetPose,权重q0);

模拟机械手运动

要模拟该模型,请使用sim卡命令。模型生成输出数据集,jointData并在两个图中显示了进展:

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

  • 路径跟踪plot在3D中可视化了进程。绿点表示目标位置。红点表示末端执行器使用反馈控制实现的实际末端执行器位置。

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

{

可视化的结果

模型输出两个数据集,模拟后可用于可视化。关节配置如下所示jointData.机器人末端执行器姿态输出为poseData

移除不必要的网格以更快的可视化。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)%显示机械手模型显示(索耶,jointData (j:) ',“帧”“关闭”“PreservePlot”、假);从齐次变换输出中获取末端执行器位置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结束

{

Baidu
map