ROS2学习笔记(三)——colcon编译并编写自己的包

一、概述

什么是colcon?

colcon is a command line tool to improve the workflow of building, testing and using multiple software packages.It automates the process, handles the ordering and sets up the environment to use the packages.

colcon是一个命令行工具,用于改进编译,测试和使用多个软件包的工作流程。它实现过程自动化,处理需求并设置环境以便于使用软件包。

二、使用ROS2编写自己的一个包

闲话少说,开始从编写一个自己的包开始我们的ROS2的学习。这次我们创建一个简单的talker和chatter的包。

首先,使用如下命令新建一个文件夹:

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src

使用pkg命令(我的上一篇博客有说)创建一个新的包:

ros2 pkg create learn
cd learn/src

然后我们编写代码如下:

/** talker.cpp **/

#include "rclcpp/rclcpp.hpp"
#include <chrono>
#include <std_msgs/msg/string.hpp>
#include <iostream>

using namespace std::chrono_literals;
using namespace std;

class Publisher : public rclcpp::Node{
public:
    Publisher() : 
        Node("publisher"), count_(0)
    {
        publisher_ = this ->create_publisher<std_msgs::msg::String>("topic");
        timer_ = this ->create_wall_timer(500ms, std::bind(&Publisher::timer_callback, this));
    }
private:
    void timer_callback(){
        auto message = std_msgs::msg::String();
        message.data = "Hello World! " + std::to_string(count_++);
        RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());
        publisher_->publish(message);
    }
    rclcpp::TimerBase::SharedPtr timer_;
    rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
    size_t count_;
};

int main(int argc, char* argv[]) {
    rclcpp::init(argc, argv);
    rclcpp::spin(std::make_shared<Publisher>());
    rclcpp::shutdown();
    return 0;
}
/** listener.cpp **/

#include <rclcpp/rclcpp.hpp>
#include <chrono>
#include <std_msgs/msg/string.hpp>

using namespace std::chrono;
using std::placeholders::_1;

class Subscriber : public rclcpp::Node {

public:
    Subscriber() : Node("Subscriber")
    {
        subsciiption_ = this ->create_subscription<std_msgs::msg::String>(
                "/topic", std::bind(&Subscriber::topic_callback, this, _1));
    }

private:
    void topic_callback(const std_msgs::msg::String::SharedPtr msg) {
        RCLCPP_INFO(this->get_logger(), "I heard : '%s'", msg->data.c_str());
    }
    rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subsciiption_;

};

int main(int argc, char* argv[]){
    rclcpp::init(argc, argv);
    rclcpp::spin(std::make_shared<Subscriber>());
    rclcpp::shutdown();
    return 0;
}

然后,再在将CmakeLists.txt如下修改:

cmake_minimum_required(VERSION 3.5)
project(learn)

# Default to C99
if(NOT CMAKE_C_STANDARD)
  set(CMAKE_C_STANDARD 99)
endif()

# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 14)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # remove the line when a copyright and license is present in all source files
  set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # remove the line when this package is a git repo
  set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

add_executable(talker src/talker.cpp)
ament_target_dependencies(talker rclcpp std_msgs)

add_executable(listener src/listener.cpp)
ament_target_dependencies(listener rclcpp std_msgs)

install(TARGETS
  talker
  listener
  DESTINATION lib/${PROJECT_NAME}
)

ament_package()

同时,package.xml 如下:

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format2.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="2">
  <name>learn</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="[email protected]">sad490</maintainer>
  <license>TODO: License declaration</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <build_depend>example_interfaces</build_depend>
  <build_depend>rcl</build_depend>
  <build_depend>rmw_implementation</build_depend>

  <exec_depend>example_interfaces</exec_depend>
  <exec_depend>rcl</exec_depend>
  <exec_depend>rmw_implementation</exec_depend>
  <exec_depend>rosidl_default_runtime</exec_depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

然后,执行如下命令进行编译:

cd ~/ros2_ws
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Debug

(在这一步中,你有可能会发现colcon这个命令无法找到,你可以使用如下命令进行安装。

sudo apt update && sudo apt install -y \
  build-essential \
  cmake \
  git \
  python3-colcon-common-extensions \
  python3-pip \
  python-rosdep \
  python3-vcstool \
  wget
# install some pip packages needed for testing
sudo -H python3 -m pip install -U \
  argcomplete \
  flake8 \
  flake8-blind-except \
  flake8-builtins \
  flake8-class-newline \
  flake8-comprehensions \
  flake8-deprecated \
  flake8-docstrings \
  flake8-import-order \
  flake8-quotes \
  pytest-repeat \
  pytest-rerunfailures
# [Ubuntu 16.04] install extra packages not available or recent enough on Xenial
python3 -m pip install -U \
  pytest \
  pytest-cov \
  pytest-runner \
  setuptools
# install Fast-RTPS dependencies
sudo apt install --no-install-recommends -y \
  libasio-dev \
  libtinyxml2-dev

之后,执行命令:

source ./install/setup.bash
ros2 run learn talker

####### 启动另一个终端 #######
ros2 run learn listener

即可。

至此,你便完成了你的第一个ROS的package。

发布了26 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/sad490/article/details/81461507