主要内容

从机器人库中生成机器人逆运动学计算代码

此示例演示如何使用robot库中的机器人执行代码生成以计算反向运动学(IK)逆线性包含rigidBodyTree机器人模型的应用装载机器人解决实现所需末端执行器位置的机器人配置问题。

在二维平面上创建一个圆形轨迹,并将其作为点赋给生成的MEX逆运动学求解器。求解器计算所需的关节位置,以实现这一轨迹。最后,通过动画显示实现圆形轨迹的机器人构型。

编写求解逆运动学的算法

创建一个函数,ikCodegen,它运行KINOVA®Gen3机器人模型的逆运动学算法装载机器人

函数qConfig=ikCodegen(endEffectorName、tform、weights、initialGuess)%#编码基因机器人=装载机器人(“基诺瓦根3”,“数据格式”,“行”);本土知识= inverseKinematics (“刚体树”机器人);[qConfig,~]=ik(endEffectorName,tform,weights,initialGuess);终止

该算法充当标准逆运动学调用的包装器。它接受标准输入,并返回一个机器人配置解决方案向量。因为您不能使用句柄对象作为代码生成支持的函数的输入或输出。金宝app将机器人装载到函数中。保存ikCodegen在当前文件夹中运行。

在MATLAB中验证逆运动学算法

在生成代码之前,在MATLAB中验证IK算法。

加载预先定义的KINOVA®Gen3机器人模型作为r栅格方格树对象。将数据格式设置为“行”

机器人=装载机器人(“基诺瓦根3”,“数据格式”,“行”);

显示机器人的详细信息。

showdetails(机器人)
-------------------- 机器人:(8 Body) Idx Body Name Joint Name Joint Type Parent Name(Idx) Children Name(s) ------------ ---------- ---------- ---------------- ---------------- 1 Shoulder_Link Actuator1 revolute base_link(0) HalfArm1_Link(2) 2 HalfArm1_Link Actuator2 revolute Shoulder_Link(1) HalfArm2_Link(3) 3 HalfArm2_Link Actuator3 revolute HalfArm1_Link(2)腕链执行器腕链执行器腕链执行器腕链执行器腕链执行器腕链执行器腕链执行器腕链执行器腕链执行器腕链执行器腕链执行器腕链执行器腕链执行器腕链执行器腕链执行器腕链执行器腕链执行器腕链执行器腕链执行器腕链执行器腕链执行器--------------------

指定末端执行器名称、末端执行器转换的权重和初始关节位置。

endEffectorName =“EndEffector_Link”;权重= [0.25 0.25 0.25 1 1 1];initialGuess = [0 0 0 0 0];

为指定的末端执行器变换调用逆运动学求解函数。

targetPose=trvec2tform([0.35-0.35]);qConfig=ikCodegen(endEffectorName,targetPose,weights,initialGuess)
qConfig=1×71.3085 2.2000 -1.3011 1.0072 -1.1144 2.0500 -3.2313

可视化机器人与计算机器人配置解决方案。

图;显示(机器人,qConfig);持有所有plotTransforms(tform2trvec(目标姿态)、tform2quat(目标姿态),“帧大小”, 0.5);

图中包含一个轴对象。轴对象包含29个面片、线条类型的对象。这些对象表示基本链接、肩部链接、半臂1链接、半臂2链接、前臂链接、腕表1链接、腕表2链接、手镯链接、EndEffector链接、肩部链接、半臂1链接、半臂2链接、前臂链接、腕表1链接、腕表2链接、腕表2链接k_网,手镯_链_网,底座_链_网。

逆运动学算法的生成代码

您可以使用编码基因(MATLAB编码器)函数或MATLAB编码器(MATLAB编码器)应用程序生成代码。对于本例,通过调用编码基因在MATLAB命令行中。使用-args输入参数。

打电话给编码基因函数并指定单元格数组中的输入参数。这个函数创建了一个单独的ikCodegen_mex函数使用。您还可以使用选项输入参数生成C代码。这一步可能需要一些时间。

编码基因ikCodegen-args{endEffectorName targetPose,重量,initialGuess}
代码生成成功。

使用生成的MEX函数验证结果

调用指定变换的IK解算器的MEX版本。

targetPose=trvec2tform([0.35-0.35 0]);qConfig=ikCodegen_-mex(endefectorname,targetPose,weights,initialGuess)
qConfig=1×71.3084 2.2000 -1.2999 1.0092 2.0277 -2.0500 -0.0872

使用使用MEX版本的IK解算器计算的机器人配置可视化机器人。

图;显示(机器人,qConfig);持有所有plotTransforms(tform2trvec(目标姿态)、tform2quat(目标姿态),“帧大小”, 0.5);

图中包含一个轴对象。轴对象包含29个面片、线条类型的对象。这些对象表示基本链接、肩部链接、半臂1链接、半臂2链接、前臂链接、腕表1链接、腕表2链接、手镯链接、EndEffector链接、肩部链接、半臂1链接、半臂2链接、前臂链接、腕表1链接、腕表2链接、腕表2链接k_网,手镯_链_网,底座_链_网。

利用MEX函数计算逆运动学

利用生成的MEX函数计算逆运动学解,实现轨迹。

定义轨迹

创造一个圆形轨迹。

t=(0:0.2:10)';%时间计数=长度(t);中心=[0.30.30];半径=0.15;θ=t*(2*pi/t(end));点=中心+半径*[cos(θ)sin(θ)零(大小(θ))];

逆运动学解

预分配配置解决方案作为一个矩阵金宝搏官方网站qs.指定末端执行器转换的权重和末端执行器名称。

q0=[0 0 0 0];ndof=长度(q0);qs=零(计数,ndof);权重=[0 0 0 1 1];endEffector=“EndEffector_Link”

绕着点的轨迹走一圈。使用ikCodegen_mex函数计算每个点的解决方案,以生成实现末端效应器位置的关节配置。存储配置以供以后使用。

qInitial=q0;%使用主配置作为初始猜测对于i=1:计数求满足要求的末端执行器的构型%的位置点=点(i,:);qSol=ikCodegen_-mex(效应器、trvec2tform(点)、权重、初始值);%存储配置qs(i,:)=qSol;%从之前的解决方案开始qInitial = qSol;终止

动画解决方案

生成所有解决方案后,为结果设置动画。必须重新创建机器金宝搏官方网站人,因为它最初是在函数中定义的。迭代所有解决方案。设置“快速更新”选择权显示方法真正的得到一个平滑的动画。

机器人=装载机器人(“基诺瓦根3”,“数据格式”,“行”);%显示第一个解决方案和设置视图。图示(机器人,qs(1,:);视图(3)ax=gca;ax.投影=“正字法”持有绘图(点(:,1),点(:,2),“k”)轴([-0.1 0.7 -0.3 0.5])迭代解决方案金宝搏官方网站framesPerSecond=15;r=rateControl(framesPerSecond);对于i=1:计数显示(机器人,qs(i,:),“PreservePlot”假的,“快速更新”,真正的);drawnow waitfor (r);终止

图中包含一个轴对象。axis对象包含26个类型为patch, line的对象。这个对象表示base_link。