准備
確保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庫的相關路徑已經被添加到環境變量中,則可以直接鏈接,否則需要給出庫的完整路徑,此外,若有添加庫路徑到環境變量中的方法,應該也可以實現僅給出庫的名稱而不列出完整路徑