見出し画像

ROS入門 (9) - ROS2のパッケージの作成

ROS2のパッケージの作成についてまとめました。

・Galactic

前回

1. ワークスペースのセットアップ

colcon」のワークスペースを作成します。「colcon」は、ROSのビルドシステムで、ROSのソースコードを実行ファイルに変換します。

(1) ワークスペースのフォルダを作成し移動。
今回は、「~/colcon_ws」をワークスペースのフォルダとします。「src」フォルダも初期化時に必要なので、同時に作成しています。

$ mkdir -p ~/colcon_ws/src
$ cd ~/colcon_ws

(2) ワークスペースのビルド。

$ colcon build

「colcon_wsフォルダ」直下に、以下のファイル群が生成されています。

・build
・install
・log
・src

(3) ワークスペースのセットアップ。
ワークスペースのパッケージの最新状態をROSシステムに反映します。

$ source ~/colcon_ws/install/setup.bash

ターミナルを開くたびに必要になるため、「~/.bashrc」にも追加します。

2. パッケージの作成

(1) 「~/colcon_ws/src」に移動し、「hello」という名前のパッケージを作成。
今回は、Pythonで開発したいので「ament_python」を指定します。

$ cd ~/colcon_ws/src
$ ros2 pkg create --build-type ament_python hello

以下のファイルとフォルダが生成されています。

・colcon_ws
 ・src
  ・hello
   ・package.xml

   ・setup.cfg
   ・setup.py
   ・hello
   ・resource
   ・test

(2) 「setup.py」を以下のように編集。

・entry_points
利用するPythonスクリプト名を指定します。

from setuptools import setup
package_name = "hello"
setup(
       :
    entry_points={
        "console_scripts": [
            "hello_node = hello.hello_node:main",
        ],
    },
)

"<ノード名> = <パッケージ名>.<Pythonスクリプト名>:main"

3. ソースコードの作成

(1) 「~/colcon_ws/src/hello/hello/hello_node.py」を作成し、以下のように編集。

・hello_node.py

import rclpy
from rclpy.node import Node

# メイン
def main():
    # ROS通信の初期化
    rclpy.init()
    
    # ノードの生成   
    node = Node("hello_node")
    
    # ログ出力
    print("Hello World!")

    # ノード終了の待機
    rclpy.spin(node)
    
    # ROS通信のシャットダウン
    rclpy.shutdown()

if __name__ == "__main__":
   main()

(2) ワークスペースのビルド。

$ cd ~/colcon_ws
$ colcon build

(3) ワークスペースのセットアップ。
ワークスペースのセットアップはビルド毎にも必要になります。

$ source ~/colcon_ws/install/setup.bash

4. 実行

(1) 「ros2 run <パッケージ名> <ノード名>」の実行。
「Hello World!」と表示されます。

$ ros2 run hello hello_node
Hello World!

5. 参考

【おまけ】 APIリファレンス

APIリファレンスは、以下で参照できます。

【おまけ】 DockerコンテナにPCのフォルダをマウント

DockerコンテナにPCのフォルダをマウントすることで、PC上でVSCodeなど使ってソースコードを編集できるようになります。

Dockerコンテナの「/home/ubuntu/colcon_ws」にPCの「~/ros2_ws」をマウントする手順は、次のとおりです。

(1) PCで「~/ros2_ws」フォルダを作成。
(2) 以下のコマンドでDockerコンテナを起動。

$ docker run -v ~/ros2_ws:/home/ubuntu/colcon_ws:cached -p 6080:80 --shm-size=1024m tiryoh/ros2-desktop-vnc:galactic

【おまけ】 パッケージ登録されたことの確認

「hello」パッケージが登録されるため、「ros2 pkg list」で確認したり、「cd `ros2 pkg prefix --share hello`」でフォルダ移動したりできます。

$ ros2 pkg list
action_msgs
action_tutorials_cpp
   :
hello
   :
$ cd `ros2 pkg prefix --share hello`
$ pwd
/home/ubuntu/colcon_ws/install/hello/share/hello

【おまけ】 ROSプログラムのライフサイクル

ROSプログラムのライフサイクルは、次のとおりです。

(1) 初期化
(2) 1つ以上のノードの作成
(3) ノードコールバックの処理
(4) シャットダウン

初期化はrclpy.init()で行います。これは、ノードを作成する前に実行する必要があります。ノードの作成は、create_node()か、Nodeのインスタンス化で行います。このノードを使用して、トピック、サービス、アクションなどの通信を行います。シャットダウンはrclpy.shutdown()で行います。

次回



この記事が気に入ったらサポートをしてみませんか?