본문 바로가기

Robot/Robot Program - ROS

ROS의 node와 topic을 예제를 통해 알아볼까?

이제 ROS는 2.0이 나온다고 하는데, 저는 아직도 Kinetic 버전에 머물러 있네요^^. 뭐 그래도 ROS는 ROS죠^^. 항상 누가 만들어 준걸 데리고 놀기만 하다가, 정신차리고, 오늘은 조금 건설적인 글을 올릴려고 합니다. 아~ 그나저나, ROSCON 2019가 마카오에서 열리네요. 전 마카오도 꽤 좋아하는데ㅠㅠ. PinkWink의 마카오 글~~ 에휴.. 회사에서 안 보내줄 것 같습니다.ㅠㅠ 아무튼, 오늘 이야기는 node와 topic의 이야기입니다. 뭘까요^^ 그냥 예제로 보는 노드와 토픽 관련 이야기입니다.^^

일단 터미널을 미리 준비해 줄까요^^ 위 터미널은 terminator라고 하는 건데, 전 꽤 유용하게 사용하고 있답니다. CTRL+SHIFT+O,E로 수평/수직으로 화면을 분할해서 사용할 수 있습니다.

아무튼 그리고나서, 제일 구석에 roscore를 실행합니다.

그리고 오늘의 예제인 거북이를 rosrun turtlesim turtlesim_node로 실행합니다. 그러면 저렇게 거북이가 나타납니다.~

이제 하나더 실행해 두겠습니다~~~ rosrun turtlesim turtle_teleop_key입니다. 이건 위에 설명이 있지만, 키보드의 화살표키로 거북이를 움직이는 겁니다.

또 하나의 터미널에서 rqt_graph로 현재 node/topic 상황을 그래픽하게 관찰하도록 하겠습니다. rqt_graph의 RosGraph는 실시간으로 반영되는 건 아니라서 필요할때, refresh를 눌러주어야 합니다.

이제 여기까지 하고, rostopic list 명령으로 열려있는 topic을 보겠습니다. turtle1에서 cmd_vel과 pose 등이 보입니다. 저 아이들은 데이터를 주고 받는 것입니다. 

조금 더 정확히 보려면, rosnode info /turtlesim으로 조회해보면 turtlesim이 color_sensor와 pose를 발행(publications)하고, 받는 명령(subscription)은 cmd_vel이라고 되어 있습니다. 그건 위의 RosGraph에서도 나타나 있는 이야기입니다. 현재 실행한 node까지만 보면, teleop이 cmd_vel을 turtlesim에게 주는 거죠^^

이번에는 rostopic info /turtle1/cmd_vel로 cmd_vel을 확인해보면, geometry_msgs/Twist 데이터 형을 사용하고, 현재 구성에서는 teleop_turtle에서 발행하고, turtlesim이 받는 걸로 나타나네요^^ node는 ROS가 실행되는 최소의 프로세서라고 하면, 토픽(topic)은 자연스럽게 여기까지 해도 이해가 될 것 같습니다.

조금 더 나아가서 rosmsg show geometry_msgs/Twist 명령으로 Twist 데이터형을 볼 수 있습니다. 직선 방향화 각도에 대한, 데이터형이네요.

rostopic 명령에는 노드들간에 주고 받는 데이터를 관찰할 수 있는 옵션이 있습니다. rostopic echo /turtle1/cmd_vel 명령을 사용하면, turtlesim으로 들어가는 명령을 알 수 있습니다.

위 그림처럼 제일 왼쪽 두번째 줄 처럼 명령을 줍니다. 처음에는 아무런 대답이 없습니다. 제가 아무런 행동도 안했으니까요^^

화면의 윗쪽 오른쪽 터미널 teleop_key를 실행한 터미널을 활성화하고, 키보드 화살표를 누릅니다. 그러면, echo로 확인한 터미널에서 데이터가 나타납니다. 저런 데이터가 tutlesim에게 명령을 주고 있는거죠.

이번에는 거북이가 발행하는 데이터 중 pose 데이터가 뭔지를 좀 보겠습니다.

저런것이었네요. cmd_vel이 사용하는 Twist 데이터보다는 줄어 있습니다. x, y, 좌표와 자세(theta)를 보여주네요. 속도값과 함께..

이 상태에서, rostopic info /turtle1/pose를 실행해보면 누가 발행하고, 누가 받고 있는지 알 수 있습니다. 받는건 노드(node)가 아니라 제가 터미널에서 rostopic echo 명령으로 관찰하는 것이다보니 저런 이름이 붙었습니다.

RosGraph로 확인하면 저렇죠. 이제, 확실히 node와 topic이 보이지 않으신가요?^^

조금 더 가볼까요^^

이번에는 터미널을 새로 실행해서, rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[1.0, 0.0, 0.0]' '[0.0, 0.0, 2.0]'이라고 명령을 줍니다, rostopic의 echo 옵션은 관찰하는 명령이라면, pub은 전달하는 것입니다. 데이터는 Twist 형으로 전달하면 됩니다. 저 명령을 실행하는 순간...

저런 메세지가 나타날것이고,

거북이는 부드러운 곡선 주행을 할 것이며~

RosGraph를 새로고침해보면, 딱 상황에 맞게 나타납니다. 이제 cmd_vel이라는 topic에 데이터를 주는 노드는 teleop_turtle과, 방금 pub 옵션으로 실행한 rostopic, 이렇게 두 개이구요. 그 cmd_vel이 turtlesim에 전달되고, turtlesim의 pose 데이터는 별도의 터미널에서 제가 관찰하고 있었습니다. 와우~~~ 어떤가요? 이렇게 거북이를 활용하면, ROS의 개념을 조금 쉽게 배울 수 있는것 같습니다.^^.

반응형