Robotic Arm Trajectory Animation Using Robotic Toolbox

67 views (last 30 days)
Ahmetcan Yasar
Ahmetcan Yasar on 18 Dec 2020
Answered: Cam Salzberger on 21 Dec 2020
I am trying to simulate a 3DoF robot arm using MATLAB robotic toolbox. I have created the robot arm however when i try to move the arm with a trajectory i get an error. Can someone explain what i am doing wrong?
This is the error i am getting. Conversion to double from struct is not possible.
Error in PneumaticRoboticArm (line 80)
qs(i,:) = qSol;
%%Robotic Arm,
pneumatic Muscles
L1 = 0.05;
L2 = 0.11;
L3 = 0.5;
L4 = 0.27;
%% Adding Base Frame No rotation
body1 = rigidBody('link 1');
joint1 = rigidBodyJoint('BaseFrame', 'fixed');
setFixedTransform(joint1,trvec2tform([0 0 0]));
body1.Joint = joint1;
robot = rigidBodyTree;
addBody(robot, body1, 'base');
show(robot)
%% joint 2 Yaw Rotation
body2 = rigidBody('link 2');
joint2 = rigidBodyJoint('YawJoint','revolute');
setFixedTransform(joint2, trvec2tform([L1,0,0]));
body2.Joint = joint2;
addBody(robot, body2, 'link 1');
show(robot)
%% Link 2 Joint 3 Pitch Rotation
body3 = rigidBody('link 3');
joint3 = rigidBodyJoint('PitchJoint1','revolute');
setFixedTransform(joint3, trvec2tform([L2, 0, 0]));
body3.Joint = joint3;
addBody(robot, body3, 'link 2');
show(robot)
%% Link 3 Joint 4 Pitch Rotation
body4 = rigidBody('link 4');
joint4 = rigidBodyJoint('PitchJoint2','revolute');
setFixedTransform(joint4, trvec2tform([L3, 0, 0]));
body4.Joint = joint4;
addBody(robot, body4, 'link 3');
show(robot)
% Adding end effector
body5 = rigidBody('endeffector');
joint5 = rigidBodyJoint('EndEffector','fixed');
setFixedTransform(joint5, trvec2tform([L4, 0, 0]));
body5.Joint = joint5;
addBody(robot, body5, 'link 4');
show(robot)
config = randomConfiguration(robot); % random q1,q2
tform = getTransform(robot,config,'endeffector','base')
%% Define The Trajectory
% Define a circle to be traced over the course of 10 seconds. This circle
% is in the _xy_ plane with a radius of 0.15.
t = (0:0.2:10)'; % Time
count = length(t);
center = [0.3 0.1 0];
radius = 0.15;
theta = t*(2*pi/t(end));
points = center + radius*[cos(theta) sin(theta) zeros(size(theta))];
%% inverse kinematics and moving on trajectory step by step
q0 = homeConfiguration(robot);
ndof = length(q0); % 2
qs = zeros(count, ndof); % time:51 steps
ik = inverseKinematics('RigidBodyTree', robot);
weights = [0, 0, 0, 1, 1, 0]; % Wx,Wy,Wz, X,Y,Z
endEffector = 'endeffector';
qInitial = q0; % home configuration as initial guess
for i = 1:count
point = points(i,:); % trajectories
qSol = ik(endEffector,trvec2tform(point),weights,qInitial);
qs(i,:) = qSol;
qInitial = qSol;
end
%% Animate The Solution
figure
show(robot,qs(1,:)');
view(2)
ax = gca;
ax.Projection = 'orthographic';
hold on
plot(points(:,1),points(:,2),'k')
axis([-0.1 0.7 -0.3 0.5])
framesPerSecond = 15;
r = rateControl(framesPerSecond);
fo
n b
r i = 1:count
show(robot,qs(i,:)','PreservePlot',false);
drawnow
waitfor(r);

Answers (1)

Cam Salzberger
Cam Salzberger on 21 Dec 2020
Hello Ahmetcan,
The configuration solution output of calling the inverseKinematics object defaults to being a struct. If you want a row vector, you need to call it with "DataFormat","row" name-value pairs.
The error message is pretty clear about what is going on at that line. To debug, you can inspect your variables, see which ones aren't looking like what you would expect, and then go to where they were created to figure out why they are like that.
-Cam

Tags

Products


Release

R2020a

Community Treasure Hunt

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

Start Hunting!