![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/495993/image.png)
how to create a robot from DH parameters
35 次查看(过去 30 天)
显示 更早的评论
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')
0 个评论
回答(1 个)
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')
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/495993/image.png)
2 个评论
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
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 Center 和 File Exchange 中查找有关 Robotics 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!