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에 있는 한 동일한 이름으로 여러 개의 노드를 실행할 수 있다.