参考博客:OROCOS之KDL(1)—— Linux环境搭建篇_orocos kdl-优快云博客
KDL源码下载
https://github.com/orocos/orocos_kinematics_dynamics
git clone https://github.com/orocos/orocos_kinematics_dynamics.git
- step1:cd到orocos_kdl目录下,新建文件夹
build
- cd orocos_kdl
- mkdir build
- step2:切换到
build
中执行ccmake ..
- 如果没有内容,显示page0 of 1 则按下c编译一下
- 之后进入设置界面(cmake ..)
- step3:将
BUILD_MODELS
和ENABLE_EXAMPLES
两项设为ON
,选c
选项生成配置信息,然后选e
退出提示
step4:这时发现多了一个g
选项,选g
,然后会自动退出配置GUI界面
step5:执行如下命令
make
sudo make install
step6: 建立软连接 否则直接运行ROS功能包会报错
sudo ln -s /usr/local/lib/liborocos-kdl-models.so /usr/local/include/
最后可以自己写一段代码测试一下,注意在ROS中调用需要修改Cmakelist文件以及库函数,这里做一个说明:
Cmake调用KDL库:额外添加以下内容
find_package(Eigen3 REQUIRED CONFIG)
find_package(orocos_kdl REQUIRED)
add_executable(main src/main.cpp) #这里是自己命名的文件
target_link_libraries(main Eigen3::Eigen orocos-kdl orocos-kdl-models)#这里是自己命名的文件
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 :(");
}
}
最后catkin_make测试一下就好啦 编译成功就算安装完成!!!