基於MATLAB機器人工具箱的KUKA youBot機械臂運動學建模——DH法
以實驗室的KUKA youBot五自由度機械臂為切入點,記得當時和實驗室的同學在這上面花費了好長時間,最後也沒搞定,而這又算是基礎中的基礎,不能忽視。
DH一般分為標準DH和改進的DH,以John J.Craig的《機器人學導論》來說,它的是Modified DH,另一本孫富春翻譯的《機器人學導論——分析、控制及應用》則是用的標準DH。通過Peter Corke的那本《Robotics,Vision and Control》(已有中文版)我才知道有這兩個。區別很明顯DH引數表的下標如果都是一樣的則是標準DH,如果有一半不一樣則是Modified DH。
這樣的和
這條臂比較特別的地方在於關節0和關節1之間有個偏置,特別是在於改進DH中的座標系0和座標系1的設定很特殊。
1. 標準DH
標準DH的介紹我是參考的孫富春翻譯的《機器人學導論——分析、控制及應用》,後來接觸到《Robot Modeling and Control》(已有中文版)也是標準DH。
一個剛體的自由度是6,而為什麼標準DH只用四個引數呢?這裡其實暗含了一個建立座標系的原則:垂直和相交,剛好六個限制條件。這在《Robot Modeling and Control》這本書中有詳細介紹。垂直相交的意思是說,建立座標系的時候,後一個座標系的X要與前一個座標系的Z垂直且相交。如建立X1的時候需要與Z0垂直相交。
在孫的那本書的P62頁,關於DH引數的解釋如下圖:
我舉個例子,例如:
我記的時候就是前一個Z,和後一個的X。如右邊括號裡的,而這裡正是與後文的改進的DH不一樣的地方。
KUKA youBot機械臂的DH
%kuka youBot clear; clc; close all; d1=0.147; a1=0.033; a2=0.155; a3=0.135; d5=0.113; tool = 0.105; qlim1=[-169,169]*pi/180; qlim2=[-65,90]*pi/180; qlim3=[-151,146]*pi/180; qlim4=[-102.5,102.5]*pi/180; qlim5=[-167.5,167.5]*pi/180; L(1) = Link('d', d1, 'a', a1, 'alpha', pi/2, 'qlim',qlim1); L(2) = Link('d', 0, 'a', a2, 'alpha', 0, 'qlim', qlim2, 'offset', 1.57); % L(2) = Link('d', 0, 'a', a2, 'alpha', 0, 'qlim', qlim2); L(3) = Link('d', 0, 'a', a3, 'alpha', 0,'qlim',qlim3); L(4) = Link('d', 0, 'a', 0, 'alpha', -pi/2,'qlim',qlim4, 'offset', -1.57); % L(4) = Link('d', 0, 'a', 0, 'alpha', -pi/2,'qlim',qlim4); L(5) = Link('d', d5, 'a', 0, 'alpha', 0,'qlim',qlim5); bot = SerialLink(L,'name','KUKA youBot'); bot.display(); % bot.plot([0 0 0 0 0]); % bot.teach; %% forward kinematics. bot.tool= transl(0, 0, tool);% EEF bot.fkine([0 0 0 0 0]*pi/180); bot.fkine([0 0 -90 0 0]*pi/180) bot.fkine([0 0 90 0 0]*pi/180)
編好以後可以輸入一些角度驗證一下
如上圖中的這個姿態,第三關節轉動90°,X為33 + (655 - 302)= 386mm,Z座標為底座到第三關節長度為302mm與Figure2中顯示的一致,說明DH建立沒有問題。
2. Modified DH
改進的DH那就是如John J.Craig的《機器人學導論》上的,它與標準DH的區別在於:標準DH的Link0(大地)和Link1之間為J0。而Modified DH則是Link0上有J0,Link1上有J1,基座為座標系{0},一般讓{0}和{1}重合。
Craig的書中文版P52頁
P54頁建立座標系的步驟:
舉個例子:
通常都是下標有一半是i -1,類似這樣
clc;
clear;
close all;
L(1) = Link([ 0 0.147 0 0 ], 'modified' );
L(2) = Link([ 0 0 0.033 pi/2 ], 'modified');
L(3) = Link([ 0 0 0.155 0 ], 'modified');
L(4) = Link([ 0 0 0.135 0], 'modified');
L(5) = Link([ 0 0.218 0 -pi/2], 'modified') ;
youbot = SerialLink(L, 'name', 'youbot');
youbot.display()
youbot.plot([0 0 0 0 0]);
youbot.teach;
相關連結: