ROS 공부 제1탄:topic의 전달과 구독

#프로그래밍 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
                   河田 卓志
         마츠다 아키히로, 후쿠지 마사키, 유타니 테츠오
               오일러리 재팬 발행

좋은 웹페이지 즐겨찾기