colcon是一个命令行工具,用于改进编译,测试和使用多个软件包的工作流程。它实现过程自动化,处理需求并设置环境以便于使用软件包。。ROS2默认是没有安装colcon的。
colcon相当于ros1中的catkin工具,学过ros1的同学可以辅助理解。
sudo apt install python3-colcon-common-extensions
一般情况下在工作空间目录下构建,它会创建与src目录平级的下列目录:
● build目录:是存储中间文件的目录,会为每个软件包在build目录中创建一个子目录,在该子目录中;
● install目录:这是每个软件包将被安装的目录,默认情况下,每个软件包都将会被安装到一个单独的子目录中;
● log目录:该目录包含有关每个colcon调用的各种日志信息;
注:与catkin相比,用colcon构建不生成devel目录
全部编译
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编译选项参数
首先,使用如下命令新建一个文件夹:
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。
参考自这里:添加链接描述