LoginSignup
2
3

More than 1 year has passed since last update.

ROS2の勉強 第6弾:actionを使う

Posted at

#プログラミング ROS2< actionを使う >

はじめに

ROS2を難なく扱えるようになることが目的である.その第6弾として,「actionを使う」を扱う.

環境

仮想環境
ソフト VMware Workstation 15
実装RAM 3 GB
OS Ubuntu 64 ビット
isoファイル ubuntu-20.04.3-desktop-amd64.iso
コンピュータ
デバイス MSI
プロセッサ Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz 2.50GHz
実装RAM 8.00 GB (7.89 GB 使用可能)
OS Windows (Windows 10 Home, バージョン:21H1)
ROS2
Distribution foxy

action

概要

actionはserviceとも異なり,serviceのように何かしらの命令を出した後,その命令が完了するまで待たずともフィードバックを得ることができたり,命令を中断したり,新たな命令に切り替えることもできる.そういった点で,ロボットシステムにおいてナビゲーション機能にはactionが多用され,非常に重要なものとなっている.

そのイメージを以下に示す.
Action-SingleActionClient.gif
※引用:Understanding ROS 2 actions (2022/02/01)

今回はturtlesimの中で使われているactionを再現することでactionの使い方に触れる.

プログラム: turtleの姿勢を変える

turtlesimにおけるRotateAbsoluteアクション

まず,actionを使うにあたって,どのようなactionを使うのかということを知っておく必要がある.そこで,turtlesim_nodeを立ち上げた際に用意されるserviceをros2 action list -tで確認した.tタグをつけることで,タイプも一緒に参照することができる.その時の様子を以下に示す.今回の対象を赤丸で示している.

action_name_type.PNG

この/tutlesim/turtle1/rotate_absoluteという名前のactionを使う.どうやら,タイプは/tutlesim/action/RotateAbsoluteというもののようだ.具体的な中身は以下に示す.

action_detail.PNG

---で区切られるが,上から順に,Goal(目標値:命令),Result(結果),Feedback(フィードバック)である.

以降ではこれらの情報を使って,組み立てていく.

カメの姿勢を変えるプログラム
rotateTurtle.py
from argparse import Action
from re import S
import rclpy
from rclpy.node import Node
from rclpy.action import ActionClient
from turtlesim.action import RotateAbsolute

class RotateTurtle(Node):
    def __init__(self):
        super().__init__('rotate_turtle')

        self.action_client = ActionClient(
            self,                               # node 
            RotateAbsolute,                     # action type
            'turtlesim/turtle1/rotate_absolute' # action name to treat
        )

    def send_goal(self, theta):
        goal_msg = RotateAbsolute.Goal()    # prepare RotateAbsolute.Goal() to access the messages
        goal_msg.theta = theta              # set theta value to goal_msg.theta

        self.action_client.wait_for_server()            # wait until action server begins

        self.action_client.send_goal_async(goal_msg)    # send goal Asynchronously

def main(args=None):
    rclpy.init(args=args)

    action_client = RotateTurtle()

    theta = 1.57    # 90 degrees
    action_client.send_goal(theta)

if __name__ == '__main__':
    main()

ビルドの準備

setup.pyの編集

基本的にビルドに関する情報はsetup.pyの中に記述されている.

setup.pyの編集
setup.py
from setuptools import setup

package_name = 'action_lesson'

setup(
    name=package_name,
    version='0.0.0',
    packages=[package_name],
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
    ],
    install_requires=['setuptools'],
    zip_safe=True,
    maintainer='Yuya Shimizu',
    maintainer_email='yuya@example.com',
    description='a package for practice action',
    license='BSD',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
            'rotate = action_lesson.rotateTurtle:main'
        ],
    },
)

ビルド

ビルド
cd ~/ros2_ws
colcon build

実行コマンド

terminal_1
ros2 launch turtlesim_test myTurtlesim.launch.py
terminal_2
ros2 run action1_lesson rotate

実行の様子

action.gif

今回のプログラムはカメをある姿勢にできれば終了というものであるため,アクションのやり取りが一度行われた時点でプログラムは終了している.また,カメの姿勢はソースコード内で1つに決めてしまっている(今回は1.57 rad: およそ90度).

今回はアクションのGoalしか使っていないが,Feedbackを使って,遷移の様子を見ることもできるし,その遷移に応じて何か組み込むこともできる.ここで実装はしないが,GoalResultFeedbackを使いこなせば,より充実したシステムを構築できそうである.

感想

とりあえず,ROS2でも基本的なデータのやり取りに欠かせない,topic, service, actionの使い方を学ぶことができた.ここからは,経験を積む中で技術を磨いて,ROS2を難なく使いこなせるようになっていく必要がある.それのスタートラインに立つことができた.次回からは,turtlebotをシミュレーション上で扱ってカメではなく,ロボットベースでの学習ができればと思う.

参考

  • ロボットプログラミングROS2入門 玉川大学 岡田浩之 著,科学情報出版株式会社

  • Understanding ROS 2 actions

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3