MATLAB Answers

Is it possible to call a rigidBodyTree robot model in a Matlab function in Simulink?

36 views (last 30 days)
Lorenzo Scalera
Lorenzo Scalera on 19 May 2020
Commented: Lorenzo Scalera on 9 Apr 2021 at 17:00
Hi everybody,
I am trying to use the Robotic System Toolbox functions inside a Matlab function in Simulink.
I am having troubles in importing the rigidBodyTree model in the Matlab function.
How can I manage this issue?
Thank you very much in advance!
  4 Comments
Lorenzo Scalera
Lorenzo Scalera on 9 Apr 2021 at 17:00
Ciao Valeria, I have created the robot RigidBodyTree in a way similar to what Yiping did.
I have defined a persistent variable, which is initialized only once when the code is run at the first time. Then, "robot" is automatically kept in memory during code execution.
"createRigidBodyTree" is a custom function in which I have built the manipulator RigidBodyTree starting from the DH parameters, as explained in this link:
I hope it can help!
persistent robot
if isempty(robot)
robot=createRigidBodyTree;
end
function robot = createRigidBodyTree
dhparams = [...
robot = rigidBodyTree("MaxNumBodies",8,"DataFormat","row");
body1 = rigidBody('body1');
jnt1 = rigidBodyJoint('jnt1','revolute');
... (please see the link)
end

Sign in to comment.

Accepted Answer

Yiping Liu
Yiping Liu on 4 Nov 2020
Edited: Yiping Liu on 7 Apr 2021 at 18:01
Lorenzo, the persistent variable is the correct way.
You should also check out the rigid body tree algorithm Simulink blocks in RST:
An example of using the persistent variable (NOTE to get a robot inside a function, starting in 21a, you can also use loadrobot command or the new API on rigidBodyTree class called writeAsFunction, both supporting codegen)
function [q, solInfo] = computeIK(T, qini, solTol, gradTol)
%COMPUTEIK
% input:
% Q - 4x4 homogenerous matrix representing end-effector pose
% qini - initial guess for joint configurations (a vector)
% solTol - Solution Toleraance
% gradTol - Gradient Tolerance
persistent ik
if isempty(ik)
robot = robotics.manip.internal.robotplant.puma560DH(); % Since 21a, there are better/cleaner ways to create a robot inside a function.
robot.DataFormat = 'column';
ik = inverseKinematics('RigidBodyTree', robot);
ik.SolverParameters.MaxIterations = 100;
ik.SolverParameters.AllowRandomRestart = false;
end
ik.SolverParameters.SolutionTolerance = solTol;
ik.SolverParameters.GradientTolerance = gradTol;
[q, solInfo] = ik('L6', T, ones(1,6), qini);
end
% codegen command:
% codegen computeIK.m -args {eye(4), ones(1,13), 0, 0}
  3 Comments

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by