머신러닝

본문 바로가기
사이트 내 전체검색


머신러닝
머신러닝

2. 구독, 발행, 토픽 개요

페이지 정보

작성자 관리자 댓글 0건 조회 1,105회 작성일 21-01-12 18:22

본문

2. 구독, 발행, 토픽 개요

1. 토픽


토픽 메시지 통신은 정보를 송신하는 발행자와 수신하는 구독자가 정보를 송수신하는 형태입니다. 

토픽을 수신하기 원하는 구독자는 마스터로부터 등록되어 있는 토픽이름 에 해당하는 발행자 노드와 직접 연결을 합니다. 

연결된 이후에는 발행자가 송신하는 메시지를 수신합니다. 

토픽은 비동기식 단방향 통신으로 연속적으로 여러 개의 토픽을 송신할 수 있습니다. 

따라서 주기적으로 확인을 해야하는 센서 데이터등을 다룰 때 더 적합합니다. 

발행자는 여러 개의 토픽을 동시에 발행할 수 있고 여러 개의 구독자 노드에 한번에 전달이 가능합니다. 

구독자는 한 개의 발행자의 토픽만 수신하는 것이 아닌 마스터 노드에 등록되어 있는 토픽정보들 중 원하는 토픽의 개수만큼 수신이 가능합니다.


1.PNG





2. 발행자 노드


간단한 노드를 생성하여 토픽을 발행하고 구독하는 실습을 진행해보도록 하겠습니다.

time 라이브러리를 이용해 시간 데이터를 발행하는 파이썬 프로그램를 작성합니다. 

다음 명령어로 publisher.py라는 새로운 파이썬 파일을 생성합니다.


root@holdings:~# cd ros

root@holdings:~/ros# vi publisher.py

import time
import rospy
from std_msgs.msg import Float64
rospy.init_node('Timer')

pub = rospy.Publisher('time', Float64, queue_size=10)
rate = rospy.Rate(10)
while not rospy.is_shutdown():
    nowtime = time.time()
    rospy.loginfo(nowtime)
    pub.publish(nowtime)
    rate.sleep()

현재 프로세스를 'Timer'라는 이름의 노드로 등록합니다.

rospy.Publisher 메소드로 'time'이라는 토픽을 가진 Float64 타입 메시지를 발행하는 객체를 생성합니다.

메시지 발행 주기를 초당 10 회로 설정합니다. 

time.time() 메소드로 현재 시간을 얻어 메시지를 발행하고 다음 주기가 올 때까지 sleep 하는 과정을 ROS Core 가 꺼질 때까지 반복합니다. 

또, ropy.loginfo() 메소드로 메시지 발행 결과를 기록합니다.


작성한 발행 노드가 정상적으로 실행되는지 확인하기 위해서는 우선 마스터가 실행되어 있어야 합니다. 

마스터 실행은 roscore 명령을 통해 실행할 수 있습니다. 

첫번째 터미널에서 roscore 를 입력합니다.


root@holdings:~# roscore

... logging to /root/.ros/log/91c72442-54b3-11eb-be2e-000000000001/roslaunch-holdings-31461.log

Checking log directory for disk usage. This may take a while.

Press Ctrl-C to interrupt

Done checking log file disk usage. Usage is <1GB.


started roslaunch server http://holdings:33111/

ros_comm version 1.14.7



SUMMARY

========


PARAMETERS

 * /rosdistro: melodic

 * /rosversion: 1.14.7


NODES


auto-starting new master

process[master]: started with pid [31499]

ROS_MASTER_URI=http://holdings:11311/


setting /run_id to 91c72442-54b3-11eb-be2e-000000000001

process[rosout-1]: started with pid [31513]

started core service [/rosout]



두번째 터미널에서 노드를 실행합니다.

노드의 실행은 다음과 같이 입력하면 됩니다. 

실행하고 나면 'Timer' 노드가 실행되고 'time' 이라는 토픽이 등록됩니다.


root@holdings:~/ros# python3 publisher.py

[INFO] [1610442654.354594]: 1610442654.3542051

[INFO] [1610442654.454477]: 1610442654.4541175

[INFO] [1610442654.554491]: 1610442654.554133

[INFO] [1610442654.654502]: 1610442654.6541293

[INFO] [1610442654.754528]: 1610442654.7541473



세번째 터미널을 열고 토픽정보를 확인합니다.

rostopic 명령을 통해 확인이 가능합니다. 
rostopic list 를 입력하면 현재 ROS 에서 등록되어있는 토픽의 정보를 한번에 출력해 볼 수 있습니다.

root@holdings:~# rostopic list
/rosout
/rosout_agg
/time


rostopic 명령을 통해 토픽의 내용을 확인해보고 싶다면 rostopic echo 를 입력하면 됩니다. 
토픽의 명칭을 함께 입력하면 발행되는 토픽의 데이터를 확인할 수 있습니다.

root@holdings:~# rostopic echo /time
---
data: 1610442809.15
---
data: 1610442809.25
---
data: 1610442809.35


3. 구독자 노드

'time'이라는 토픽을 구독하여 메시지가 발행되면 읽기 쉬운 형태로 변환하여 출력하는 파이썬 프로그램을 작성합니다. 
다음 명령어로 'subscriber.py'라는 새로운 파이썬 파일을 생성합니다.

root@holdings:~/ros# vi subscriber.py
import time
import rospy
from std_msgs.msg import Float64
rospy.init_node('Clock')

def callback_msg(data):
        gmtime = time.gmtime(data.data)
        asctime = time.asctime(gmtime)
        print(asctime)

rospy.Subscriber('time', Float64, callback_msg)
rospy.spin()


현재 프로세스를 'Clock'이라는 이름의 노드로 등록합니다.
메시지를 발행 받았을 때 Callback 함수로 처리하므로 데이터 처리 내용을 함수로 선언합니다. 
time.gmtime() 메소드로 연월일 시분초로 구별하는 객체로 변환하고, time.asctime() 메소드로 읽기 편한 텍스트로 변환하여 출력합니다.
rospy.Subscriber 메소드로 'time'이라는 토픽을 가진 Float64 타입 메시지를 구독하고 메시지를 받으면 callback_msg 함수를 호출하는 객체를 생성합니다.
또, rospy.spin() 메소드로 프로세스가 종료되지 않고 메시지 발행을 대기하도록 합니다.

구독자 노드인 subscriber.py 를 실행하여 결과를 확인합니다.

root@holdings:~/ros# python3 subscriber.py

Tue Jan 12 09:21:49 2021
Tue Jan 12 09:21:49 2021
Tue Jan 12 09:21:49 2021
Tue Jan 12 09:21:49 2021
Tue Jan 12 09:21:49 2021
Tue Jan 12 09:21:50 2021
Tue Jan 12 09:21:50 2021
Tue Jan 12 09:21:50 2021
Tue Jan 12 09:21:50 2021

발행자 프로그램을 실행한 커널에서 현재 시간을 0.1 초 간격으로 발행한다는 정보가 출력되고, 구독자 프로그램을 실행한 커널에서 0.1 초 간격으로 메시지를 받아 '요일 월 일 시:분:초 연도' 형태로 출력하는 것을 확인할 수 있습니다.

 

댓글목록

등록된 댓글이 없습니다.


개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.