主要内容

使用机器人的机器人逆运动学计算生成代码库

这个例子展示了如何执行代码生成来计算机器人的逆运动学(IK)使用机器人图书馆。对于这个示例,您可以使用一个inverseKinematics对象与一个包括rigidBodyTree机器人模型使用loadrobot求机器人末端执行器配置,实现所需的位置。

创建一个圆形轨迹在二维平面和给出点生成的墨西哥人的逆运动学解算器。求解器计算所需的关节位置来实现这一轨迹。最后,机器人动画展示的机器人配置实现圆形轨迹。

写算法来解决逆运动学

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

函数qConfig = ikCodegen (endEffectorName tform,重量、initialGuess)% # codegen机器人= loadrobot (“kinovaGen3”,“DataFormat”,“行”);本土知识= inverseKinematics (“RigidBodyTree”,机器人);本土知识[qConfig ~] = (endEffectorName tform,重量、initialGuess);结束

算法作为包装标准的逆运动学的电话。它接受标准的输入,并返回一个机器人配置解向量。既然你不能用一个处理对象的输入或输出的函数支持代码生成。万博1manbetx加载函数内的机器人。保存ikCodegen函数在当前文件夹。

在MATLAB验证逆向运动学算法

本土知识验证算法在MATLAB生成代码。

加载一个预定义KINOVA®Gen3 r机器人模型igidBodyTree对象。设置数据格式“行”

机器人= loadrobot (“kinovaGen3”,“DataFormat”,“行”);

显示机器人的细节。

showdetails(机器人)
- - - - - - - - - - - - - - - - - - - - - -机器人:身体(8)Idx身体名称联合名称联合类型父母名字(Idx)孩子的名字(s) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 Shoulder_Link Actuator1转动base_link (0) HalfArm1_Link (2) 2 HalfArm1_Link Actuator2转动Shoulder_Link (1) HalfArm2_Link (3) 3 HalfArm2_Link Actuator3转动HalfArm1_Link (2) ForeArm_Link (4) 4 ForeArm_Link Actuator4转动HalfArm2_Link (3) Wrist1_Link (5) 5 Wrist1_Link Actuator5转动ForeArm_Link (4) Wrist2_Link (6) 6 Wrist2_Link Actuator6转动Wrist1_Link (5) Bracelet_Link (7) 7 Bracelet_Link Actuator7转动Wrist2_Link (6) EndEffector_Link (8) 8 EndEffector_Link Endeffector固定Bracelet_Link (7) - - - - - - - - - - - - - - - - - - - - -

指定末端执行器的名称,末端执行器的重量转换和最初的共同立场。

endEffectorName =“EndEffector_Link”;重量= (0.25 0.25 0.25 1 1 1);initialGuess = [0 0 0 0 0 0 0);

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

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

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

图;显示(机器人,qConfig);持有所有plotTransforms (tform2trvec (targetPose) tform2quat (targetPose),“FrameSize”,0.5);

{“字符串”:“图包含一个坐标轴对象。坐标轴对象包含29块类型的对象,线。这些对象代表base_link, Shoulder_Link、HalfArm1_Link HalfArm2_Link, ForeArm_Link, Wrist1_Link, Wrist2_Link, Bracelet_Link, EndEffector_Link, Shoulder_Link_mesh, HalfArm1_Link_mesh, HalfArm2_Link_mesh, ForeArm_Link_mesh, Wrist1_Link_mesh, Wrist2_Link_mesh, Bracelet_Link_mesh base_link_mesh。“,”泰克斯”:[],“乳胶”:[]}

生成代码的逆运动学算法

您可以使用codegen(MATLAB编码器)函数或MATLAB编码器(MATLAB编码器)应用程序来生成代码。对于这个示例,生成一个墨西哥人文件通过调用codegen在MATLAB命令行。为每个输入指定样本输入参数函数使用arg游戏输入参数。

调用codegen功能和指定单元阵列的输入参数。这个函数创建一个单独的ikCodegen_mex函数使用。您还可以使用选项输入参数生成C代码。这一步要花些时间。

codegenikCodegenarg游戏{endEffectorName targetPose,重量,initialGuess}
代码生成成功。

使用生成的墨西哥人函数验证结果

调用的墨西哥人版本动力学解算器指定变换。

targetPose = trvec2tform (0.35 - -0.35 [0]);qConfig = ikCodegen_mex (endEffectorName targetPose,重量、initialGuess)
qConfig =1×71.3084 2.2000 -1.2999 1.0092 2.0277 -2.0500 -0.0872

机器人与机器人配置计算使用形象化的墨西哥人版本动力学解算器。

图;显示(机器人,qConfig);持有所有plotTransforms (tform2trvec (targetPose) tform2quat (targetPose),“FrameSize”,0.5);

{“字符串”:“图包含一个坐标轴对象。坐标轴对象包含29块类型的对象,线。这些对象代表base_link, Shoulder_Link、HalfArm1_Link HalfArm2_Link, ForeArm_Link, Wrist1_Link, Wrist2_Link, Bracelet_Link, EndEffector_Link, Shoulder_Link_mesh, HalfArm1_Link_mesh, HalfArm2_Link_mesh, ForeArm_Link_mesh, Wrist1_Link_mesh, Wrist2_Link_mesh, Bracelet_Link_mesh base_link_mesh。“,”泰克斯”:[],“乳胶”:[]}

计算逆运动学与墨西哥人的功能

使用生成的墨西哥人函数来实现轨迹计算逆运动学解。

定义轨迹

创建一个圆形轨迹。

t = (0:0.2:10)”;%的时间数=长度(t);中心= (0.3 - 0.3 0);半径= 0.15;θ= t *(2 *π/ t(结束));点=中心+半径* (cos(θ)sin(θ)0(大小(θ))];

逆运动学解

Preallocate配置解决方案作为一个矩阵万博 尤文图斯qs。为末端执行器指定权重转换和末端执行器的名字。

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

循环的轨迹点跟踪循环。使用ikCodegen_mex函数来计算每个点的解决方案生成联合配置,实现末端执行器的位置。配置存储起来,供以后使用。

qInitial = q0处;%使用国内配置作为初始猜测i = 1:计数%的解决配置满足所需的末端执行器%的位置点=点(我:);qSol = ikCodegen_mex (endEffector trvec2tform(点)、重量、qInitial);%存储配置qs(我:)= qSol;%从之前的解决方案qInitial = qSol;结束

动画解决方案

一旦生成所有的解决方案,有生命的结果。万博 尤文图斯你必须重新创建机器人,因为它最初是在函数中定义的。遍历所有的解决方案。万博 尤文图斯设置“FastUpdate”选择的显示方法真正的得到一个平滑的动画。

机器人= loadrobot (“kinovaGen3”,“DataFormat”,“行”);%显示第一个解决方案和视图。图显示(机器人,qs (1:));视图(3)甘氨胆酸ax =;斧子。投影=“拼写”;持有情节(点(:1),点(:,2),“k”轴([-0.1 0.7 -0.3 0.5])%迭代的解决方案万博 尤文图斯framesPerSecond = 15;r = rateControl (framesPerSecond);i = 1:计数显示(机器人,qs(我,:)“PreservePlot”假的,“FastUpdate”,真正的);drawnow waitfor (r);结束

{“字符串”:“图包含一个坐标轴对象。坐标轴对象包含26个补丁类型的对象,线。“,”泰克斯”:[],“乳胶”:[]}