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
河田 卓志
마츠다 아키히로, 후쿠지 마사키, 유타니 테츠오
오일러리 재팬 발행
Reference
이 문제에 관하여(ROS 공부 제6탄: 기초적인 액션 서버 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Yuya-Shimizu/items/fb5cb4bb40e145426e5a
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#! /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() #ループに入り,到着すべきゴールが送られるのを待つ
Reference
이 문제에 관하여(ROS 공부 제6탄: 기초적인 액션 서버 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Yuya-Shimizu/items/fb5cb4bb40e145426e5a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)