0 前言

前面我們對機器人的描述做了說明,本節介紹運動學。運動學是通過關節參數求解末端的笛卡爾參數的過程。這裡說的運動學一般也叫正運動學,因為他的逆過程叫逆運動學(通過笛卡爾參數求解關節參數。)

機械臂是由一系列剛體(連桿)通過運動副(關節)鏈接起來的。關節從本質上可以分為兩類:轉動型和平動性。整個結構形成一個運動鏈。其中一段固定在基座上,另端鏈接穆端的執行器(工具)使得機械臂可以操作空間中的對象。機械臂的機械機構自由度唯一決定其姿態。

從拓撲學觀點出發,如果運動鏈的兩端只由一些列鏈接相連接,則運動鏈為開的;如果一些列的連桿形成了閉合的環,則機械臂包含一個閉運動鏈。

運動學的求解方法有很多種,最直接的辦法就是利用幾何關係求解,不過這種方法在機械結構比較複雜的情況下不太容易計算。一般使用其次矩陣乘法求解(請參考上一篇文章:機器人的描述),這樣計算可以用迭代算法實現,每次只是在計算矩陣乘法。不過即使是這樣我們在坐標系建立(方向)以及在參數選擇上也有很多種方法,下面介紹機器人領域比較通用的一種規範(建系和參數定義)——DH法。

1 標準DH法(standard)

Denavit和Hartenberg于1995年提出了一种为关节链中的每一杆件建立坐标系的矩阵方法,即D-H参数法。

1.1 關節參數

建立坐標系的過程如下:

● 沿關節 i 方向選定軸 zi-1

● 原點 Oi 定位於軸 zi 和軸 zi-1的公垂涎的交點;同樣地 O'i 定位于公垂線與軸 zi-1 的交點;

● 沿軸 zi-1和軸 zi的公垂線選擇軸 xi,方向由關節 i 指向關節 i+1;

● 選擇軸yi 以構成右手系;

以上方法存在一些並不唯一的關節坐標系:

● 對坐標系{0},只有軸 zi的方向是制定的,因此 O0 和 x0 可以任意選擇;

● 對坐標系{n},由於沒有關節 n+1,軸 zn並不唯一,可以取和軸 zn-1相同;

● 當兩相繼軸平行時,公垂線不唯一;

● 當兩相繼軸相交時,軸 xi 的方向任意;

● 當關節 i 為移動關節時,軸 zi-1 的方向任意;

對應的參數選取如下:

aiOi 和 O’i 之間的距離;(公垂線長度)

 diO’i 沿 zi-1 的坐標;

αi:軸 zi-1 和軸 zi 之間的夾角,當繞軸 xi 逆時針轉動時取正;

θi:軸 xi-1 和軸 xi 之間的夾角,當繞軸 zi-1 逆時針轉動時取正;

其中有兩個參數始終為常數,只取決於官借鑒的集合鏈接,剩下兩個鐘有一個是變量取決於關節類型:

● 如果關節 i 是轉動關節,則變量為 θi

● 如果關節 i 是平動關節,則變量為 di

1.2 DH矩陣

可以通過以下步驟將坐標系 i 和坐標系 i-1 之間的坐標變換表示出來:

● 選取一個坐標系與{i-1}坐標系重合;

● 將這個坐標系沿軸zi-1 平移 di,并繞軸zi-1 旋轉θi;變換后得到坐標系{i’},用其次矩陣描述如下:

● 將坐標系{i’}沿軸x’i 平移 ai,并繞軸x’i 旋轉αi;變換后得到坐標系{i},用其次矩陣描述如下:

● 將上面的結果相乘得到變換矩陣:

通過上面的DH矩陣,通過迭代算法,可以依次計算出從關節1到關節n的其次矩陣。

1.3 舉例

下面我們具體舉個例子運動上面的DH法。

對應上面的DLR機械臂的簡圖及DH法建系如下:

得到如下DH參數表:

————————————————————————————

連桿                ai                αi                di                θi

————————————————————————————

                  1                    0               π/2              d1               θ1

                  2                    0               π/2               0                θ2

                  3                    0               π/2              d3               θ3

                  4                    0               π/2               0                θ4

                  5                    0               π/2              d5               θ5

                  6                    0               π/2               0                θ6

                  7                    0                 0                d7               θ7

