我们可以把ros package看作是一个C++工程,它的文件树如下:
package_name/
include/
src/
CMakeLists.txt
package.xml
我们可以通过命令:
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
生成一个package模板,也可以直接新建上述文件。
这里我通过一个将图片publish
的例子介绍完成一个package的过程。
源文件
首先,下面是我的源文件:
#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>
#include <iostream>
int main(int argc, char** argv)
{
ros::init(argc, argv, "camera_imitation");
ros::NodeHandle nh;
image_transport::ImageTransport it(nh);
image_transport::Publisher pub = it.advertise("/camera_imitation/rgb_image", 10);
ros::Rate loop_rate(10);
cv::Mat single_frame;
std::string image_path = "data/rgb/single.jpg";
single_frame = cv::imread(image_path, CV_LOAD_IMAGE_UNCHANGED);
while (nh.ok()) {
sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", single_frame).toImageMsg();
pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
}
- 它的作用是将一张名为
single.jpg
的图片以10hz的频率发布出去
package.xml
下面我们来看看package.xml
的内容:
<?xml version="1.0"?>
<package>
<name>camera_imitation</name>
<version>0.0.0</version>
<description>The camera_imitation package</description>
...
<buildtool_depend>catkin</buildtool_depend>
<build_depend>cv_bridge</build_depend>
<build_depend>image_transport</build_depend>
<build_depend>roscpp</build_depend>
<build_depend>sensor_msgs</build_depend>
<build_depend>message_runtime</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>opencv2</build_depend>
<run_depend>cv_bridge</run_depend>
<run_depend>image_transport</run_depend>
<run_depend>roscpp</run_depend>
<run_depend>sensor_msgs</run_depend>
<run_depend>message_runtime</run_depend>
<run_depend>std_msgs</run_depend>
<run_depend>opencv2</run_depend>
<!-- The export tag contains other, unspecified, tags -->
<export>
<!-- Other tools can request additional information be placed here -->
</export>
</package>
这里面主要包含三个部分:
<buildtool_depend> - 指定编译工具
<build_depend> - 编译依赖
<run_depend> - 运行依赖
编译依赖和运行依赖都是随ROS安装的package。使用上面的catkin_create_pkg
命令指定依赖包后可直接生成上面的package.xml
。
CMakeLists.txt
CMakeLists.txt
的内容如下:
cmake_minimum_required(VERSION 3.0)
project(camera_imitation)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
find_package(catkin REQUIRED COMPONENTS
cv_bridge
image_transport
roscpp
sensor_msgs
std_msgs
)
find_package(OpenCV REQUIRED)
catkin_package(CATKIN_DEPENDS cv_bridge image_transport message_runtime sensor_msgs)
include_directories(
${catkin_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
)
set(
SOURCE_FILES
src/rgb_image_node.cpp
)
# executable files
add_executable(rgb_image_node ${SOURCE_FILES} )
add_dependencies(rgb_image_node ${catkin_EXPORTED_TARGETS} ${${PROJECT_NAME}_EXPORTED_TARGETS})
target_link_libraries(rgb_image_node ${catkin_LIBRARIES} ${OpenCV_LIBS})
-
catkin_package指出依赖此package的包所需的依赖
-
add_dependencies 定义target依赖的其他target,确保在编译本target之前,其他的target已经被构建。