準備工作
Robotics System Toolbox學習筆記(四):Inverse Kinematics相關函數
generalizedInverseKinematics
創建多約束逆運動學求解器。
generalizedInverseKinematics系統對象™使用一組運動學約束來計算由rigidBodyTree對象指定的剛體樹模型的關節角度,以此完成逆解計算。其使用非線性求解器來滿足約束或達到最佳逼近。在調用對象之前,請指定約束類型ConstraintInputs,調用release(gik),來更改約束輸入。
各類的約束輸入在上一篇博客Robotics System Toolbox學習筆記(四):Inverse Kinematics相關函數都介紹了,用到翻來看看就行,此處就不多說了。如果只是對機器人末端執行器的位置和姿態進行約束,則使用上一篇博客中提到的ik函數即可。
一般來說,使用該函數解決廣義逆運動學約束問題,分爲如下兩步:
- 創建一個
generalizedInverseKinematics
對象,並設置該對象的相關屬性; - 帶參調用對象,就像它是一個函數一樣。
% 不指定剛體樹模型,返回一個廣義逆運動學求解器對象。需要注意的是在使用這個求解器對象之前需要指定剛體樹模型以及約束輸入性質
gik = generalizedInverseKinematics
% 指定剛體樹模型和期望的約束輸入,然後返回一個廣義逆運動學求解器對象
gik = generalizedInverseKinematics('RigidBodyTree',rigidbodytree,'ConstraintInputs',inputTypes)
% 返回一個廣義逆運動學求解器,其中每個指定的屬性名稱通過一個或多個“名稱/值”對參數設置爲指定的值。名稱必須出現在單引號('')中。您可以按任意順序指定多個名稱-值對參數,例如Name1,Value1,...,NameN,ValueN。
gik = generalizedInverseKinematics(Name,Value)
性質如下:
NumConstraints | 約束輸入的個數 | 只讀,約束輸入的數量,指定爲標量。該屬性的值是ConstraintInputs屬性中指定的約束類型的數量。 |
---|---|---|
ConstraintInputs | 約束輸入類型 | 約束輸入類型,指定爲字符串數組。可能的約束輸入類型及其關聯的約束對象如下,這些約束對象都是響應的函數創建的,詳細見上一篇博客: - orientation :OrientationTarget - position :PositionTarget - pose :PoseTarget - aiming :AimingConstraint - cartesian :CartesianBounds - joint :JointPositionBounds |
RigidBodyTree | 剛體樹模型 | 老生常談了,不說了不說了~ |
SolverAlgorithm | 逆運動學算法 | 求解逆向運動學的算法,指定爲“ BFGSGradientProjection”或“ LevenbergMarquardt”。默認爲"BFGSGradientProjection"有關每種算法的詳細信息,請參見Inverse Kinematics Algorithms |
SolverParamters | 算法相關的參數 | 與指定算法關聯的參數,指定爲結構。結構中的字段特定於算法 |
利用創建得到的gik對象進行解算
% 根據初始猜測關節角和約束描述對象的逗號分隔列表,找到聯合配置configSol與算法執行相關的解決方案信息solInfo。約束描述的數量取決於ConstraintInputs屬性
% Input:
% - initialguess:機器人各個關節構型的猜測值,作爲gik解算器的初始值,要使用矢量形式,請將RigidBodyTree屬性中分配的對象的DataFormat屬性設置爲'row'或'column'
% - constraintObj,...,constraintObjN:約束描述,由gik的ConstraintInputs屬性定義的約束描述,指定爲這些約束對象中的一個或多個:
% - constraintAiming
% - constraintCartesianBounds
% - constraintJointBounds
% - constraintOrientationTarget
% - constraintPoseTarget
% - constraintPositionTarget
% 上述約束概念均在上一篇博客中,此處不再贅述
% Outputs:
% - configSol:機器人關節構型的逆解,包含如下兩個部分:
% - JointName:剛體樹模型中的關節名稱向量
% - JointPosition:各關節對應的角度,這是在公差範圍內逆解得到的
% solInfo---解信息,包含下列五個部分:
% - Iterations:算法迭代的步數
% - NumRandomRestrarts:由於算法陷入了局部最小值而隨機重啓的次數
% - ConstraintViolation:有關約束的信息,以結構數組形式返回。數組中的每個結構都具有以下字段:
% * Type:對應的約束輸入的類型,如ConstraintInputs屬性中所指定
% * Violation:對應約束類型的約束違規向量。0表示滿足約束
% - ExitFlag:該代碼提供了有關算法執行及其返回原因的更多詳細信息。有關每種算法類型的退出標誌,請參見退出標誌
% - Status:描述解決方案是在容差範圍內('success')還是算法可以找到的最佳解決方案('best available')的字符向量
[configSol,solInfo] = gik(initialguess,constraintObj,...,constraintObjN)
例子
我直接拿的劉勳博士師兄翻譯的例子……感謝感謝~
% lesson_8_generalizedInverseKinematics 建立多約束逆運動學求解器
% 創建一個廣義逆運動學求解器,該機器人將機器人手臂固定在特定位置並指向機器人基座
% 創建約束對象以將必要的約束參數傳遞到求解器中
% 加載預定義的KUKA LBR機器人模型,該模型指定爲剛體樹對象
load exampleRobots.mat lbr
gik = generalizedInverseKinematics;
gik.RigidBodyTree = lbr;
showdetails(lbr)
show(lbr)
% 創建兩個約束對象
gik.ConstraintInputs = {'position','aiming'};
% tool0爲末端執行器座標系
% 名爲tool0的物體的原點相對於機器人的base,位置座標爲[0.0 0.5 0.5]
posTgt = constraintPositionTarget('tool0');
posTgt.TargetPosition = [0.0 0.5 0.5];
% 名爲tool0的剛體z軸指向機器人base系下的某個點,也就是末端tool0的Z軸指向[0 0 0.8]這個點
aimCon = constraintAiming('tool0');
aimCon.TargetPoint = [0.0 0.0 0.8];
% 找到一個滿足約束的配置。必須按照在ConstraintInputs屬性中指定的順序將約束對象傳遞到系統對象
% 同時指定機器人配置的初始猜測關節角
q0 = homeConfiguration(lbr); % Initial guess for solver
[q,solutionInfo] = gik(q0,posTgt,aimCon);
% 可視化求解器返回的配置
show(lbr,q);
title(['Solver status: ' solutionInfo.Status])
axis([-0.75 0.75 -0.75 0.75 -0.5 1])
% 從目標位置到aim點繪製一條線段。tool0系的原點與線段的一端重合,其z軸與線段對齊。
hold on
plot3([0.0 0.0],[0.5 0.0],[0.5 0.8],'--o')
hold off