————————————————————————————

編寫MATLAB代碼繪製圖形(為了繪圖清晰,這裡把坐標系{0}向下移動了一下)

MATLAB代碼如下(其中調用的函數在本文下面的附錄中給出):

%% 參數定義
joint_size = 7+1;                           % 關節數
a = [0, 0, 0, 0, 0, 0, 0];                  % DH參數
alpha = [90, 90, 90, 90, 90, 90, 0];        % 角度(非弧度)
d = [2, 0, 3, 0 ,3, 0, 3];                  % d取數值,為了作圖
cta = [100, 100, 180, -150, 135, 90, 90];   % 角度(非弧度)% 定義數組存儲其次矩陣、姿態矩陣、位置向量
T = cell(joint_size);
R = cell(joint_size);
P = cell(joint_size);% 基座標系定義
T{1} = [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1];
P{1} = T{1}(1:3, 4);
R{1} = T{1}(1:3, 1:3);
% (迭代)循環計算每個關節的其次矩陣
for k=2:joint_sizeT{k} = T{k-1}*DH(a(k-1), radians(alpha(k-1)), d(k-1), radians(cta(k-1)));P{k} = T{k}(1:3, 4);R{k} = T{k}(1:3, 1:3);
end% 繪圖
clf;
DrawCoordinate('1', P{1}, R{1});
for k=2:joint_sizeDrawLine(P{k-1}, P{k});     DrawCylinder((P{k-1}+P{k})/2, R{k-1});DrawCoordinate('0'+k-1, P{k}, R{k});
end% 顯示參數
axis equal;   % 顯示坐標軸比例
view(120,30); % 指定子图1的视点

2 改良DH法(modify DH)

上面的DH法有問題 :關節下標不對應(用標準DH模型處理tree structure robot或closed loop structure robot 會產生奇異 —— Wisama Khalil)。為了解決問題存在一些不同的修正DH法(modify DH)。下面介紹其中的以一種(克雷格)。

2.1 關節參數

建立坐標系過程如下:

● 沿關節 i-1 方向選定軸 zi-1

● 原點 Oi-1 定位於軸 zi 和軸 zi-1的公垂涎的交點;同樣地 O'i 定位于公垂線與軸 zi 的交點;

● 沿軸 zi-1和軸 zi的公垂線選擇軸 xi-1,方向由關節 i-1 指向關節 i;

● 選擇軸 yi 以構成右手系;

以上方法存在一些並不唯一的關節坐標系:

● 對坐標系{0},可以取初始和坐標系{1}相同;

● 對坐標系{n},可以取初始和坐標系 {n-1}相同;

● 當兩相繼軸平行時,公垂線不唯一;

● 當兩相繼軸相交時,軸 xi-1 的方向垂直于軸 zi-1和軸 zi 的平面;

● 當關節 i 為移動關節時,軸 zi-1 的方向任意;

對應的參數選取如下:

aiOi-1 和 O’i 之間的距離;(公垂線長度)

 diO’i 沿 zi 的坐標;(軸 xi-1 與軸xi 的距離)

αi:軸 zi 和軸 zi+1 之間的夾角,當繞軸 xi 逆時針轉動時取正;

θi:軸 xi-1 和軸 xi 之間的夾角,當繞軸 zi 逆時針轉動時取正;

其中有兩個參數始終為常數,只取決於官借鑒的集合鏈接,剩下兩個鐘有一個是變量取決於關節類型:

● 如果關節 i 是轉動關節,則變量為 θi

● 如果關節 i 是平動關節,則變量為 di

2.2 DH矩陣

可以通過以下步驟將坐標系 和坐標系 i-1 之間的坐標變換表示出來:

● 選取一個坐標系與{i-1}坐標系重合;

● 將這個坐標系{i-1}沿軸xi-1 平移 ai-1,并繞軸xi-1 旋轉αi-1;變換后得到坐標系{i’},用其次矩陣描述如下:

● 將坐標系沿軸zi 平移 di,并繞軸zi 旋轉θi;變換后得到坐標系{i},用其次矩陣描述如下:

● 將上面的結果相乘得到變換矩陣:

通過上面的DH矩陣,通過迭代算法,可以依次計算出從關節1到關節n的其次矩陣。

