how to create a robot from DH parameters

73 次查看(过去 30 天)
Ali Souliman
Ali Souliman 2021-1-20
评论: Umar 2024-9-15,15:05
Hello,
I have the DH matrix of my robot manipulator.
[0.033 -pi/2 0.147 q1;
0.155 0 0 q2-pi/2;
0.135 0 0 q3;
0 pi/2 0 q4+pi/2;
0 0 0.218 q5];
I am trying to create a model of the robot along what's used here:
the forward kinematics function getTransform() doesn't return the right Homogeneous transormation matrix, which means the model isn't correct.
the code I wrote:
dhparams=[0.033 -pi/2 0.147 0;
0.155 0 0 -pi/2;
0.135 0 0 0;
0 pi/2 0 pi/2;
0 0 0.218 0];
robot = rigidBodyTree('DataFormat','row');
body1 = rigidBody('body1');
jnt1 = rigidBodyJoint('jnt1','revolute');
body2 = rigidBody('body2');
jnt2 = rigidBodyJoint('jnt2','revolute');
body3 = rigidBody('body3');
jnt3 = rigidBodyJoint('jnt3','revolute');
body4 = rigidBody('body4');
jnt4 = rigidBodyJoint('jnt4','revolute');
body5 = rigidBody('body5');
jnt5 = rigidBodyJoint('jnt5','revolute');
;
setFixedTransform(jnt1,dhparams(1,:),'dh');
setFixedTransform(jnt2,dhparams(2,:),'dh');
setFixedTransform(jnt3,dhparams(3,:),'dh');
setFixedTransform(jnt4,dhparams(4,:),'dh');
setFixedTransform(jnt5,dhparams(5,:),'dh');
body1.Joint = jnt1;
body2.Joint = jnt2;
body3.Joint = jnt3;
body4.Joint = jnt4;
body5.Joint = jnt5;
addBody(robot,body1,'base')
addBody(robot,body2,'body1')
addBody(robot,body3,'body2')
addBody(robot,body4,'body3')
addBody(robot,body5,'body4')
transform = getTransform(robot,[0.1 0.1 0.1 0.1 0.1],'body5')
  1 个评论
Umar
Umar 2024-9-15,15:05

Hi @Ali Souliman,

You mentioned, “I am trying to create a model of the robot along what's used here:

https://www.mathworks.com/help/robotics/ref/rigidbodytree.html#d122e13383

the forward kinematics function getTransform() doesn't return the right Homogeneous transormation matrix, which means the model isn't correct.”

Please see my response to your comments below.

To address your concerns regarding the transformation matrix generated by the getTransform() function, it is crucial to understand how DH parameters work, especially in the context of joint offsets. The DH parameters consist of four values: link length, link twist, link offset, and joint angle. The last parameter theta is particularly important for revolute joints because it defines the angle of rotation about the joint axis. In your current setup, you have defined some theta offsets for joints 2 and 4, but these offsets are ignored by default in MATLAB’s setFixedTransform method for revolute joints. This is why you may not be seeing the expected results when calling getTransform(). So, to compensate for these ignored offsets, you can insert fixed bodies between joints. This approach will allow you to manually account for any necessary transformations due to offsets. As pointed out by Yiping Liu, you can modify the joint configuration directly when calling getTransform(). For example, instead of passing the raw joint angles:

     transform = getTransform(robot,[0.1 0.1 0.1 0.1 0.1],'body5');

You would adjust the angles considering the offsets:

     transform = getTransform(robot,[0.1 0.1-pi/2 0.1 0.1+pi/2 
     0.1],'body5');

Here is how you can implement these changes in your code:

   % Define DH parameters including necessary adjustments
   dhparams = [
       0.033  -pi/2    0.147    0;
       0.155   0       0       -pi/2; % Adjusted theta offset
       0.135   0       0        0;
       0       pi/2    0        pi/2; % Adjusted theta offset
       0       0       0.218    0
   ];
   % Create robot model
   robot = rigidBodyTree('DataFormat','row');
   body1 = rigidBody('body1'); jnt1 = rigidBodyJoint('jnt1','revolute');
   body2 = rigidBody('body2'); jnt2 = rigidBodyJoint('jnt2','revolute');
   body3 = rigidBody('body3'); jnt3 = rigidBodyJoint('jnt3','revolute');
   body4 = rigidBody('body4'); jnt4 = rigidBodyJoint('jnt4','revolute');
   body5 = rigidBody('body5'); jnt5 = rigidBodyJoint('jnt5','revolute');
   % Set fixed transforms
   setFixedTransform(jnt1, dhparams(1,:), 'dh');
   setFixedTransform(jnt2, dhparams(2,:), 'dh');
   setFixedTransform(jnt3, dhparams(3,:), 'dh');
   setFixedTransform(jnt4, dhparams(4,:), 'dh');
   setFixedTransform(jnt5, dhparams(5,:), 'dh');
   % Assign joints to bodies
   body1.Joint = jnt1; body2.Joint = jnt2;
   body3.Joint = jnt3; body4.Joint = jnt4; 
   body5.Joint = jnt5;
   % Add bodies to robot
   addBody(robot, body1, 'base')
   addBody(robot, body2, 'body1')
   addBody(robot, body3, 'body2')
   addBody(robot, body4, 'body3')
   addBody(robot, body5, 'body4')
   % Get transformation with adjusted angles for offsets
   transform = getTransform(robot,[0.1 0.1-pi/2 0.1 0.1+pi/2 
   0.1],'body5');

After implementing these changes, verify your robot model by testing various configurations and observing if the transformations align with your expectations.

Please let me know if you have any further questions.

请先登录,再进行评论。

回答(1 个)

Yiping Liu
Yiping Liu 2021-1-21
Ali, the getTransform method is working correctly. But from the way you set the DH parameters, I assume you expect "theta offset" on joint angles 2 and 4.
% a alpha d theta
dhparams=[0.033 -pi/2 0.147 0;
0.155 0 0 -pi/2; % theta offset?
0.135 0 0 0;
0 pi/2 0 pi/2; % theta offset?
0 0 0.218 0];
In the current setFixedTransform implementation, the theta offset is ignored for a revolute joint (similary, the d offset is ignored for a prismatic joint), and that is a documented behavior, see here. In the future, we may consider to allow user to specify the offsets to ease some of the practical use cases, but for now, there are two workarounds:
1) manually adding fixed bodies in between to account for these offsets.
2) Modify the config with the offsets. i.e. instead of
getTransform(robot,[0.1 0.1 0.1 0.1 0.1],'body5')
You do
getTransform(robot,[0.1 0.1-pi/2 0.1 0.1+pi/2 0.1],'body5')
  2 个评论
Valeria Leto
Valeria Leto 2021-5-13
Hi, I have the same problem, but I haven't understood how to change the code. Could you make an example with the second joint?
Jose
Jose 2022-4-5
Hi, in version 2022a you can set the home position of a joint after creating the robot object like this:
robot.Bodies{2}.Joint.HomePosition=-pi/2;
robot.Bodies{4}.Joint.HomePosition=pi/2;

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Mobile Robot Modeling 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by