You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
5.1 KiB
138 lines
5.1 KiB
%MDL_NAO Create model of Aldebaran NAO humanoid robot
|
|
%
|
|
% MDL_NAO is a script that creates several workspace variables
|
|
%
|
|
% leftarm left-arm kinematics (4DOF)
|
|
% rightarm right-arm kinematics (4DOF)
|
|
% leftleg left-leg kinematics (6DOF)
|
|
% rightleg right-leg kinematics (6DOF)
|
|
%
|
|
% which are each SerialLink objects that describe the kinematic
|
|
% characteristics of the arms and legs of the NAO humanoid.
|
|
%
|
|
% Reference::
|
|
% - "Forward and Inverse Kinematics for the NAO Humanoid Robot",
|
|
% Nikolaos Kofinas,
|
|
% Thesis, Technical University of Crete
|
|
% July 2012.
|
|
% - "Mechatronic design of NAO humanoid"
|
|
% David Gouaillier etal.
|
|
% IROS 2009, pp. 769-774.
|
|
%
|
|
% Notes::
|
|
% - SI units of metres are used.
|
|
% - The base transform of arms and legs are constant with respect to the
|
|
% torso frame, which is assumed to be the constant value when the robot
|
|
% is upright. Clearly if the robot is walking these base transforms
|
|
% will be dynamic.
|
|
% - The first reference uses Modified DH notation, but doesn't explicitly
|
|
% mention this, and the parameter tables have the wrong column headings
|
|
% for Modified DH parameters.
|
|
% - TODO; add joint limits
|
|
% - TODO; add dynamic parameters
|
|
%
|
|
% See also SerialLink, Revolute.
|
|
|
|
% MODEL: Aldebaran, NAO, humanoid, 4DOF, standard_DH
|
|
|
|
|
|
% Copyright (C) 1993-2015, by Peter I. Corke
|
|
%
|
|
% This file is part of The Robotics Toolbox for MATLAB (RTB).
|
|
%
|
|
% RTB is free software: you can redistribute it and/or modify
|
|
% it under the terms of the GNU Lesser General Public License as published by
|
|
% the Free Software Foundation, either version 3 of the License, or
|
|
% (at your option) any later version.
|
|
%
|
|
% RTB is distributed in the hope that it will be useful,
|
|
% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
% GNU Lesser General Public License for more details.
|
|
%
|
|
% You should have received a copy of the GNU Leser General Public License
|
|
% along with RTB. If not, see <http://www.gnu.org/licenses/>.
|
|
%
|
|
% http://www.petercorke.com
|
|
|
|
deg = pi/180;
|
|
|
|
% NAO constants (in mm)
|
|
NeckOffsetZ = 126.50;
|
|
ShoulderOffsetY = 98.00;
|
|
ElbowOffsetY = 15.00;
|
|
UpperArmLength = 105.00;
|
|
LowerArmLength = 55.95;
|
|
ShoulderOffsetZ = 100.00;
|
|
HandOffsetX = 57.75;
|
|
HipOffsetZ = 85.00;
|
|
HipOffsetY = 50.00;
|
|
ThighLength = 100.00;
|
|
TibiaLength = 102.90;
|
|
FootHeight = 45.19;
|
|
HandOffsetZ = 12.31;
|
|
|
|
% set some default plot options, base and shadow are not useful for a multi-arm plot
|
|
plotopts = {'nobase', 'noshadow'};
|
|
|
|
|
|
leftarm = SerialLink( [
|
|
Revolute('d', 0, 'alpha', -pi/2, 'a', 0, 'modified')
|
|
Revolute('d', 0, 'alpha', pi/2, 'a', 0, 'offset', -pi/2, 'modified')
|
|
Revolute('d', UpperArmLength, 'alpha', -pi/2, 'a', 0, 'modified')
|
|
Revolute('d', 0, 'alpha', pi/2, 'a', 0, 'modified')
|
|
], ...
|
|
'base', transl(0, ShoulderOffsetY+ElbowOffsetY, ShoulderOffsetZ), ...
|
|
'tool', trotz(pi/2)*transl(HandOffsetX+LowerArmLength, 0, 0), ...
|
|
'plotopt', plotopts, ...
|
|
'name', 'left arm', 'manufacturer', 'Aldabaran');
|
|
|
|
rightarm = SerialLink( [
|
|
Revolute('d', 0, 'alpha', -pi/2, 'a', 0, 'modified')
|
|
Revolute('d', 0, 'alpha', pi/2, 'a', 0, 'offset', pi/2, 'modified')
|
|
Revolute('d', -UpperArmLength, 'alpha', -pi/2, 'a', 0, 'modified')
|
|
Revolute('d', 0, 'alpha', pi/2, 'a', 0, 'modified')
|
|
], ...
|
|
'base', transl(0, -ShoulderOffsetY-ElbowOffsetY, ShoulderOffsetZ), ...
|
|
'tool', trotz(pi/2)*transl(-HandOffsetX-LowerArmLength, 0, 0)*trotz(-pi), ...
|
|
'plotopt', plotopts, ...
|
|
'name', 'right arm', 'manufacturer', 'Aldabaran');
|
|
|
|
|
|
leftleg = SerialLink( [
|
|
Revolute('d', 0, 'alpha', -3*pi/4, 'a', 0, 'offset', -pi/2, 'modified')
|
|
Revolute('d', 0, 'alpha', -pi/2, 'a', 0, 'offset', pi/4, 'modified')
|
|
Revolute('d', 0, 'alpha', pi/2, 'a', 0, 'modified')
|
|
Revolute('d', 0, 'alpha', 0, 'a', -ThighLength, 'modified')
|
|
Revolute('d', 0, 'alpha', 0, 'a', -TibiaLength, 'modified')
|
|
Revolute('d', 0, 'alpha', -pi/2, 'a', 0, 'modified')
|
|
], ...
|
|
'base', transl(0, HipOffsetY, -HipOffsetZ), ...
|
|
'tool', trotz(pi)*troty(-pi/2)*transl(0, 0, -FootHeight), ...
|
|
'plotopt', plotopts, ...
|
|
'name', 'left leg', 'manufacturer', 'Aldabaran');
|
|
|
|
rightleg = SerialLink( [
|
|
Revolute('d', 0, 'alpha', -pi/4, 'a', 0, 'offset', -pi/2, 'modified')
|
|
Revolute('d', 0, 'alpha', -pi/2, 'a', 0, 'offset', -pi/4, 'modified')
|
|
Revolute('d', 0, 'alpha', pi/2, 'a', 0, 'modified')
|
|
Revolute('d', 0, 'alpha', 0, 'a', -ThighLength, 'modified')
|
|
Revolute('d', 0, 'alpha', 0, 'a', -TibiaLength, 'modified')
|
|
Revolute('d', 0, 'alpha', -pi/2, 'a', 0, 'modified')
|
|
], ...
|
|
'base', transl(0, -HipOffsetY, -HipOffsetZ), ...
|
|
'tool', trotz(pi)*troty(-pi/2)*transl(0, 0, -FootHeight), ...
|
|
'plotopt', plotopts, ...
|
|
'name', 'right leg', 'manufacturer', 'Aldabaran');
|
|
|
|
|
|
% plot the legs and arms in a nominal sized workspace
|
|
clf
|
|
leftleg.plot([0 0 0 0 0 0], 'workspace', 400*[-1 1 -1 1 -1 1]);
|
|
hold on
|
|
rightleg.plot([0 0 0 0 0 0], 'workspace', 400*[-1 1 -1 1 -1 1]);
|
|
leftarm.plot([0 0 0 0], 'workspace', 400*[-1 1 -1 1 -1 1]);
|
|
rightarm.plot([0 0 0 0], 'workspace', 400*[-1 1 -1 1 -1 1]);
|
|
|
|
|
|
|