2022.1.4由于项目需要,我在想能不能再ROS操作系统下运行aubo机械臂的SDK文件,我想理论上讲是能实现的,如果有大佬以前做过还望能指点一二。
目前想到两种方式:
一是利用官网给的SDK包,里面找到了aubo_driver这个文件包,里面包含了sdk文件的库,因此可以考虑直接在原包里面编写;
二是自己建立ros功能包,缺点自己要搞cmake文件把需要用到的库连接上。
2022.1.5经过两天的折磨,程序调通了。
上面讲的两种方式归根结底就一种方式,就还是在ROS架构下做个功能包,然后把aubo机器人SDK里需要连接的文件都链接上,然后写代码就完了。
在提出具体的步骤之前,先了解一下aubo官方给的sdk包,下载地址在aubo官网:资料下载 (aubo-robotics.cn)
1.了解Aubo机器人SDK的文件夹架构:
|SDK
|-->dependents
|-->libconfig
|-->log4cplus
|-->protobuf
|-->robotCotroller
|-->robotSDK
|-->inc
|-->AuboRobotMetaType.h
......(.h文件)
|-->lib(里面有一些静态链接库和动态链接库)
|-->example(内含一些例程)
|-->***.h
|-->***.cpp
综上,可以知道文件夹里面主要包含三大类文件:1)动态链接库(.so)和静态链接库(.a)
2)Headers头文件(.h) 3)Sources源文件(.cpp)
我们再用QT打开,可以更好的理解给出的例子工程是什么样的:
可以看到,这是个外部工程有main.cpp文件,内部的子工程由有两个example和application_point
了解了文件夹结构和工程结构之后,我们再看一下编译器的内容,因为aubo官方给的工程文件是qmake编译器编译的,但我们要做ros下的文件,最根本的就是把qmake的语句变为cmake编译。
1)外部工程qmake
2)内部子工程qmake
我的linux系统是64位的,所以只看第二大部分,具体的怎么把Qmake转为cmake以及qmake和cmake各个语句具体是有什么用,是什么意思,可以去百度一搜一堆,这里就不赘述了,只提关键的地方:
可以看到,我们只需要把前面提到的三大类文件全连接上就能实现用机械臂的sdk进行编程了!
实现步骤:
1.创建工作空间:
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
注:这里因为我们下载的aubo给出的功能包,因此我的功能包就直接用的aubo机器人的工作空间aubo_robot_ws.
2. 编译catkin工作空间
$ cd ~/catkin_ws/
$ catkin_make
3.配置环境变量(给CmakeList用的,里面有很多诸如${PROJECT_NAME}的使用,这里的大写字母部分就是环境变量)
$ source devel/setup.bash
为了方面可以把上述指令添加至.bashrc文件中,如下:
通过命令:vim ~/.bashrc , 在.bashrc文件中添加相应的命令
(这样就不用每次都执行source命令了,只需要catkin_make一下,就自动source环境变量了)
4. 创建工作包
cd catkin_ws/src
catkin_create_pkg robot_sdk_test std_msgs roscpp rospy
粗体部分robot_sdk_test为功能包的名字,随意更改即可。
我们可以看见功能包内包含以下文件:
CMakeLists.txt
package.xml
5.修改功能包内的CMakeList.txt文件,参考文档.
这里是关键,就是把qmake改为cmake文件,主要目的就是把上述三大类文件(链接库、头文件、源文件)都链接到工程中来。
1).链接头文件
在将官网给的SDK文件中的exmple文件夹中的.h文件都放到include中。(这里把其他所有用到的.h文件都放进来也行,原理就是为了能让编译器找到这些文件就可以)
之后,在cmakelists.txt中,将包含两个头文件的文件夹路径都添加进来
(头文件链接完毕!)
2).链接动态链接库和静态链接库
这里,有-L或者后缀为.so的是动态链接库:
没有-L或后缀为.a的为静态链接库.
(一)连接动态链接库:
link_directories(${PROJECT_SOURCE_DIR}/lib) #添加动态连接库的路径
target_link_libraries(project_name -lXXX ) #添加XXX库,或者说连接libXXX.so文件
注意:第一行:PROJECT_SOURCE_DIR是环境变量,关于更具体地可以学习:
"cmake常用环境变量";而%{XXX}符号就是使用这个变量值,只需要知道这个值是本功能包最上层地文件路径就可以了。
第二行,动态链接库在Linux系统下,文件名字是libXXXXX.so,所以上面地project_name和后面的-lxxx中的xxx都要改为自己需要的动态库的名字。
(二)连接静态链接库:
add_library(XXX STATIC IMPORTED)
set_property(TARGET XXX PROPERTY IMPORTED_LOCATION /XXX/XXX/XXX/libXXX.a)
target_link_libraries(project_name XXX) #添加XXX库,或者说连接libXXX.a文件
注意:同样,XXX为静态库的名字,第二行注意/XXX/XXX/XXX/libXXX.a为文件的路径。第三行,project_name名字是项目的名字一般在第一行自己设置。
3)源文件
源文件的包含相对简单,只需要把main函数内用到的源文件内函数所在的源文件写在下面这句话中即可,中间用空格空开:
add_executable(robot_sdk_test src/robot_sdk_test.cpp src/example_ik.cpp src/util.cpp)
解释:就比如上面这个,因为我的main函数在robot_sdk_test.cpp源文件中,但是除此之外我还用到了example_ik.cpp和util.cpp文件中的函数,因此我需要在此用空格隔开这几个文件的相对路径,保证各个源文件都能链接到。
至此,三大类文件都已连接完毕后就可以了,不过有些系统可能还是存在链接库连接不上问题,报一些bug,不过直接从网上搜索这些bug基本都是小问题能解决,比如最常见的bug:
lderror:xxxxx
就是因为这几个动态链接库是自己复制粘贴的,所以/usr/local/lib这个文件目录下连接不到,这里有两种方式:
1)直接将用到的.so或者.a文件一股脑复制粘贴进该目录下,但注意只能在终端下用命令:
sudo cp /xxx /usr/local/lib
因为没有管理员权限只能在终端用sudo命令,这里/xxx是需要复制的文件路径。
2)用ln -s 命令,这个可以参考这个用法,一搜一堆就不展开说了。
参考连接:linux ln 命令使用参数详解(ln -s 软链接) - 那些年的代码 - 博客园 (cnblogs.com)
6.改完cmake后,就完成了,打开终端cd到工作空间下catkin_make一下,(别忘了source如果没预先设置的话)
7.用rosrun命令运行就可以了,比如我这个文件就运行
rosrun robot_sdk_test robot_sdk_test
8.大功告成,机械臂正常运动.