목차

ROS STUDY #3: ROS 노드 간의 구조2, 터틀봇 시뮬레이션

1. 터틀봇 시뮬레이션 토픽 분석

1.1. 터틀봇3 토픽 받아오기

터틀봇3을 구동하면 turtlebot3_core 노드와 turtlebot3_lds 노드가 실행되고 각 노드에서 퍼블리시하는 조인트 상태, 모터 구동부, IMU 등의 내용을 토픽으로 받아볼 수 있다.

roslaunch turtlebot3_bringup turtlebot3_robot.launch --screen

터틀봇 원격 제어에서 했던 것처럼 Remote PC에서 다음과 같이 turtlebot3_teleop_key.launch 파일을 실행한다.

roslaunch turtlebot3_telecop turtlebot3_teleop_key.launch --screen

rqt_graph를 실행하면 좀 더 자세한 노드 및 토픽 정보를 얻을 수 있다.

rqt_graph

1.2. 터틀봇3의 서브스크라이브 토픽

이름 형태 기능
motor_power std_msgs/Bool 다이나믹셀 모터 On/Off
reset std_msgs/Empty 리셋(odometry 및 IMU)
sound turtlebot3_msgs/Sound 비프음 소리 출력
cmd_vel geomertry_msgs/Twist 모바일 로봇의 병진 및 회전속도 제어, 단위는 m/s, rad/s

1.3. 서브스크라이브 토픽으로 로봇 제어

정지시키기

rostopic pub /motor_power std_msgs/Bool “data:0”
속도제어: x, y는 병진속도로 m/s, z는 회전속도로 rad/s

x축 방향으로 0.02m/s 속도로 전진

rostopic pub /cmd_vel geometry_msgs/Twist “linear:
   x: 0.02
   y: 0.0
   z: 0.0
angular:
   x: 0.0
   y: 0.0
   z: 0.0”

z축을 기준으로 반시계 방향으로 1.0rad/s 속도로 회전

rostopic pub /cmd_vel geometry_msgs/Twist “linear:
   x: 0.0
   y: 0.0
   z: 0.0
angular:
   x: 0.0
   y: 0.0
   z: 1.0”

1.4. 퍼블리시 토픽

터틀봇3이 퍼블리시하는 토픽은 크게 상태진단 관련 토픽, 디버그 관련 토픽, 센서 관련 토픽으로 나눌 수 있고 그 이외에 조인트 관련 토픽, 제어기 정보 관련 토픽, 오드메트리 및 변환 관련 토픽 등이 있다.

이름 형태 기능
sensor_state turtlebot3_msgs/SensorState 터틀봇3에 실장된 센서들의 값을 확인하는 토픽
battery_state sensor_msgs/BatteryState 배터리의 전압 등의 상태 값을 알 수 있다.
scan sensor_msgs/LaserScan 터틀봇3에 탑재된 LDS로부터의 스캔값을 확인할 수 있는 토픽이다.
imu seonsor_msgs/Imu 가속도 센서와 자이로 센서값을 기반으로 로봇의 방향값을 포함하는 토픽이다.
odom nav_msgs/Odometry 엔코더와 IMU 정보를 기반으로 터틀봇3의 오도메트리 정보를 얻을 수 있다.
tf tf2_msgs/TFMessage 터틀봇3의 base_footprint, odom와 같은 좌표 변환값을 가진다.
joint_states sensor_msgs/JointState 좌/우측 바퀴를 조인트로 여겼을 때의 위치, 속도, 힘 등을 확인 가능, 각 단위는 위치:m, 속도:m/s, 힘:Nm
diagnostics diagnostic_msgs/DiagnosticArray 자기 진단 정보를 얻을 수 있다.
version_info turtlebot3_msgs/VersionInfo 터틀봇3의 하드웨어, 펌웨어, 소프트웨어 등의 정보를 얻을 수 있다.
cmd_ver_rc100 geometry_msgs/Twist 블루투스 기반의 조종기인 RC100을 이용했을 경우에 사용되는 토픽으로 모바일 로봇의 속도 제어에 사용되고 서브스크라이브하게 된다. 단위는 m/s, rad/s

