【ROS2】パッケージ作成方法
ずっとROSでロボット開発していましたが、ROSのサポートは、Noeticが2025/05まで。ちなみに私が使っているROS Melodicに関しては、2023/06でサポートは終了しています。。。
流石にそろそろROS2にしないと! ということで、ROS→ROS2へ乗り換えようと思います。
ROS2はROSから色々変更が入ったみたいなので、ブログにまとめていきます。
今回は、ROS2で簡単なパッケージを作ってみます。
環境
環境は、vncサーバーで動くROS2 dockerイメージを使いました。
以下コマンドを実行します。(開発PCはiMac macOS Monterey)
docker run -p 6080:80 --security-opt seccomp=unconfined --shm-size=512m tiryoh/ros2-desktop-vnc:humble
コマンド一発でMAC上にROS2の環境ができました。大変便利です!ありがとうございます!
docker-ros2-desktop-vnc
パッケージの作成
パッケージを作ってみます。
まずはワークスペースとソース用のディレクトリを作ります。
mkdir -p ~/ros2_ws/src
ワークスペースを一旦ビルドします。
colcon build
※ROSでは、catkin buildでしたが、ROS2は、colcon buildなんですね。
次にパッケージを作ります。今回テスト用で、”test_package”というパッケージを作ってみます。
以下コマンドを入力します。
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python test_package
上記の後、~/ros2_ws/src配下にtest_packageディレクトリができていました。
中身を確認すると、
・package.xml
・resource
・setup.cfg
・setup.py
・test
・test_package(作成したパッケージ名のディレクトリ)
ができていました。
・package.xml:パッケージのメタデータを記述するファイル
・resource:パッケージのリソースファイルを保持するためのディレクトリ。通常はパッケージ名の空ファイルがここに配置されるようです。
・setup.cfg:Pythonパッケージのメタデータやオプションを記述する。基本はデフォルトのまま使用することが多い。
・setup.py:パッケージのインストール情報。pythonスクリプトを作ったらここのエントリポイントに実行スクリプトを記述するようです。
・test:パッケージのテストコードに関するディレクトリ
おためしPublisherを実装する
さて、では実際にpythonスクリプトを作ってみます。
cd ~/ros2_ws/src/test_package/test_package
vi test_publisher.py
今回は、単純に0.5sec毎に’hello!’を通知するノードを作ってみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
import rclpy from rclpy.node import Node from std_msgs.msg import String class TestPublisher(Node): def __init__(self): super().__init__('test_publisher') self.publisher_ = self.create_publisher(String, 'test_topic', 10) timer_period = 0.5 self.timer = self.create_timer(timer_period, self.timer_callback) def timer_callback(self): msg = String() msg.data = 'hello!' self.publisher_.publish(msg) self.get_logger().info('Publishing: "%s"' % msg.data) def main(args=None): rclpy.init(args=args) test_publisher = TestPublisher() rclpy.spin(test_publisher) test_publisher.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() |
コード解説
7行目のsuper().__init__('ノード名')
で、ノード名を指定します。今回は、’test_publisher’というノード名にしました。
8行目のself.create_publisher
で、String型の’test_topic’、キューサイズ10でトピックの宣言をしています。
10行目のタイマー設定、12行目〜16行目のタイマーコールバックtimer_callback
で、0.5秒毎にトピック送信しています。
メイン処理では、21行目のrclpy.spin(ノード)
で、引数に指定したノードのイベント処理が有効になります。以降、test_publisherのイベント待ちループ処理が実行されます。
ユーザーが終了(Ctrl+C等)すると、ループ処理から抜けて、23行目、24行目の終了処理が実行されます。
Writing a simple publisher and subscriber (Python)
作成したpythonスクリプトを実行するには、setup.pyのentry_pointsに実行スクリプトを追記します。
[setup.py]
entry_points={
'console_scripts': [
'talker = test_package.test_publisher:main',
],
talker = ・・・の箇所は、
のような記載とします。
ビルドします。
cd ~/ros2_ws
colcon build
source install/setup.bash
スクリプト実行
作ったPythonスクリプトを実行してみます。
ros2 run test_package talker
もう1つTerminalを開いて、トピックが通知されているか確認してみます。
ros2 topic echo /test_topic
最後に
以上、ROS2でパッケージを作成し、簡単なPythonスクリプトを実装してみました。
コマンドやライブラリの使い方などはROSと異なりますが、今のところそこまで大きな違いはないようです。
もう少しROS2を色々触ってみてROSとの違いなどいろいろ整理していこうと思います。
それでは!!
スポンサーリンク