2.3 舉例

下面我們將DLR機械臂的例子,通過改良DH法求解一下。

改良DH參數表:

————————————————————————————

連桿             ai-1            αi-1                di                θi

————————————————————————————

                  1                    0                0                 d1               θ1

                  2                    0               π/2               0                θ2

                  3                    0               π/2              d3               θ3

                  4                    0               π/2               0                θ4

                  5                    0               π/2              d5               θ5

                  6                    0               π/2               0                θ6

                  7                    0               π/2              d7               θ7

————————————————————————————

編寫MATLAB代碼繪製圖形

MATLAB代碼如下(其中調用的函數在本文下面的附錄中給出):

%% 參數定義
joint_size = 7+1;                           % 關節數
a = [0, 0, 0, 0, 0, 0, 0];                  % DH參數
alpha = [0, 90, 90, 90, 90, 90, 90];        % 角度(非弧度)
d = [2, 0, 3, 0 ,3, 0, 3];                  % d取數值,為了作圖
cta = [100, 100, 180, -150, 135, 90, 90];   % 角度(非弧度)% 定義數組存儲其次矩陣、姿態矩陣、位置向量
T = cell(joint_size);
R = cell(joint_size);
P = cell(joint_size);% 基座標系定義
T{1} = [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1];
P{1} = T{1}(1:3, 4);
R{1} = T{1}(1:3, 1:3);
% (迭代)循環計算每個關節的其次矩陣
for k=2:joint_sizeT{k} = T{k-1}*MDH(a(k-1), radians(alpha(k-1)), d(k-1), radians(cta(k-1)));P{k} = T{k}(1:3, 4);R{k} = T{k}(1:3, 1:3);
end% 繪圖
clf;
DrawCoordinate('0', P{1}, R{1});
for k=2:joint_sizeDrawLine(P{k-1}, P{k});     DrawCylinder((P{k-1}+P{k})/2, R{k});DrawCoordinate('0'+k-1, P{k}, R{k});
end% 顯示參數
axis equal;   % 顯示坐標軸比例
view(120,30); % 指定子图1的视点

3 閉鏈

前面都是關於開鏈的情況,下面介紹一下 閉鏈的處理方法。

求解過程:

● 首先將鏈拆開,上圖的坐標系{j},分成多個開鏈;

● 利用DH法計算其次矩陣;

● 建立閉鏈的約束(個開鏈的末端位姿相同),減少關節變量;

● 利用規約后的關節變量求解其次變換得到正運動學方程;

4 附錄

這裡提供了matlab的作圖函數以及DH矩陣函數:

繪圖函數:

