Robotics System Toolbox學習筆記(四):inverseKinematics及逆運動學約束ConstraintInputs

逆運動學(IK)用於確定機器人模型的關節配置,以實現所需的最終效果位置。基於關節之間的轉換,在rigidBodyTree機器人模型中指定了機器人運動學約束。您還可以指定外部約束,例如攝像機臂的瞄準約束或特定剛體鏈接上的笛卡爾邊界框。使用機械手約束對象和generalizedInverseKinematics對象。

inverseKinematics

inverseKinematics系統對象創建一個逆運動學(IK)求解器,對於指定的剛體樹模型爲期望的末端執行器姿勢計算各個關節角度。爲您的機器人創建一個剛體樹模型。該模型定義了求解器強制執行的所有聯合約束。如果可能的話,請遵守機器人模型中指定的關節極限。 要指定除末端執行器姿勢以外的更多約束(包括目標約束,位置範圍或方向目標),請考慮使用generalizedInverseKinematics。通過此類,您可以計算多約束IK解決方案。

對於一個期望的末端執行器姿態,去計算各個關節的角度,這就是逆運動學問題,主要由以下步驟組成:

  • 創建inverseKinematics對象,並且設置相關屬性;
  • 使用參數調用對象,就好像它是一個函數一樣。
% 創建對象
% 創建逆運動學求解器。要使用求解器,請在RigidBodyTree屬性中指定剛體樹模型。
ik = inverseKinematics
    
% Name-Value值對參數,根據例子去理解更深刻
ik = inverseKinematics(Name,Value)

性質如下:

RigidBodyTree 剛體樹模型 ridigBodyTree對象
SolverAlgorithm 逆運動學算法 求解逆向運動學的算法,指定爲“ BFGSGradientProjection”或“ LevenbergMarquardt”。默認爲"BFGSGradientProjection"有關每種算法的詳細信息,請參見Inverse Kinematics Algorithms
SolverParameters 算法相關的參數 與指定算法關聯的參數,指定爲結構。結構中的字段特定於算法

例子:

% 指定rigidbodytree對象,建立該對象的ik逆運動學求解器
ik = inverseKinematics('RigidBodyTree',rigidbodytree)
% 更新剛體樹模型
addBody(rigidbodytree,rigidBody('body1'),'base')

% 將剛體樹重新分配給IK解算器。如果在修改剛體樹模型之前調用了求解器或step函數,請使用release來更改屬性
ik.RigidBodyTree = rigidbodytree;

利用創建得到的ik對象進行解算

% 根據預期的末端執行器位姿來逆解得到關節角度
% 爲ik指定initialguess,併爲姿勢的六個組成部分的公差指定所需的權重。與算法執行相關的解決方案信息solInfo與聯合配置解決方案configSol一起返回

% Inputs
% endeffector---末端執行器名稱,必須在建立ik對象的剛體樹模型中
% pose---末端執行器的位姿,指定爲4*4齊次變換矩陣,表示想要達到的末端執行器末端位姿
% weights---姿態誤差的權重,指定爲6元素向量,前三個元素對應於所需姿勢的方向誤差上的權重。最後三個元素對應於所需姿勢的xyz位置誤差的權重
% initalguess---機器人各個關節構型的猜測值,作爲ik解算器的初始值,要使用矢量形式,請將RigidBodyTree屬性中分配的對象的DataFormat屬性設置爲'row'或'column'。

% OutPuts
% configSol---機器人關節構型的逆解,包含如下兩個部分:
% 	- JointName:剛體樹模型中的關節名稱向量
% 	- JointPosition:各關節對應的角度,這是在公差範圍內逆解得到的
% solInfo---解信息,包含下列五個部分:
% 	- Iterations:算法迭代的步數
% 	- NumRandomRestrarts:由於算法陷入了局部最小值而隨機重啓的次數
% 	- PoseErrorNorm:當前姿態與目標姿態之間的誤差大小
% 	- ExitFlag:該代碼提供了有關算法執行及其返回原因的更多詳細信息。有關每種算法類型的退出標誌,請參見退出標誌
% 	- Status:描述解決方案是在容差範圍內('success')還是算法可以找到的最佳解決方案('best available')的字符向量
[configSol,solInfo] = ik(endeffector,pose,weights,initialguess)

例子

% 加載機器人模型,puma1是一個六軸機器人剛體樹模型
load exampleRobots.mat
showdetails(puma1)

% 獲取puma1的一個任意構型
randConfig = puma1.randomConfiguration;

% 在randConfig隨機構型下獲取從末端執行器(L6)到base的齊次變換
% 使用此變換作爲末端執行器的目標姿勢
tform = getTransform(puma1,randConfig,'L6','base');
% 展示該目標姿態下的機器人構型
show(puma1,randConfig)

