如何写一个ROS package

我们可以把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已经被构建。

    扫描二维码关注公众号,回复: 9573727 查看本文章
发布了57 篇原创文章 · 获赞 4 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_38258767/article/details/103835255