% 绘制坐标系 參數:坐標系名字name,坐標系位置p,坐標系姿態(可選參數,缺省為單位陣)
function DrawCoordinate(name, p, varargin)% 以(x, y, z)为原点(R)为方向绘制坐标系R = [1 0 0; 0 1 0; 0 0 1];if numel(varargin) == 1R = varargin{1};endquiver3(p(1), p(2), p(3), R(1,1), R(2,1), R(3,1), 1);hold on;quiver3(p(1), p(2), p(3), R(1,2), R(2,2), R(3,2), 1);hold on;quiver3(p(1), p(2), p(3), R(1,3), R(2,3), R(3,3), 1);hold on;text(p(1), p(2), p(3), '');text(p(1)+R(1,1), p(2)+R(2,1), p(3)+R(3,1), ['x_', name]);text(p(1)+R(1,2), p(2)+R(2,2), p(3)+R(3,2), ['y_', name]);text(p(1)+R(1,3), p(2)+R(2,3), p(3)+R(3,3), ['z_', name]);hold on;
end
% 绘制直線 參數:起始點向量p,結束點向量q
function DrawLine(p, q)% 以(x, y, z)为原点(R)为方向绘制坐标系plot3([p(1) q(1)], [p(2) q(2)], [p(3) q(3)], 'LineWidth', 5);R = [1 0 0; 0 1 0; 0 0 1];hold on;
end
% 绘制圓柱 參數:繪圖位置P,圓柱姿態矩陣R
function DrawCylinder(P, R)r=0.2;%圆柱半径n=50;%设置多少个边逼近圆[x,y,z]=cylinder(r,n);%生成标准的100个面的圆柱数据,半径为r,高为1,底面圆心0,0;z=[z(1,:)-0.5;z(2,:)-0.5];%圆柱高增高,变为高hfor k=1:n+1xx1 = R(1,1)*x(1,k)+R(1,2)*y(1,k)+R(1,3)*z(1,k)+P(1);yy1 = R(2,1)*x(1,k)+R(2,2)*y(1,k)+R(2,3)*z(1,k)+P(2);zz1 = R(3,1)*x(1,k)+R(3,2)*y(1,k)+R(3,3)*z(1,k)+P(3);xx2 = R(1,1)*x(2,k)+R(1,2)*y(2,k)+R(1,3)*z(2,k)+P(1);yy2 = R(2,1)*x(2,k)+R(2,2)*y(2,k)+R(2,3)*z(2,k)+P(2);zz2 = R(3,1)*x(2,k)+R(3,2)*y(2,k)+R(3,3)*z(2,k)+P(3);x(1,k) =  xx1; x(2,k) =  xx2;y(1,k) =  zz1; y(2,k) =  zz2;z(1,k) =  yy1; z(2,k) =  yy2;end%为变成实心封顶添加数据z2=[z(1,:);z;z(2,:)];x2=[x(1,:);x;x(2,:)];y2=[y(1,:);y;y(2,:)];z3=[z(1,:);z(1,:)];x3=[x(1,:);x(1,:)];y3=[y(1,:);y(1,:)];z4=[z(2,:);z(2,:)];x4=[x(2,:);x(2,:)];y4=[y(2,:);y(2,:)];surf(x2,z2,y2,'LineStyle','none')map=jet(16);cl=4;%可设置16种颜色(1-16)colormap(map(cl,:))hold onsurf(x3,z3,y3);hold onsurf(x4,z4,y4);hold on
end

DH矩陣函數:

%% 计算DH矩阵 參數a, alpha, d, cta
function [ans] = DH(a, alpha, d, cta)ans = [cos(cta)  -sin(cta)*cos(alpha)   sin(cta)*sin(alpha)  a*cos(cta); sin(cta)   cos(cta)*cos(alpha)  -cos(cta)*sin(alpha)  a*sin(cta); 0            sin(alpha)            cos(alpha)           d;0                     0                     0           1];
end
%% 计算DH矩阵 參數a, alpha, d, ct
function [ans] = MDH(a, alpha, d, cta)ans = [cos(cta)             -sin(cta)            0              a; sin(cta)*cos(alpha)   cos(cta)*cos(alpha)  -sin(alpha)  -sin(alpha)*d; sin(cta)*sin(alpha)   cos(cta)*sin(alpha)   cos(alpha)   cos(alpha)*d;0                     0            0             1];
end

5 參考文獻

《机器人学导论:分析控制及应用》(美)尼库 著

《机器人学导论》(美)克来格 著

《机器人学导论》(美)约翰 J 卡雷格 著

《机器人学:建模、规划与控制》布鲁诺·西西里安诺、洛伦索·夏维科、路易吉·维拉尼 、朱塞佩·奥里奥洛 著

《Springer Handbook of Robotics》布鲁诺·西西里安诺、歐莎瑪 哈提卜

