======ROS STUDY #3: ROS 노드 간의 구조2, 터틀봇 시뮬레이션====== {{youtube>9Hn7nCRQ6uQ?medium}} =====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 태그 안에는 roslaunch 명령어로 노드를 실행할 때 필요한 태그들이 기술된다. 는 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 수정을 한 후 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에 있는 한 동일한 이름으로 여러 개의 노드를 실행할 수 있다.