Study/[ROS] ROS Basic

ROS Basics(2. Topic, Publisher)

soohwan_justin 2020. 10. 31. 16:55

이 포스트는 theconstructsim.com의 ROS BASICS 를 참고하였습니다.

https://youtu.be/DBFYZRMLr70

 

이번 포스트에서 다룰 내용은

- ROS topic이 뭔지 알고, 이것을 어떻게 사용하는지 알기

- publisher가 뭔지 알고, 어떻게 만드는지 알기

- topic message가 뭔지 알고, 어떻게 동작하는지 알기

 

 

Part 1 : Publisher

다음 예제에서는 앞으로 모든 예제들을 포함할 my_examples_pkg 라고 하는 rospackage를 만들것입니다. 만드는 방법은 다음과 같습니다. (이전 포스트에서 설정을 했다면 $ cd ~/catkin_ws/src$ cs로, $ cd ~/catkin_ws &&  catkin_make$ cm 으로 대체할 수 있습니다)

 

$ cd ~/catkin_ws/src

$ catkin_create_pkg my_examples_pkg rospy std_msgs

$ cd ~/catkin_ws && catkin_make

$ rospack profile

$ roscd my_examples_pkg

$ mkdir scripts

 

우리는 예제 python script를 scripts 디렉토리에 저장할 것입니다.

 

$ cd scripts

$ gedit simple_topic_publisher.py

 

simple_topic_publisher.py라는 파일을 만들고, 다음과 같이 편집합니다.

 

#! /usr/bin/env python

import rospy
from std_msgs.msg import Int32 

rospy.init_node('topic_publisher')
pub = rospy.Publisher('/counter', Int32, queue_size=1)
rate = rospy.Rate(2)
count = Int32()
count.data = 0

while not rospy.is_shutdown(): 
  pub.publish(count)
  count.data += 1
  rate.sleep()

- Ubuntu 18.04 이하 (ROS melodic, Kinetic 등)을 사용하면 첫 번째 줄의 주석을 #! /usr/bin/env python 으로, 20.04 이상 부터는 #! /usr/bin/env python3 을 사용해야 커맨드 창에서 파이썬 파일을 실행할 수 있습니다

 

편집 후, 실행 권한을 부여하고, 실행해봅니다.

 

$ sudo chmod +x simple_topic_publisher.py

$ rosrun my_examples_pkg simple_topic_publisher.py

 

실행 해보면 아무 일도 일어나지 않는데, 사실 이게 맞습니다. 위 코드는 단지 /counter 이라는 이름의 topic을 만든 것이고, 1씩 증가하는 Int 형식의 변수를 계속 publish하는 코드입니다.

 

node들은 어떤 정보를 다른 node로 publish하기 위해 topic을 사용합니다. 우리는 이 topic 목록을 확인하고 싶으면 아무때나 rostopic list 명령으로 확인할 수 있고, 해당 topic에 대한 정보는 rostopic info, 그 topic의 데이터를 보고싶으면 rostopic echo 명령으로 볼 수 있습니다.

 

$ rostopic list

$ rostopic info /counter

$ rostopic echo /counter

 

 

출력되는 데이터는 std_msgs/Int32 라는 자료형으로 publish되었으며, 이 정보를 publish하는 node는 topic_publisher입니다. 아직 이 topic을 listen하는 node는 없으므로 subscribers node는 없습니다.

이제, 위 코드에 대한 자세한 설명을 보겠습니다.

 

#! /usr/bin/env python

import rospy                               # Import the Python library for ROS
from std_msgs.msg import Int32             # Import the Int32 message from the std_msgs package

rospy.init_node('topic_publisher')         # Initiate a Node named 'topic_publisher'
pub = rospy.Publisher('/counter', Int32, queue_size=1)    
                                           # Create a Publisher object, that will publish on the /counter topic
                                           # messages of type Int32

rate = rospy.Rate(2)                       # Set a publish rate of 2 Hz
count = Int32()                            # Create a var of type Int32
count.data = 0                             # Initialize 'count' variable

while not rospy.is_shutdown():             # Create a loop that will go until someone stops the program execution
  pub.publish(count)                       # Publish the message within the 'count' variable
  count.data += 1                          # Increment 'count' variable
  rate.sleep()                             # Make sure the publish rate maintains at 2 Hz

 

기본적으로, 이 코드가 하는 것은 node를 초기화 하고, publisher를 만드는데, 이 publisher는 계속 증가하는 정수값을 '/counter'라는 이름의 topic으로 계속 publish합니다. 요약하자면,

 

