ros 발행자/구독자 ping pong

102 views
Skip to first unread message

JongMin Woo

unread,
Jan 4, 2016, 8:09:10 AM1/4/16
to 한국 ROS 사용자
단순히 publisher, subscriber를 이용해 예제를 작성하려던 도중 문제가 발생해 질문드립니다.

ping 노드           |           pong 노드
"pong"을 받음    |          "ping"을 받음
"ping"을 보냄     |          "pong"을 보냄

이렇게 무한루프를 돌리며 수행 속도를 테스트해보고 싶은데, publish 함수를 메인함수에서 호출하면 노드가 자기 혼자 메시지를 보내고 받는 현상이 나타나 최초 1회만 "ping" 또는 "pong"메시지를 보내는 노드를 만들었는데요,

사진은 ping노드, pong노드만 실행시킨 상태

rqt그래프로 봤을 때 publishe를 1회만 하도록 프로그램을 작성하면 최초 1회만 "pong" 메시지를 보내는 노드는 토픽에 연결되어 있지 않은 형태로 나오지만, 무한반복문을 돌려 계속 publishe 하게 되면 토픽을 정상적으로 전송하는 현상을 볼 수 있었습니다.


1회만 "pong"을 publish 할 경우 위 그림과 같고

while루프를 이용해 무한반복시키면 이렇게 되는데.... 다른부분 수정 없이 if를 while로 바꾸면 실행이 됩니다.

딱 1회만 publish하는 노드는 원래 만들기가 어려운건가요??

이재민

unread,
Jan 4, 2016, 8:32:13 PM1/4/16
to 한국 ROS 사용자
무한 반복이 아니라 2~3회 publish할 경우는 어떤가요?
아마 첫 메시지에서는 ROS Master가 node간의 연결을 제대로 구성하지 못한 것이 아닐까 하는 막연한 생각입니다.

http://wiki.ros.org/Topics 에 따르면 ROS topic의 설계는 익명의 publisher와 subscriber간의 streaming communication을 염두에 두고 만들어졌다고 합니다. 1회의 데이터 전송에는 적절한 처리가 되어있을까 싶습니다.

위 링크의 6장을 참고하시면 ROS Topic의 작동 원리가 나와있습니다. 여기서 보면 XMLRPC로 ROS Master에게
master.registerSubscriber(/subscriber_node, /example_topic, std_msgs/String, http://hostname:1234)
와 같이 연결을 지정하도록 하는 부분이 있습니다. pseudo code일 수도 있습니다만 ROSCPP에도 Master API로 node간 연결을 제어하는 유사한 기능이 있지 않을까 합니다.

반드시 1회만 전송해야 할 경우에는 ROS Service구조를 이용하는 것도 한 방법일 듯 합니다!

이따 시간이 되면 한번 실험해보도록 하겠습니다.

2016년 1월 4일 월요일 오후 10시 9분 10초 UTC+9, JongMin Woo 님의 말:
Reply all
Reply to author
Forward
0 new messages