ROS 공부 제1탄:topic의 전달과 구독
6343 단어 SubscriberROS파이썬Publishertopic
#프로그래밍 ROS< topic 배포 및 구독 >
소개
드디어 ROS의 공부에도 본허를 넣어 간다. 하나의 참고서에 따라 ROS(Robot Operating System)를 어려움 없이 다루는 것이 목적이다. 이미 이미, 지금까지도 공부는 해 왔고, 간단한 곳은 조금 이해하고 있지만, 여기서는 다시 처음부터 배우고, 복습도 겸하면서 학습을 진행해 나가기로 한다.
환경
가상 환경
소프트
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
topic
주제 (topic) : 노드간에 통신하는 가장 일반적인 방법
다양한 노드에 데이터가 분산되는 분산 시스템에서 데이터 교환에 자주 사용되는 분배/구독 (publish/subscribe) 유형의 통신 메커니즘을 구현합니다.
<흐름>
[step1] 게시 : 주제 이름과 메시지의 유형을 발표합니다.
[step2] 배달 : 노드가 주제에 실제 데이터를 추가하여 전송합니다.
[step3] 구독 : roscore에게 요청하고 특정 주제의 메시지를받습니다.
topic 배달
공개 항목은 제공되지 않지만 배포 프로그램에서 공개됩니다. 아래에 소스 코드가 나와 있습니다.
topic_publisher.py#! /usr/bin/env python3
import rospy #ROSに必要な基本的な機能を読み込む
from std_msgs.msg import Int32 #トピックに送るメッセージの定義を読み込む
rospy.init_node('topic_publisher') #'topic_publisher'という名前でノードを新規作成(初期化)
pub = rospy.Publisher('counter', Int32) #'counter'という名前で,送るメッセージの型をInt32に設定 ←公開
#####ここまでで,トピックは公開される.以下はトピックを使って送るメッセージについて
rate = rospy.Rate(2) #2Hz(1秒間に2回)でメッセージを送る
count = 0 #送るメッセージを格納する変数
while not rospy.is_shutdown():
pub.publish(count)
count += 1 #毎回1増やす(カウント)
rate.sleep() #指定したrate(いまは2Hz)で実行されるために十分な時間をスリープする
이 시점에서 실제로 전달할 수 있는지 여부는 rostopic list
또한 rostopic echo /トピック名
라고하면 실제로 보내는 메시지가 터미널 (단말기)에서 볼 수 있습니다.
이런 느낌이다. 주의점은, topic_publisher.py
를 실행시에는, roscore
를 다른 터미널(단말)로 입력해, 시작해 둘 필요가 있다. 중개인이 필요하다.
topic 구독
이전 단계에서 수동으로 배달 메시지를 볼 수 있지만 배달 된 메시지의 데이터를 처리하려면 구독해야합니다. 아래에 소스 코드가 나와 있습니다.
topic_subscriber.py#! /usr/bin/env python3
import rospy #ROSに必要な基本的な機能を読み込む
from std_msgs.msg import Int32 #トピックに送るメッセージの定義を読み込む
def callback(msg):
""" callback関数:購読するときに実行させる関数
引数にmsgとあるが,関数を指定するときは特に引数を渡すことはない.
自動的に購読対象を引数とする.
"""
print(msg.data) #購読したメッセージのdataという変数に格納されているものを表示
rospy.init_node('topic_subscriber') #'topic_subscriber'という名前でノードを新規作成(初期化)
sub = rospy.Subscriber('counter', Int32, callback) #'counter', Int32のトピックを購読し,実行させる関数をcallbackに設定
rospy.spin() #継続して処理をさせる.while not is_shutdown()のショートカットといえる
roscore
, topic_publisher.py
를 실행하는 동안 topic_subscriber.py
를 실행합니다. 이 때 topic_subscriber.py
를 실행하는 터미널 (단말)은 다음과 같습니다.
확실히, 그 소코드로 나타낸 지시대로, 1씩 카운트되고 있는 것을 알 수 있다.
감상
ROS는 여러 번 독학했지만 잘 정리되지 않았습니다. 이번부터, 여기서 정리해 나가는 것으로 정리할 수 있으면 좋겠다. ROS는 편리한 툴인 분, 참고서도 두껍고 앞은 길 것 같지만, 1~2개월로 이 참고서 1권을 끝내고 싶은 추억으로 간다.
참고문헌
프로그래밍 ROS Python으로 로봇 애플리케이션 개발
Morgan Quigley, Brian Gerkey, William D.Smart
河田 卓志
마츠다 아키히로, 후쿠지 마사키, 유타니 테츠오
오일러리 재팬 발행
Reference
이 문제에 관하여(ROS 공부 제1탄:topic의 전달과 구독), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Yuya-Shimizu/items/4e6a7c26110ce99886c9
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#! /usr/bin/env python3
import rospy #ROSに必要な基本的な機能を読み込む
from std_msgs.msg import Int32 #トピックに送るメッセージの定義を読み込む
rospy.init_node('topic_publisher') #'topic_publisher'という名前でノードを新規作成(初期化)
pub = rospy.Publisher('counter', Int32) #'counter'という名前で,送るメッセージの型をInt32に設定 ←公開
#####ここまでで,トピックは公開される.以下はトピックを使って送るメッセージについて
rate = rospy.Rate(2) #2Hz(1秒間に2回)でメッセージを送る
count = 0 #送るメッセージを格納する変数
while not rospy.is_shutdown():
pub.publish(count)
count += 1 #毎回1増やす(カウント)
rate.sleep() #指定したrate(いまは2Hz)で実行されるために十分な時間をスリープする
#! /usr/bin/env python3
import rospy #ROSに必要な基本的な機能を読み込む
from std_msgs.msg import Int32 #トピックに送るメッセージの定義を読み込む
def callback(msg):
""" callback関数:購読するときに実行させる関数
引数にmsgとあるが,関数を指定するときは特に引数を渡すことはない.
自動的に購読対象を引数とする.
"""
print(msg.data) #購読したメッセージのdataという変数に格納されているものを表示
rospy.init_node('topic_subscriber') #'topic_subscriber'という名前でノードを新規作成(初期化)
sub = rospy.Subscriber('counter', Int32, callback) #'counter', Int32のトピックを購読し,実行させる関数をcallbackに設定
rospy.spin() #継続して処理をさせる.while not is_shutdown()のショートカットといえる
Reference
이 문제에 관하여(ROS 공부 제1탄:topic의 전달과 구독), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Yuya-Shimizu/items/4e6a7c26110ce99886c9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)