"publisher는 topic으로 메세지를 계속 publish하는 node" 입니다. 그렇다면, topic이란?

 

topic은 ROS node들이 publish하거나 정보를 읽을 수 있는 pipe처럼 동작하는 채널입니다.

 

rostopic echo 옵션에는 가장 최근의 데이터만 볼 수 있는 옵션이 있습니다. rostopic echo 명령으로 데이터를 확인하면 그 데이터가 계속 출력되는데, 만약 이 데이터가 복잡하거나 많은 경우, 데이터를 확인하기에 귀찮아지는 경우가 있습니다.

 

$ rostopic echo <topic_name> -n1

 

 

Messages

이미 눈치채셨겠지만, topic은 messages를 통해 정보를 다룹니다. messages에는 매우 다양한 종류가 있는데, 이 예제의 경우 std_msgs 패키지의 Int32라는 message입니다. 우리는 원하는 타입의 message를 직접 만들 수도 있지만, 가능하면 기본적으로 제공되는 message를 사용하는 것을 권장합니다.

 

다른 여러가지 messages는 아래 링크를 참조하세요

wiki.ros.org/std_msgs

 

std_msgs - ROS Wiki

kinetic melodic noetic   Show EOL distros:  EOL distros:   electric fuerte groovy hydro indigo jade lunar diamondback: Only showing information from the released package extracted on Unknown. No API documentation available. Please see this page for in

wiki.ros.org

 

어떤 message에 대한 정보를 커맨드 창에서 확인하고 싶으면, 다음 명령으로 확인하면 됩니다.

 

$ rosmsg show <message>

 

우리 예제에서는 std_msgs/Int32를 사용했으므로, 다음과 같이 확인해볼 수 있습니다.

 

$ rosmsg show std_msgs/Int32

 

위 명령어를 실행하면

 

int32 data

 

라는 출력만 나오는데, 이는 위 데이터 형식은 int32 자료형의 데이터 하나만 갖고있다는 것입니다.

 

 

이제 예제를 하나 수행해보겠습니다.

 

1 위의 예제에서 작성했던 simple_topic_publisher.py를 수정합니다.

- 시뮬레이션으로 로봇을 제어할 것인데, 이 로봇을 제어하는 topic의 이름은 /cmd_vel 입니다. 이전 포스팅에서 다운받았던 로봇 시뮬레이션 패키지를 실행해서 확인 할 것인데, 다음 명령으로 이 시뮬레이션 패키지를 실행합니다.

$ roslaunch turtlebot3_fake turtlebot3_fake.launch

위 명령 입력 시 rviz가 실행되며 로봇이 나타날 것입니다.

 

2. rosmsg show와 rostopic info 명령으로 topic /cmd_vel의 정보를 확인하고, 이에 맞게 python code를 수정합니다. 이 topic의 경우 geometry_msgs/Twist이기 때문에 var=Twist() 이런 식으로 변수를 선언해야 합니다.

 

3. 이 로봇은 differential drive 로봇입니다. 따라서 x축의 병진 속도와 z축의 각속도만으로 로봇의 움직임을 제어합니다. 로봇의 속도 단위는 m/sec와 rad/sec이므로, 속도 값은 0에서 1 사이의 값을 할당하세요.

 

 

- simple_topic_publisher.py를 실행하는 launch파일을 작성하고, 실행합니다.

 

 

 

 

 

 

예제의 답은 아래와 같습니다. 미리 확인하지 마시고 한번 직접 해보신 후 확인하시기 바랍니다.

 

 

 

 


 

 

 

 

 

python code입니다

 

#! /usr/bin/env python

import rospy
from geometry_msgs.msg import Twist

rospy.init_node('cmd_publisher')
pub = rospy.Publisher('/cmd_vel', Twist, queue_size=1)
rate = rospy.Rate(2)
var = Twist()
var.linear.x = 0.5
var.angular.z = 0.3

while not rospy.is_shutdown():
    pub.publish(var)
    rate.sleep()

 

launch 파일입니다.

<launch>
  <node pkg="my_examples_pkg" type="simple_topic_publisher.py" name="cmd_pub_node" output="screen"/>
</launch>

 

 

실행 화면입니다.

 

'Study > [ROS] ROS Basic' 카테고리의 다른 글

ROS Basics(5. Action, Server and Client)  (0) 2021.08.29
ROS_Basics(4. Service. Server and Client)  (0) 2020.11.03
ROS Basics(3. Topic, Subscriber)  (0) 2020.11.02
ROS Basics(1)  (0) 2020.10.31