概要
ROS2でのC++ノードの最小構成を備忘録的に残しておきます。
ワークスペースの構成とファイルの中身
ワークスペース(ros2_workspace
)を作成してその中にパッケージ1つ(my_package
)とノード1つ(my_node
)を作成します。
フォルダ構成
ros2_workspace
└── src/
└── my_package/
├── include/
│ └── my_package/
│ └── my_node.hpp
├── src/
│ └── my_node.cpp
├── CMakeLists.txt
└── package.xml
my_node.hpp
#pragma once
#include "rclcpp/rclcpp.hpp"
namespace my_package
{
class MyNode : public rclcpp::Node
{
public:
MyNode();
};
} // namespace my_package
my_node.cpp
#include "my_package/my_node.hpp"
namespace my_package
{
MyNode::MyNode()
: Node("my_node")
{
RCLCPP_INFO(this->get_logger(), "MyNode has been started");
}
} // namespace my_package
int main(int argc, char** argv)
{
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<my_package::MyNode>());
rclcpp::shutdown();
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.8)
project(my_package)
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)
include_directories(include)
add_executable(my_node src/my_node.cpp)
ament_target_dependencies(my_node rclcpp)
install(TARGETS my_node
DESTINATION lib/${PROJECT_NAME}
)
ament_package()
package.xml
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>my_package</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="email@email.com">my_pc</maintainer>
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<depend>rclcpp</depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
ビルドと実行
以下のコマンドをワークスペース直下で順に実行すれば、MyNode has been started
のメッセージが表示されるはずです。
colcon build
source install/setup.bash
ros2 run my_package my_node
まとめ
今回はROS2でのC++ノードの最小構成を備忘録的に書いてみました。
僕自身も勉強途中なため、ベストプラクティスでないと思いますが、誰かの役に立てば幸いです。
また、他に良い方法を知っている方がいれば、教えていただけると幸いです。