Kinematics and Dynamics Library(KDL)的安裝與使用


准備

確保Linux系統中已安裝gcc、g++、make、cmake、git等工具,若未安裝則使用sudo apt install命令進行安裝

git初次使用前需要進行一些配置,見《Git的使用》中“初次運行Git前的配置”部分,否則克隆倉庫時會出現如下錯誤:

通過如下命令安裝eigen3庫:

sudo apt install libeigen3-dev

此方法將eigen3庫安裝在/usr/include下,且Eigne在/usr/include/eigen3中

eigen3安裝完成后,需要在/usr/local/include路徑下建立其軟連接

sudo ln -s /usr/include/eigen3/Eigen/ /usr/local/include/

否則kdl庫無法找到eigen庫將引發報錯:

克隆

從github上克隆源碼:

git clone https://github.com/orocos/orocos_kinematics_dynamics.git

編譯及安裝

進入克隆到本地的orocos_kdl倉庫中,新建一個名為build的文件夾並進入此文件夾中(注意,克隆到本地的倉庫名稱為orocos_kinematics_dynamics,需要進入到其中的orocos_kdl)

執行cmake ..命令(注意路徑“..”前有空格)

執行make命令,直至編譯完成

執行安裝命令sudo make install直至安裝完成

orocos-kdl庫的安裝路徑為/usr/local/include

測試

編寫如下C++代碼並保存為kdl_test.cpp:

#include <kdl/chain.hpp>
#include <kdl/chainfksolver.hpp>
#include <kdl/chainfksolverpos_recursive.hpp>
#include <kdl/frames_io.hpp>
#include <stdio.h>
#include <iostream>

using namespace KDL;

int main( int argc, char** argv )
{
    //Definition of a kinematic chain & add segments to the chain
    KDL::Chain chain;
    chain.addSegment(Segment(Joint(Joint::RotZ),Frame(Vector(0.0,0.0,1.020))));
    chain.addSegment(Segment(Joint(Joint::RotX),Frame(Vector(0.0,0.0,0.480))));
    chain.addSegment(Segment(Joint(Joint::RotX),Frame(Vector(0.0,0.0,0.645))));
    chain.addSegment(Segment(Joint(Joint::RotZ)));
    chain.addSegment(Segment(Joint(Joint::RotX),Frame(Vector(0.0,0.0,0.120))));
    chain.addSegment(Segment(Joint(Joint::RotZ)));

    // Create solver based on kinematic chain
    ChainFkSolverPos_recursive fksolver = ChainFkSolverPos_recursive(chain);

    // Create joint array
    unsigned int nj = chain.getNrOfJoints();
    KDL::JntArray jointpositions = JntArray(nj);

    // Assign some values to the joint positions
    for(unsigned int i=0;i<nj;i++){
        float myinput;
        printf ("Enter the position of joint %i: ",i);
        scanf ("%e",&myinput);
        jointpositions(i)=(double)myinput;
    }

    // Create the frame that will contain the results
    KDL::Frame cartpos;

    // Calculate forward position kinematics
    bool kinematics_status;
    kinematics_status = fksolver.JntToCart(jointpositions,cartpos);
    if(kinematics_status>=0){
        std::cout << cartpos <<std::endl;
        printf("%s \n","Succes, thanks KDL!");
    }else{
        printf("%s \n","Error: could not calculate forward kinematics :(");
    }
}

並采用如下命令編譯kdl_test.cpp文件(在編譯命令中指出orocos-kdl庫):

g++ -o kdl_test kdl_test.cpp -lorocos-kdl

若編譯后的可執行文件kdl_test可以正常運行,按顯示的提示輸入,可得到如下結果,則安裝成功:

 

若在Qt中使用KDL,則需要在項目的.pro文件中添加:

LIB += -lorocos-kdl

 但上述方法僅僅指出了編譯時所鏈接的庫,但未指出程序運行時要鏈接的動態鏈接庫所在的路徑,可能回出現如下問題,即編譯正常:

但運行時找不到動態鏈接庫,此時需要在編譯時之處編譯好的程序在運行時鏈接的庫的位置:

則程序正常運行

對於Qt,需要在.pro文件中添加庫的絕對路徑,而非僅僅是LIB += -lorocos-kdl,絕對路徑的添加:

但如何讓在/usr/local/lib下的庫在運行時自動鏈接,可能需要將此庫加入到環境變量中,有待進一步研究

 一種可能的情況是,在安裝了ROS的情況下,KDL庫的相關路徑已經被添加到環境變量中,則可以直接鏈接,否則需要給出庫的完整路徑,此外,若有添加庫路徑到環境變量中的方法,應該也可以實現僅給出庫的名稱而不列出完整路徑


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM