ROS2プログラミング入門 #2 Hello world

13452 ワード

この記事では、ROS2プログラミングで Hello world する流れを紹介します。

準備

Foxy Fitzroyの Configuring your ROS 2 environment を確認しつつ、ROS2の環境を準備します。

はじめに、次の一行を ~/.bashrc の最後に追記してターミナルを再起動します。[1]

source /opt/ros/foxy/setup.bash

そしてターミナルで printenv | grep -i ROS を実行すると、次のように表示されるはずです。

ROS_VERSION=2
ROS_PYTHON_VERSION=3
中略
ROS_DISTRO=foxy

最低限の準備としてはこれで良いのですが、さらに ros2 コマンドのタブキー補完を助けてくれるパッケージもインストールしておきます。ここでもターミナルを再起動します。

sudo apt install python3-argcomplete

パッケージを作ってビルドする

ROS2のパッケージは、他のプログラミング環境でいうプロジェクトみたいなものだと思います。

準備もできましたし Creating your first ROS 2 package を参考に ros2 コマンドでパッケージを作成し、ビルドしてみます。

パッケージの作成

コマンドは次のような感じです。パッケージは ~/dev_ws/src/ に作成されます。

mkdir -p ~/dev_ws/src
cd ~/dev_ws/src/
ros2 pkg create --build-type ament_cmake my_first_package

パッケージのビルド

ROS2では colcon コマンドでビルドを実行します。

colcon コマンドがインストールされていない場合は、次のようにインストールします。

sudo apt install python3-colcon-common-extensions

パッケージをビルドする時は ~/dev_ws ディレクトリで colcon build を実行します。次のように実行すると楽かも知れません。

(cd ~/dev_ws/ && colcon build)

ちなみに、ビルドに成功するとトップバーに通知が出るみたいです。

colcon build successful
ビルドに成功してトップバーに通知が出る様子

機能は特にありませんけれど、ここまでで、ひとまずパッケージを作成してビルドできることが確認できました。

Hello world

それではいよいよ Hello world に取り組みましょう。

hello.cpp

まず、パッケージルートの src ディレクトリに、次の内容で hello.cpp を作ります。

#include "rclcpp/rclcpp.hpp"

int main(int argc, char** argv) {
    rclcpp::init(argc, argv);

    auto node = rclcpp::Node::make_shared("hello");
    RCLCPP_INFO(node->get_logger(), "Hello, ROS2 world!");

    rclcpp::shutdown();
    return 0;
}

CMakeLists.txt

続けて、パッケージルートの CMakeLists.txt を編集します。

なお ros2 pkg create で生成した元々の CMakeLists.txt にはコメントがついていますが、次に示すのはコメントを消したものです。

cmake_minimum_required(VERSION 3.5)
project(my_first_package)

if(NOT CMAKE_C_STANDARD)
  set(CMAKE_C_STANDARD 99)
endif()

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_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)

add_executable(hello src/hello.cpp)
ament_target_dependencies(hello rclcpp)
install(TARGETS hello DESTINATION lib/${PROJECT_NAME})

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  ament_lint_auto_find_test_dependencies()
endif()

ament_package()

変更内容としては次の行を追加しました。

+ find_package(rclcpp REQUIRED)
+
+ add_executable(hello src/hello.cpp)
+ ament_target_dependencies(hello rclcpp)
+ install(TARGETS hello DESTINATION lib/${PROJECT_NAME})

これでソースファイル hello.cpp から実行ファイル hello がビルドできるようになります。

動作確認

(cd ~/dev_ws/ && colcon build) を実行してビルドしましょう。

なお hello を実行する前に ~/dev_ws/ で次のコマンドを実行しておく必要があります。

. install/setup.bash

最後に、次のコマンドを実行して

ros2 run my_first_package hello

下記のような感じで表示されれば Hello world は成功です。

helloを実行した様子
helloを実行した様子

おわりに

ROS2プログラミングで Hello world する流れを紹介しました。どなたかのお役に立てば幸いです。

脚注
  1. あるいは source ~/.bashrc でも設定変更は反映されると思います。 ↩︎