Robotics System Toolboxで採用​されているDH記法は​どこの文献を参考にし​たものでしょうか.

21 views (last 30 days)
Hata Hiromitsu
Hata Hiromitsu on 31 Dec 2018
Commented: Yutaka Kaizu on 17 Dec 2020
Robotics system toolbox を用いてロボットツリーを作成しているのですが, このときのDH記法は, 文献 [1] を参考にしています. しかし, 作成したロボットツリーが望みの形になりません. Mathworksが採用されているDH記法のルールはどこに載っているのでしょうか, また, 参考文献があれば教えていただけると幸いです.
[1] 永井清, 土橋宏規 : " ロボット機構学 ", コロナ社, pp.27-28, 2015.
% リンクパラメータ
L1 = 60/10^3; %% 単位はメートル(m)
L2 = 20/10^3;
L3 = 20/10^3;
L4 = 95/10^3;
L5 = 8/10^3;
Lt = 35/10^3;
% 関節角度(とりあえず)
tht11 = 0;
tht12 = 0;
p1 = 0;
% DHパラメータの作成
dhparams =[0 pi 0 0; % ベース座標 ∑B
L1+L3 3*pi/2 Lt tht11; % ジョイント J11(能動関節)
L1 0 0 tht12; % ジョイント J12(能動関節)
L2 pi/2 L3 p1; % ジョイント J13(受動関節)
L4 pi/2 L5 3*pi/2]; % ジョイント C1(ボールベアリング)
% ツリーオブジェクトの作成
robot = robotics.RigidBodyTree;
% ベース座標系
body1 = robotics.RigidBody('body1');
jnt1 = robotics.Joint('jnt1','revolute');
setFixedTransform(jnt1,dhparams(1,:),'dh');
body1.Joint = jnt1;
addBody(robot,body1,'base')
% ジョイントJ11
body2 = robotics.RigidBody('body2');
jnt2 = robotics.Joint('jnt2','revolute');
setFixedTransform(jnt2,dhparams(2,:),'dh');
body2.Joint = jnt2;
addBody(robot,body2,'body1')
% ジョイントJ12
body3 = robotics.RigidBody('body3');
jnt3 = robotics.Joint('jnt3','revolute');
setFixedTransform(jnt3,dhparams(3,:),'dh');
body3.Joint = jnt3;
addBody(robot,body3,'body2')
% ジョイントJ13
body4 = robotics.RigidBody('body4');
jnt4 = robotics.Joint('jnt4','revolute');
setFixedTransform(jnt4,dhparams(4,:),'dh');
body4.Joint = jnt4;
addBody(robot,body4,'body3')
% ジョイントC1
body5 = robotics.RigidBody('body5');
jnt5 = robotics.Joint('jnt5','revolute');
setFixedTransform(jnt5,dhparams(5,:),'dh');
body5.Joint = jnt5;
addBody(robot,body5,'body4')
% 表示
showdetails(robot)
show(robot);

Accepted Answer

Yoshio
Yoshio on 4 Jan 2019
ご存知かも知れませんが、こちらに簡単ですが、解説があります。
入力引数のところで、
dhparams — Denavit-Hartenberg (DH) parameters
の部分を開いて頂き、剛体ツリー ロボット モデル
をみて頂ければと思います。
なお、参考文献は一番下部の
References
をご覧ください。
なお、修正DH記法の場合は、
mdhparams — Modified Denavit-Hartenberg (DH) parameters
となりますので、こちらも確認願います。
  3 Comments
Hata Hiromitsu
Hata Hiromitsu on 9 Jan 2019
Tohru Kikawada様
貴重なご指摘ありがとうございました.
参考にさせていただきます.
Hata Hiromitsu

Sign in to comment.

More Answers (1)

Yutaka Kaizu
Yutaka Kaizu on 14 Dec 2020
Edited: Yutaka Kaizu on 14 Dec 2020
すでに解決済みだと思いますが、私の調べた範囲で申し上げると、MatlabのsetFixedTransform等のヘルプにある、DHパラメータは、6自由度のPuma560を表現するには不適当だと思います。パラメータの書き方は、[1]に倣うべきですが、実際には[2]の書き方になっており、その結果、6自由度のロボットとは違う形になっています。違いは、1行目に[0 0 0 0]が入っているところです。 ヘルプは修正されるべきだと思われます。[1]の和訳版が[3]にあるので、参照してみてはいかがでしょう。あとは、参考文献[4]でも大丈夫です。[2]と[4]では第4関節の位置が第3関節と同じ場所か、第5関節と同じ場所か変わりますが、ロボット先端の位置は変わりません。
%これは一般的な6自由度のロボットの表現としては間違い
dhparams = [0 pi/2 0 0;
0.4318 0 0 0
0.0203 -pi/2 0.15005 0;
0 pi/2 0.4318 0;
0 -pi/2 0 0;
0 0 0 0];
%こちらが正しい 1行目がリンク0からリンク1への変換
dhparams = [0 0 0 0;
0 pi/2 0 0;
0.4318 0 0 0
0.0203 -pi/2 0.15005 0;
0 pi/2 0.4318 0;
0 -pi/2 0 0;];
%より現代的なロボットの場合(回転軸がオフセットしてない)
dhparams = [0 0 0 0
0 pi/2 0 0;
0.4318 0 0 0
0 -pi/2 0 0;
0 pi/2 0.4318 0;
0 -pi/2 0 0;];
%参考文献[2] P78のロボットを実現するには
dhparams = [0 0 0 0;
0 pi/2 0 0;
a2 0 0 0
0 pi/2 0 0;
0 -pi/2 d4 0;
0 pi/2 0 0;];
%参考文献[4] P56のロボットを実現するには
dhparams = [0 0 0 0;
0 pi/2 0 0;
a2 0 0 0
0 pi/2 d4 0;
0 -pi/2 0 0;
0 pi/2 0 0;];
[1] Craig, John J. Introduction to Robotics: Mechanics and Control. Reading, MA: Addison-Wesley, 1989.
[2] Siciliano, Bruno. Robotics: Modelling, Planning and Control. London: Springer, 2009.
[3] John J. Craig ロボティクス 機構・力学・制御, 共立出版, 1991
[4] 細田耕 実践ロボット制御, オーム社, 2019
  3 Comments
Yutaka Kaizu
Yutaka Kaizu on 17 Dec 2020
やはり、setFixedTransform(jnt1,dhparams(1,:),'dh');
の関数には、dhのオプションの際にそもそもバグがあると思われます。DHパラメータをどう書いても、納得行く結果は得られません。setFixedTransform(jnt1,tform); のtformに教科書に則った変換行列を入れれば正しい結果が得られました。以下のような関数をつくって試しました。
function tform = myDH2tform(dh)
%obtain tform transformation matrix from DH parameters
% Detailed explanation goes here
Ta = trvec2tform([dh(1) 0 0]); %a translation along x axis
Talpha = axang2tform([1 0 0 dh(2)]); %alpha rotation around x axis
Td = trvec2tform([0 0 dh(3)]); %d translation along new z axis
Ttheta = axang2tform([0 0 1 dh(4)]); %theta rotation around new z axis
tform = Ta*Talpha*Td; %calculate tform ignoring Ttheta
end

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!