% 創建puma1模型的ik對象
ik = inverseKinematics('RigidBodyTree',puma1);
% 指定姿勢不同分量的權重,爲啥要設這個權重,目前我也不太清楚,估計和具體算法相關
% 對於方向角分量來說,使用比位置分量小的權重
weights = [0.25 0.25 0.25 1 1 1];
% 將機器人的home構型用作初始猜測的關節角
initialguess = puma1.homeConfiguration;

% 根據預期的末端執行器位姿來逆解得到關節角度
[configSoln,solnInfo] = ik('L6',tform,weights,initialguess);

% 顯示逆解得到的關節構型
% 逆解得到的關節構型與目標構型有着細微的差別,因爲存在誤差
% 多次調用ik對象可以提供相似或非常不同的關節構型
show(puma1,configSoln)

在這裏插入圖片描述

得到的randConfig下的機器人構型

在這裏插入圖片描述

將randConfig下的末端位姿作爲目標位姿,以home構型作爲初始姿態,進行逆運動學計算,得到的逆解構型爲:

在這裏插入圖片描述

在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述

constraintAiming class

創建瞄準約束以指向目標位置。constraintAiming對象描述了一個約束,該約束要求一個物體(末端執行器)的z軸瞄準另一個物體(參考物體)上的目標點。如果末端執行器座標系的z軸在連接末端執行器原點和目標點的向量的任何方向均在角度公差內,則可以滿足此約束。相對於參考物體定義了目標點的位置。

約束對象用於GeneralizedInverseKinematics對象中,以在機器人上指定多個運動學約束。

% 返回一個constraintAiming對象,該對象表示對endeffector指定的物體的約束
aimConst = constraintAiming(endeffector) 
% 指定endeffector的同時,還利用Name-Value值對來指定一些性質
aimConst = constraintAiming(endeffector,Name,Value)

這個類創建的對象具有如下幾個性質:

endeffector 末端執行器名稱 字符串
ReferenceBody 參考物體座標系的名稱 默認爲空,表示約束是相對於機器人模型基系的
TargetPoint 目標相對於參考物體的位置 指定爲[x, y, z],默認爲[0, 0, 0]。約束使用EndEffector座標系的原點和此目標點之間的向量來維持指定的AngularTolerance
AngularTolerance 末端執行器座標系的z軸與將末端執行器原點連接到目標點向量之間的最大允許角度,以弧度表示爲數字標量,默認爲0
Weights 約束權重 指定爲數字標量,默認爲1。該權重與在generalizedInverseKinematics中指定的所有約束的Weights屬性一起使用

constraintJointBounds

創建機器人模型的關節位置約束。

constraintJointBounds對象描述機器人剛體樹模型的關節位置約束。如果機器人構型矢量將所有關節位置保持在指定的邊界內,則可以滿足此約束。構造矢量包含了rigidBodyTree對象中所有非固定關節的位置。 約束對象用於generalizedInverseKinematics對象中,以指定機器人上的多個運動學約束。

% 返回一個constraintJointBounds對象,該對象描述了robot這個剛體樹模型的關節位置約束
jointConst = constraintJointBounds(robot)

% 利用Name-Value值對來指定一些性質
jointConst = constraintJointBounds(robot,Name,Value)

該類創建的對象有如下性質:

Bounds 構型向量的範圍 指定爲n×2矩陣。矩陣的每一行對應於機器人模型上的一個非固定關節,並給出該關節的最小和最大位置。默認情況下,邊界是根據輸入的剛體樹模型機械手中每個rigidBodyJoint對象的PositionLimits屬性設置的
Weights 約束權重 約束的權重(指定爲n元素矢量),其中每個元素對應於邊界中的一行,並給出每個邊界的相對權重。默認值爲1的向量,以賦予所有關節位置相等的權重。這些權重與generalizedInverseKinematics中指定的所有約束的Weights屬性一起使用,以正確平衡每個約束

constraintCartesianBounds

創建約束以將body原點保持在笛卡爾範圍內,該對象描述了一個物體(末端執行器)相對於固定於另一物體(參考物體)上的目標座標系的位置約束。如果末端執行器原點相對於目標座標系的位置保持在指定的範圍之內,則可以滿足此約束TargetTransform屬性是將目標座標系中的點轉換爲ReferenceBody座標系中的點的齊次變換。 約束對象用於GeneralizedInverseKinematics對象中,以在機器人上指定多個運動學約束。

% 返回笛卡爾邊界對象,該對象表示對由endeffector指定的機器人模型的主體的約束
cartConst = constraintCartesianBounds(endeffector)

