ROS 공부 제6탄: 기초적인 액션 서버 구현

# 프로그래밍 ROS < 기본 액션 서버 구현 >



소개



하나의 참고서에 따라 ROS(Robot Operating System)를 어려움 없이 다루는 것이 목적이다. 제 6 탄으로서 기본적인 액션 서버의 구현을 다룬다.

환경



가상 환경





소프트
VMware Workstation 15

실장 RAM
2GB

OS
우분투 64비트

ISO 파일
ubuntu-mate-20.04.1-desktop-amd64.iso



컴퓨터





장치
MSI

프로세서
Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz 2.50GHz

실장 RAM
8.00GB(7.89GB 사용 가능)

OS
Windows (Windows 10 Home, 버전: 1909)



ROS





Distribution
noetic

프로그래밍 언어
파이썬 3.8.5


구현



이전 (htps : // 코 m / 유야 시미즈 / ms / 778774b30에 5c75820 아 81)에 정의 된 액션을 사용하여 타이머 기능이있는 액션 서버의 구현을 통해 기초 부분을 학습합니다. 아래에 소스 코드가 나와 있습니다. 소스 코드 내에서 프로그램 설명은 자세히 설명되어 있습니다.

소스 코드

action_simple_server.py
#! /usr/bin/env python3

import rospy

import time         #タイマー作成時に必要となる
import actionlib    #SimpleActionServerクラスを提供 → アクションのサーバ作成に必要と解釈
from action_lesson.msg import TimerAction, TimerGoal, TimerResult   #Timer.actionファイルから自動生成したメッセージクラスで必要なものを読み込む


def do_timer(goal):
    """新しいゴール(目標)を受け取ったときに呼び出される関数"""

    start_time = time.time()
    time.sleep(goal.time_to_wait.to_sec())  #アクションファイルで定義したtime_to_waitはdurationであるため秒数変換する→to_sec()関数
    result = TimerResult()  #TimerResultの型のリザルトメッセージ(result)を作成 ←これを作成しないと,定義ファイル内のリザルトの部分にアクセスできない
    result.time_elapsed = rospy.Duration.from_sec(time.time() - start_time) #「現在時刻-開始時刻」をDuration(ROSで扱う期間)に変換してtime_elapsedフィールドに代入
    result.updates_sent = 0     #今回は0として,更新回数は考えないこととする.
    server.set_succeeded(result)    #resultを引数として,set_succeeded()関数を呼び出すことで,SimpleActionServerにゴールしたことを伝える.



rospy.init_node('timer_action_server')  #ノードの初期化

server = actionlib.SimpleActionServer('timer', TimerAction, do_timer, False)    #'timer'という名で,TimerActionというアクションの型 do_timerを実行.サーバの自動起動を無効にするためFalseを指定

server.start()  #サーバ生成後,明示的にサーバを開始する

rospy.spin()    #ループに入り,到着すべきゴールが送られるのを待つ

결과



위의 소스 코드를 실행 한 후 동작 확인은 터미널 (단말기)에서 수행되었습니다. 그 상태를 이하에 나타낸다.
/timer에 관한 것이 5 가지 움직임을 알 수 있습니다. 어떤 것이 어떤 역할을 하는지는 이름에서 알 수 있다. 이 주제는이 작업을 관리하는 데 내부적으로 사용되는 주제 인 것 같습니다. 예를 들어, /timer/goal에 대해 조금 더 자세히 살펴 보겠습니다. 그 상태를 이하에 나타낸다.

위 그림과 같은 결과를 얻었습니다. 유형이 action_lesson/TimerActionGoal이고 배달자가 없으며 구독자가 /timer_action_server라고 가정합니다. 적선에서도 강조했지만 TimerActionGoal 라는 것은 모른다. 따라서 더 자세히 살펴 보겠습니다. 그 상태를 이하에 나타낸다.

위 그림의 빨간색으로 표시된 것은 확실히 정의했지만, 그 이외는 분명히 자동으로 추가되어 있습니다. 이러한 필드는 액션 서버와 클라이언트간에 일어나는 일을 관리하는 데 내부적으로 사용되는 것 같습니다. 그러나 실제로 사용자가받는 것은 다음과 같은 부분입니다.

즉, 관리를위한 정보는 수신시 자동으로 삭제됩니다. 일반적으로 유형 이름에 Action이있는 자동 생성 메시지에 액세스 할 필요는 없으며 Goal, Result 및 Feedback 메시지로 충분합니다.

감상



액션을 정의 할 때 자동으로 생성 된 것이 있다는 것을 알고 있었지만 그 역할까지는 몰랐다. 특히 사용하지는 않지만 관리에 사용되고 있다는 것을 알아 두면 좋다고 배웠다. 이번에는 액션 서버의 구현만으로 사용까지는 실시하지 않았지만, 다음 번은 실제로 사용하여 더 이해를 깊게 할 것으로 기대한다.

참고문헌



프로그래밍 ROS Python으로 로봇 애플리케이션 개발
      Morgan Quigley, Brian Gerkey, William D.Smart
                   河田 卓志
         마츠다 아키히로, 후쿠지 마사키, 유타니 테츠오
               오일러리 재팬 발행

좋은 웹페이지 즐겨찾기