ROS中的cmake是什么?针对这个问题,本文详细介绍了相应的分析和解答,希望能帮助更多想要解决这个问题的小伙伴找到更简单易行的方法。
这次,我们在ROS中讨论cmake和ROS代码编译过程。
1.基础准备
首先,创建一个基本工作区,创建一个名为柳絮_ws的新ROS项目,并在其中创建一个src文件夹。
$ mkdir ~/柳絮_ws
$ CD ~/柳絮_ws
$mkdirsrc
$cdsrc然后使用ROS包工具,柳絮_create_pkg,在src文件下创建一个名为“test”的新包,它依赖于std _ msgs,rospy,roscpp’
$柳絮_ create _ pkgteststd _ msgsrospyrspptfsensor _ msgsimage _ transportcv _ bridge然后在测试文件夹下的src中创建新的test.cpp文件,这是源代码的标准位置。此时的文件结构如下。
src
test
CMakeLists.txt
include
test
package.xml
src
test.cpp的文件结构是标准的ROS项目和包结构。如果我们需要添加一个新的节点包,我们只需要在src下的测试文件夹中添加一个结构类似的文件夹,例如test2,文件结构就变成如下。
src
test
CMakeLists.txt
include
test
package.xml
package.xml~
src
test.cpp
test2
CMakeLists.txt
include
test2
package.xml
src
94920-test2.cpp2 .文件结构准备好之后,需要配置CMakeLists.txt和包. xml
这是为特定示例配置的。这个例子是OpenCV的一个例子,它是纯C代码,不涉及具体的ROS函数。范例的工作
能是读取摄像头的输入,并展示出来。(Ubuntu 14.04 上面测试通过,注意其中的OpenCV库的引用,请用自己的具体OpenCV库头文件路径包含,具体配置还需自行google)
#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <stdio.h> //#include "ros/ros.h" //#include "std_msgs/String.h" using namespace cv; using namespace std; int main(int argc, char** argv) { //ros::init(argc, argv, "test"); Mat image; int cam_idx = 0; if (argc == 2) { cam_idx = atoi(argv[1]); } VideoCapture cap(cam_idx); if (!cap.isOpened()) { cerr << "Could not open camera." << endl; exit(EXIT_FAILURE); } namedWindow("Display Image"); for(;;){ cap >> image; imshow("Display Image", image); waitKey(5); } //ros::spin(); return 0; }
首先配置CMakeLists.txt,添加这里的例子 test.cpp ,配置后的文件为,(更具体的参数解释可以参考 wiki)
cmake_policy(SET CMP0012 NEW) cmake_minimum_required(VERSION 2.8.3) project(test) # find_package(catkin REQUIRED COMPONENTS cv_bridge image_transport roscpp rospy sensor_msgs std_msgs tf ) find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) include_directories( ${catkin_INCLUDE_DIRS} ) #add our own node src add_executable(test_node src/test.cpp) target_link_libraries(test_node ${OpenCV_LIBS} ${catkin_LIBRARIES})
接着配置下package.xml(更具体的每项解释参考ROS,wiki )
<?xml version="1.0"?> <package> <name>test</name> <version>0.0.0</version> <description>The test package</description> <maintainer email="caoyuanfenglv@163.com">caoyuanfeng</maintainer> <license>TODO</license> <buildtool_depend>catkin</buildtool_depend> <build_depend>cv_bridge</build_depend> <build_depend>image_transport</build_depend> <build_depend>roscpp</build_depend> <build_depend>rospy</build_depend> <build_depend>sensor_msgs</build_depend> <build_depend>std_msgs</build_depend> <build_depend>tf</build_depend> <build_depend>opencv</build_depend> <run_depend>cv_bridge</run_depend> <run_depend>image_transport</run_depend> <run_depend>roscpp</run_depend> <run_depend>rospy</run_depend> <run_depend>sensor_msgs</run_depend> <run_depend>std_msgs</run_depend> <run_depend>tf</run_depend> <run_depend>opencv</run_depend> <export> </export> </package>
注意里面多加了OpenCV的以来和图像相关的依赖。
3.编译运行
在配置好两个文件以后,一般的新增ROS项目和node需要修改的都是这两个文件,或者只有CMakelists.txt一个文件,如果依赖相同的。
回到项目的根目录,也就是catkin_ws文件夹,然后用catkin_make编译
$ cd ~/catkin_make $ ls src $ catkin_make
接着,运行得到的node
$ source devel/setup.bash $ rosrun test test_node
将会看到打开摄像头,弹出来摄像头的画面。表示这个node编译运行成功。
回头看去,总结了下整个ROS项目的过程就是这样的
-
新建固定的文件结构
-
copy标准的CMakeLists.txt和package.xml文件
-
分析自己的项目依赖,配置上面的两个配置文件
-
编写自己的src代码,在CMakeLists.txt里面添加源代码路径
-
编译运行,出错返回3,成功则 good job。
整个项目的代码都在git@osc上面,可以查看这里。
关于ROS中的cmake指的是什么问题的解答就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/156546.html