% 利用Name-Value值對來指定一些性質
cartConst = constraintCartesianBounds(endeffector,Name,Value)

該類創建的對象的一些性質:

EndEffector 末端執行器名稱 字符串
ReferenceBody 參考物體座標系名稱 默認爲’ ',表示約束是相對於機器人模型基系的
TargetTransform 目標座標系相對於參考物體座標系的姿態變換 默認爲eye(4)
Bounds 相對於目標座標系的末端執行器位置範圍 指定爲3×2向量,[xMin xMax; yMin yMax; zMin zMax]。每行分別定義xyz座標的最小值和最大值。
Weights 約束權重 指定爲[x y z]向量,默認爲[1 1 1]。向量的每個元素分別對應於xyz座標的權重。這些權重與generalizedInverseKinematics中指定的所有約束的Weights屬性一起使用,以正確平衡每個約束

constraintOrientationTarget

在body相對方向上創建約束。constraintOrientationTarget對象描述了一個約束,該約束要求一個主體(末端執行器)的方向與目標方向相匹配,不過兩個方向向量之間允許存在任意方向上指定的角度誤差。相對於參考物體的物體座標系用來指定目標方向。

% 指定body爲endeffector,返回一個定向目標對象,該對象表示對由endeffector指定的機器人模型的主體的約束
orientationConst = constraintOrientationTarget(endeffector)

% 利用Name-Value值對來指定一些性質
orientationConst = constraintOrientationTarget(endeffector,Name,Value)

該類創建的對象的一些性質:

EndEffector 末端執行器名稱 字符串
ReferenceBody 參考物體座標系名稱 默認爲’ ',表示約束是相對於機器人模型基系的
TargetOrientation 末端執行器相對於參考體的目標方向 指定爲4元素向量來表示單位四元數,默認爲[1 0 0 0],末端執行器相對於參考體的方向是將末端執行器座標系中指定的方向轉換爲參考體座標系中指定的相同方向的方向。
OrientationTolerance 最大允許旋轉角度 標量,默認爲0。該值是使末端執行器方向與目標方向匹配所需的旋轉角度的上限
Weights 約束權重 標量,默認爲1。該權重與generalizedInverseKinematics中指定的所有約束的Weights屬性一起使用,以正確平衡每個約束。

constraintPoseTarget

constraintPoseTarget對象描述了一個約束,該約束要求一個物體(末端執行器)的姿勢任何方向上的距離和角度公差內匹配目標姿勢。相對於參考物體的物體座標系指定目標姿勢。

% 返回一個姿態目標對象,代表剛體樹模型中endeffector的目標姿態約束
poseConst = constraintPoseTarget(endeffector)

% 利用Name-Value值對來指定一些性質
poseConst = constraintPoseTarget(endeffector,Name,Value)

該類創建對象的一些性質:

EndEffector 末端執行器名稱 字符串
ReferenceBody 參考物體座標系名稱 默認爲’ ',表示約束是相對於機器人模型基系的
TargetTransform 目標座標系相對於參考物體座標系的姿態變換 默認爲eye(4)
OrientationTolerance 最大允許旋轉角度 標量,默認爲0。該值是使末端執行器方向與目標方向匹配所需的旋轉角度的上限
PositionTolerance 距離目標位置最大允許距離 標量,默認爲0。該值是末端執行器原點與目標位置之間距離的上限。
Weights 約束權重 2元素向量,默認爲[1 1]。兩個元素分別對應於PositionTolerance與OrientationTolerance的權重。

constraintPositionTarget

constraintPositionTarget對象描述了一種約束,該約束要求一個物體(末端執行器)的位置任意方向上的距離公差內的目標位置相匹配。相對於參考物體的物體座標系指定目標位置。

% 指定body爲endeffector,返回一個位置目標對象,該對象表示對由endeffector指定的機器人模型的主體的約束
positionConst = constraintPositionTarget(endeffector)

% 利用Name-Value值對來指定一些性質
positionConst = constraintPositionTarget(endeffector,Name,Value)

該類創建的對象的一些性質:

EndEffector 末端執行器名稱 字符串
ReferenceBody 參考物體座標系名稱 默認爲’ ',表示約束是相對於機器人模型基系的
TargetPosition 目標相對於參考物體的位置 指定爲[x y z],默認爲[0 0 0],目標位置是在參考物體座標系中指定的點。
PositionTolerance 距目標的最大允許距離 標量,默認爲0。該值是末端執行器原點距離目標位置的最大值。
Weights 約束權重 標量,默認爲1。該權重與generalizedInverseKinematics中指定的所有約束的Weights屬性一起使用,以正確平衡每個約束。

參考

Inverse Kinematics

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章