1.5. 퍼블리시 토픽으로 로봇 상태 파악

sensor_state 토픽은 임베디도 보드 OpenCR에 연결된 아날로그 센서들을 주로 다루는데 다음 예제와 같이 bumper, cliff, button, left_encoder, right_encoder 등의 정보를 얻을 수 있다.

rostopic echo /sensor_state

odom 토픽을 이용하면 오도메트리 정보를 얻을 수 있다.

rostopic echo /odom

tf 토픽은 XY 평면상에서 로봇의 중심 위치인 base_footprint와 오도메트리 정보인 odom과의 좌표 변환과 같이 상대 좌표 형태로 기술된 로봇의 각 조인트들의 자세(위치와 방향) 정보이다.

rostopic echo /tf

rqt의 tf_tree 플러그인을 사용해 GUI 환경에서도 확인할 수 있다.

rosrun rqt_tf_tree rqt_tf_tree

2. ROS Namespace

2.1. roslaunch 사용법

roslaunch는 하나 이상의 정해진 노드를 실행시킬 수 있다. 그 밖의 기능으로 노드를 실행할 때 패키지의 매개변수나 노드 이름 변경, 노드 네임스페이스 설정 등의 옵션을 붙일 수 있는 ROS 명령어이다. roslaunch는 *.launch라는 파일을 사용하여 실행 노드를 설정한다.

roslaunch 패키지명 roslaunch 파일

topic_publisher와 topic_subscriber에서 퍼블리쉬 노드와 서브스크라이버 노드를 각각 두 개씩 구동하여 서로 별도의 메시지 통신을 해보자. roslaunch에 사용되는 파일은 *.launch라는 파일명을 가지며 해당 패키지 폴더에 launch라는 폴더를 생성하고 그 폴더 안에 넣어야 한다.

roscd ros_tutorials_topic
mkdir launch
cd launch
gedit union.launch
<launch>
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher1"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber1"/>
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher2"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber2"/>
</launch>

<launch> 태그 안에는 roslaunch 명령어로 노드를 실행할 때 필요한 태그들이 기술된다. <node>는 roslaunch로 실행할 노드를 기술하게 된다. roslaunch 파일을 작성하였으면 다음처럼 union.launch를 실행하자. 이후 실행결과를 보자.

rosnode list

결과적으로 topic_publisher hem가 topic_publisher1과 publisher1과topic_publisher2로이름이바뀌어두개의노드가실행되었다. topic_subscriber 노드도 topic_subscriber1 과 topic_subscriber2로 이름이 바뀌어 실행되었다. 문제는 “퍼블리쉬노드와 서브스크라이버 노드를 각각 두개씩 구동하여 서로 별도의 메시지 통신하게 한다”는 처음 의도와는 다르게 rqt_graph를 통해 보면 서로의 메시지를 모두 서브스크라이브하고 있다는 것이다. 이 문제를 다른 roslaunch 네임스페이스 태그를 사용하여 해결해볼 수 있다.

rqt_graph

union.launch을 수정하자.

roscd ros_tutorials_service/launch
gedit union.launch
<launch>
<group ns="ns1">
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber"/>
</group>
<group ns="ns2">
<node pkg="ros_tutorials_topic" type="topic_publisher" name="topic_publisher"/>
<node pkg="ros_tutorials_topic" type="topic_subscriber" name="topic_subscriber"/>
</group>
</launch>

수정을 한 후 rqt 그래프를 보자.

rqt_graph

2.2. namespace 예시

namespace는 이름 충돌을 막을 수 있는 옵션이다. 예를 들어 노드가 /ns1/node_a이면 /ns1이라는 namespace의 node_a이고 /ns1/node_b는 /ns1이라는 namespace의 node_b인 것이다. 다음은 토픽이 다른 경우이다. /ns1/topic_a는 ns1이라는 namespace에 topic_a를 의미하고 /ns1/topic_b는 ns1이라는 namespace에 topic_b를 의미한다. 이렇게 namespace를 사용하면 노드가 서로 다른 namespace에 있는 한 동일한 이름으로 여러 개의 노드를 실행할 수 있다.