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.