ROS의 공부 제3탄:배달자와 구독자의 혼합

# 프로그래밍 ROS < 배달자와 구독자 혼합 >



소개



하나의 참고서에 따라 ROS(Robot Operating System)를 어려움 없이 다루는 것이 목적이다. 다시 처음부터 배우고, 복습도 겸하면서 학습을 진행해 나가기로 한다. 제 3 탄으로서 배달자와 구독자의 혼합을 다룬다.

환경



가상 환경





소프트
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


배달자와 구독자의 혼합이란?



말 그대로, 하나의 노드에 전달자와 구독자의 기능을 갖게하는 것이다. 단일 파일 내에서 배포자와 구독자 코드를 작성할 수 있습니다. 따라서 ROS는 하나의 노드에서 여러 배달과 구독을 수행 할 수 있습니다.

어떤 시점에 하나의 노드에 배달자와 구독자의 기능을 갖게 할 것인가?



데이터에 어떠한 처리를 더해 변환할 때 등.
예를 들어 카메라의 이미지가 포함 된 주제를 구독하여 이미지에서 얼굴을 감지하고 얼굴의 위치를 ​​다른 주제로 전달할 수 있습니다. 이 경우 "구독"하고 "배달"합니다.

구현



여기서 우리는 숫자를 얻었을 때 그것을 두 배로 한 값을 전달하는 예제를 다룹니다. 아래에 소스 코드가 나와 있습니다.

소스 코드

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

import rospy

from std_msgs.msg import Int32

rospy.init_node('doubler')  #doublerという名前でノード作成

def callback(msg):
    """ データ変換のように,新たなデータを受け取ったときのみに変換するために,この関数内で配信する """
    doubled = Int32()           #データにアクセスするためにインスタンス作成
    doubled.data = msg.data * 2 #受け取ったデータを2倍にする
    pub.publish(doubled)        #callback関数実行するときのみ配信

sub = rospy.Subscriber('number', Int32, callback)           #numberというトピックを購読
pub = rospy.Publisher('doubled', Int32, queue_size = 10)    #配信準備

rospy.spin()

아래에 프로그램을 실행 한 후, 현재 취급되고있는 주제를 rostopic list에 의해 표시시킨 터미널 (단말)을 나타낸다.

확실히 /doubled, /number의 두 가지가 다루어지고있다. 여기서 전자는 배포이고 후자는 구독 대상입니다. 여기서는 구독 대상으로 rostopic pub를 사용하여 값을 입력하고 그 때의 출력을 살펴 보겠습니다. 이하에 3개의 터미널(단말)을 나타낸다. 위에서부터 순서대로 "프로그램 실행", "구독 대상에 값 입력"및 "배포 정보 관찰"입니다.

2, 3이 입력되면 4, 6이 전달되었음을 알 수 있습니다. 그러나 입력하지 않으면 배달되지 않습니다. 왜냐하면 위의 소스 코드에서 publish()callback()에 있고 Subscriber()가 움직일 때마다 전달하기 때문입니다. 이것은, 이 노드의 목적이 데이터 변환하는 (여기에서는, 구독하고 있는 토픽으로부터 온 수를 2배로 하는) 것이므로, 새로운 데이터가 들어왔을 때만 데이터를 전달하고 싶다고 하는 생각이 배경 에 있다.

감상



이번에는 주제 학습이 끝났습니다. 마지막으로 혼합에 의한 데이터 변환을 배웠지만, 정확히 라디오 컨트롤 등에서 PS4의 컨트롤러를 사용할 때 joy에서 얻은 데이터를 cmd_vel 을 사용하면 좋을까와 힌트를 얻을 수 있다고 생각한다. 실제로 해보지만, 그 결과는 또 따로 정리하는 것으로 한다.

참고문헌



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

좋은 웹페이지 즐겨찾기