機器人學總結(2) —— (正)運動學相关推荐

  1. 機器人學總結(3) —— 雅克比:速度和靜力

    0 前言 前面介紹了機器臂的描述和(正)運動學,這次我們來說微分運動學.運動學是通過關節角度(長度)求解末端笛卡爾位姿的過程.看到微分應該會想到這裡處理的是速度之間的關係,微分運動學是通過關節速度(角 ...

  2. 機器人學總結(4) —— 逆運動學

    0.前言 逆運動學,是通過操作空間(笛卡爾空間)的位姿,求解關機空間的關節參數的過程.把它放在雅克比後面,是因為有些逆運動學算法需要用到雅克比矩陣.處理逆運動學的方法很多,我們這裡介紹一些常用的方法. ...

  3. 人工智能 java 坦克机器人系列: 强化学习_人工智能 Java 坦克機器人系列: 強化學習...

    級別:中級 2006 年 7 月13日 本文中,我們將使用強化學習來實現一個機器人.使用強化學習能創建一個自適應的戰斗機器人.這個機器人能在戰斗中根據環境取得最好的策略,並盡力使戰斗行為最佳.並在此過 ...

  4. 機器人學總結(1) —— 機器人的描述

    0 前言 接觸機器人已經有一定的時間了(其實也不是很長),一直想把這方面的知識和經驗總結一下.主要是想為自己做個整理,如果那裡有錯誤或者有問題的地方,還請大家指正.'指點和交流. 這裡所說的機器人主要 ...

  5. PHP Plurk Api基礎教學(一) - 如何製作自動發噗機器人

    PHP Plurk Api基礎教學(一) - 如何製作自動發噗機器人 1.第一步 到Plurk PHP APi Google code官網下載最新的PHP API 上面的連結是1.6.2版(聽說已經是 ...

  6. Gazebo機器人仿真學習探索筆記(二)基本使用說明

    在完成Gazebo7安裝後,需要熟悉Gazebo,方便之後使用. 部分源代碼可以參考:https://bitbucket.org/osrf/gazebo/src/ 如果還沒有安裝請參考之前內容完成安裝 ...

  7. Gazebo機器人仿真學習探索筆記(三)機器人模型

    gazebo_models:https://bitbucket.org/osrf/gazebo_models 模型庫下載,可以參考如下命令: ~/Rob_Soft/Gazebo7$ hg clone ...

  8. gtav登录请确认不是机器人_GTA5線上被誤封號申訴方法【註:網站填表現在已經無法解封了,因為都是機器人自動回覆】...

    最近正版被誤封的情況出現的非常嚴重undefined,有的剛剛購買了遊戲,上線才玩1個小時都沒有,就被封號了 ,對此玩家表示很無奈.去百度搜索解封方法,給的答案都是一樣的 --去申訴網站「https: ...

  9. 得力助手 消防员的 消防机器人_消防機器人:消防員的“得力助手”(科技大觀)...

    原標題:消防機器人:消防員的"得力助手"(科技大觀) 近日,巴黎聖母院突發大火,其標志性的塔尖倒塌,令全球惋惜.據法國內政部門消息,當時消防部門緊急派遣一台名為"巨人&q ...

最新文章

  1. 『前端干货篇』:你不知道的Stylus
  2. 「12306奇葩验证码」反例背后的产品观
  3. SQL 数据库远程备份 语句
  4. 祝贺!两位 Apache Flink PMC 喜提 Apache Member
  5. 安装redis提示[test] error 2_技术干货分享:一次flask+redis的微服务实战
  6. Linux工作笔记-Linux常用命令(一)
  7. Visual Studio 2015开发Android App启动调试始终无法完成应用部署的解决方案
  8. p12解析流程_iOS证书及描述文件制作流程详解
  9. java----EL表达式
  10. Mac自带嗅探器和Wireshake抓包(三)
  11. 【跃迁之路】【479天】程序员高效学习方法论探索系列(实验阶段236-2018.05.30)...
  12. 软件测试经典问题——NextDate函数
  13. Matlab三位曲线之plot3函数
  14. Cron每年1月5号 4月5号 7月5号 10月5号 00:00:00执行任务
  15. linux dkms,DKMS简介
  16. 计算机潮流分析22节点,第三章电力系统潮流分析与计算第七讲电力网络方程和矩阵及功率方程_255903070...
  17. 23种设计模式归纳总结——结构型
  18. GE PLC的EGD协议通信
  19. 回顾使用云桌面的那些经验
  20. 常见UNIXLINUX系统

热门文章

  1. 计算机音乐计算器,【新坑记录】计算器音乐
  2. word数据源mysql,Word2013中使用Access数据库的方法
  3. 项目中如何进行客户引导
  4. Photoshop-图层样式的使用方法
  5. 2022中国出海品牌价值50强榜单公布,手机通讯、家用电器、乘用车三类赛道品牌价值得分占比名列前茅 | 美通社头条...
  6. 程序设计(Python)实验十三 数据分析与可视化(1)
  7. DLSS技术有多强?游戏帧数提升利器!
  8. html中文输入转换成英文,HTML input 文本框输入中文逗号自动转换为英文逗号
  9. 说说CSS学习中的瓶颈
  10. 自定义圆形进度条,金额百分比