colcon工具使用

前言

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

colcon相当于ros1中的catkin工具,学过ros1的同学可以辅助理解。

安装colcon工具

sudo apt install python3-colcon-common-extensions

使用colcon构建包

一般情况下在工作空间目录下构建,它会创建与src目录平级的下列目录:

● build目录:是存储中间文件的目录,会为每个软件包在build目录中创建一个子目录,在该子目录中;

● install目录:这是每个软件包将被安装的目录,默认情况下,每个软件包都将会被安装到一个单独的子目录中;

● log目录:该目录包含有关每个colcon调用的各种日志信息;

注:与catkin相比,用colcon构建不生成devel目录

colcon常用构建命令

全部编译

colcon build
#–packages-select 命令
colcon build --packages-select YOUR_PKG_NAME #编译指定包,可以多个
#–packages-ignore 命令
colcon build --packages-ignore YOUR_PKG_NAME #忽略指定包,可以多个
#–continue-on-error 命令
colcon build --continue-on-error #在编译出错之后继续编译其他模块
#–symlink-install 命令
colcon build --symlink-install
#表示编译时如果 install 中文件已经存在于 src 或者 build 文件夹中,就用超链接指向该文件,避免浪费空间,也可以实现同步更新
#–merge-install 命令
colcon build --merge-install
#默认会使用install使用作为所有软件包的安装前缀,而不是 安装库中特定于软件包的子目录;
#如果没有这个选项,每个包都会贡献自己的环境路径,导致环境变量特别长;使用此选项,环境变量更短;
#–parallel-workers 命令
colcon build --parallel-workers NUMBER
#要并行处理的最大作业数, 默认值是逻辑 CPU 内核数
#–cmake-args 命令
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release #表示传入cmake编译选项参数

使用ROS2编写自己的一个包

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

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

使用pkg命令创建一个新的包:

ros2 pkg create learn
cd learn/src

编写代码如下:

/** talker.cpp **/
 
#include "rclcpp/rclcpp.hpp"
#include 
#include 
#include 
 
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 
#include 
#include 
 
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( 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
source ./install/setup.bash
ros2 run learn talker
 
####### 启动另一个终端 #######
ros2 run learn listener

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

参考自这里:添加链接描述

你可能感兴趣的:(ROS2,linux,python,服务器)