TIKI-MINI로 시작하는 ROS2 실무
목차

3. 개발 PC 환경

3.5turtlesim과 rqt로 실습 감 잡기

1부에서는 브라우저 안의 가짜 터미널로 ros2 명령을 연습했습니다. 이제 VM에 설치된 진짜 ROS2에서 같은 명령을 실행합니다. turtlesim 노드를 띄우고 조사하고, 명령으로 조종하고, rqt로 들여다봅니다.

turtlesim은 노드 하나가 화면에 거북이를 그리는 학습용 프로그램입니다. 토픽, 서비스, 액션, 파라미터를 모두 갖고 있어서 1부의 개념을 한 번씩 만져 보기 좋습니다. 이 장에서 쓰는 명령은 앞으로 TIKI-MINI를 다룰 때도 이름만 바뀌어 그대로 나옵니다.

turtlesim과 ros2 CLI, rqt의 관계/teleop_turtleturtle_teleop_key/turtlesim토픽 pose, color_sensor서비스 spawn, clear, reset액션 turtle1/rotate_absolute파라미터 background_r, g, b/turtle1/cmd_vel (Twist)ros2 명령, rqt같은 이름으로 접근하는 도구topic pubservice call, param set,action send_goal
turtlesim 하나가 토픽, 서비스, 액션, 파라미터를 모두 갖고 있습니다. ros2 명령과 rqt는 이 이름들로 같은 노드에 접근합니다.

1. 설치 확인

OVA에는 turtlesim과 rqt 도구가 이미 설치되어 있어서 따로 설치할 것이 없습니다. 이 VM에서 ros2 pkg prefix로 확인했을 때 turtlesim, rqt_graph, rqt_console, rqt_plot, rqt_service_caller, rviz2가 모두 /opt/ros/humble로 나왔습니다. 먼저 확인합니다.

ros2 pkg executables turtlesim
ros2 pkg prefix rqt_graph

첫 명령은 turtlesim turtlesim_node와 turtlesim turtle_teleop_key 같은 줄을, 둘째 명령은 /opt/ros/humble 경로를 출력해야 합니다. Package not found가 나오면 해당 패키지가 없는 것입니다. OVA에서는 나오지 않지만, 직접 설치한 ROS2(3.3장)라면 아래처럼 설치합니다.

sudo apt update
sudo apt install ros-humble-turtlesim
sudo apt install '~nros-humble-rqt*'

~nros-humble-rqt*는 이름이 ros-humble-rqt로 시작하는 패키지를 모두 고르는 apt 패턴입니다. 따옴표를 붙이면 셸이 ~를 홈 폴더로 바꾸거나 *를 파일 이름으로 풀어 버리는 일을 막습니다. 새 터미널을 열 때마다 ros2 명령이 보여야 하므로 echo $ROS_DISTRO가 humble인지도 확인하세요.

2. 두 노드 실행하고 거북이 움직이기

Tilix에서 3.4장처럼 세 칸을 만듭니다. 왼쪽 칸(1)과 오른쪽 위 칸(2)을 이 절에서 쓰고, 오른쪽 아래 칸(3)은 다음 절에서 씁니다.

칸 1에서 거북이 창을 띄웁니다.

ros2 run turtlesim turtlesim_node

파란 바탕에 거북이 한 마리가 있는 창이 열리고, 칸 1에는 거북이를 만들었다는 로그가 나옵니다. 로그 맨 앞에 Ignoring XDG_SESSION_TYPE=wayland 경고가 보이는데, Ubuntu의 화면 방식 안내라서 무시해도 됩니다. 거북이 모양은 실행할 때마다 달라질 수 있습니다. 이 칸은 그대로 둡니다.

칸 2에서 키보드 조종 노드를 실행합니다.

ros2 run turtlesim turtle_teleop_key

화살표 키로 움직이라는 안내 문구가 나옵니다. 안내에 따라 방향키를 눌러 보세요. 이 안내에는 G, B, V, C, D, E, R, T 키로 정해진 방향을 보게 하는 기능도 적혀 있고, Q로 종료합니다. 방향 고정 키가 1.6장의 액션과 같은 방식으로 동작하는지는 뒤에서 확인합니다.

칸 2를 클릭해 입력 위치를 둔 채 방향키를 눌러 보세요. 거북이 창은 새 창으로 뜨고 Tilix 위에 겹칠 수 있으니 한쪽으로 옮겨 두면 편합니다.

Tilix 세 칸과 TurtleSim 창. 오른쪽 위 칸의 방향키 안내, 거북이, 거북이가 그린 선에 번호 표시
  • ① 칸 2: turtle_teleop_key의 안내 문구. 방향키는 이 칸이 받습니다.
  • ② 거북이: 방향키로 움직이는 turtle1
  • ③ 거북이가 지나간 자리에 그려진 선
실습 화면 배치와 키 입력이 가는 곳VM 화면터미널 1ros2 run turtlesimturtlesim_node터미널 2ros2 run turtlesimturtle_teleop_key거북이 창파란 바탕과 거북이키를 받지 않음터미널 3ros2 topic, service,param, action 명령/turtle1/cmd_vel키보드는 이 창을 누른 뒤에방향키를 눌러야 합니다
방향키는 turtle_teleop_key를 실행한 터미널이 받습니다. 거북이 창을 눌러도 키가 전달되지 않습니다.

화면 밖으로 나가려고 해 보세요. 거북이는 벽에서 멈추고 칸 1에 벽에 부딪혔다는 취지의 경고(WARN) 로그가 나옵니다. 문구는 버전에 따라 다를 수 있습니다. 이 로그를 뒤에서 rqt_console로 다시 봅니다.

창이 비어 있거나 검게 보일 때

거북이 창이 검거나 아예 뜨지 않으면 VM의 그래픽 문제입니다. 3.2장의 3D 가속 절을 다시 보세요. 순서는 이렇습니다.

  1. 로그아웃하고 로그인 화면 톱니바퀴에서 Ubuntu on Xorg로 들어갑니다.
  2. VM 설정에서 비디오 메모리를 최대로 두고 3D 가속을 껐다 켜 봅니다.
  3. 터미널에서 ros2 node list를 실행해 /turtlesim이 보이는지 확인합니다. 보인다면 ROS2는 정상이고 화면 출력만 문제입니다. 이 경우 아래 명령 실습은 창 없이도 대부분 진행할 수 있습니다.

3. 1부 명령을 진짜 노드에 실행하기

칸 3에서 명령을 실행합니다. 칸 1, 2는 켜 둡니다. 1.2장에서 익힌 조사 순서를 그대로 따릅니다.

노드와 토픽 (1.2장, 1.3장)

ros2 node list
ros2 node info /turtlesim
ros2 topic list -t

/teleop_turtle과 /turtlesim 두 노드가 보입니다. node info의 Subscribers에는 /turtle1/cmd_vel이 있고, Publishers에는 /turtle1/pose와 /turtle1/color_sensor가 있습니다. 1.2장의 가짜 터미널과 같은 구조입니다. 이 목록 아래쪽에는 Service Servers와 Action Servers도 나오는데, 곧 직접 부를 이름들입니다.

ros2 node list에 /turtlesim 하나, ros2 topic list -t에 turtle1 토픽과 메시지 형식이 나온 화면. 번호 표시
  • ① ros2 node list: 거북이 노드 /turtlesim
  • ② ros2 topic list -t: 토픽 이름과 메시지 형식. /turtle1/cmd_vel은 geometry_msgs/msg/Twist, /turtle1/pose는 turtlesim/msg/Pose입니다.

속도 명령이 흐르는 모습을 보겠습니다. 칸 3에서 echo를 켜 두고 칸 2에서 방향키를 누르세요.

ros2 topic echo /turtle1/cmd_vel

방향키를 누를 때마다 linear와 angular 값이 가진 메시지가 출력됩니다. 앞으로 가면 linear.x가 양수이고, 회전하면 angular.z가 바뀝니다. Ctrl+C로 멈추고 이번에는 키보드 대신 터미널로 직접 보냅니다.

ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"

거북이가 바라보는 방향으로 한 번 나아가고 멈춥니다. 같은 메시지를 계속 보내려면 --once 대신 -r 1(초당 1회)을 쓰고 Ctrl+C로 끕니다. 위치 정보도 확인해 보세요.

ros2 topic echo /turtle1/pose --once
ros2 interface show turtlesim/msg/Pose
ros2 topic echo /turtle1/pose --once 결과와 ros2 interface show turtlesim/msg/Pose 정의에 번호 표시
  • ① 지금 거북이의 위치와 방향. 처음에는 x와 y가 5.5 부근, theta는 0.0입니다.
  • ② 메시지 정의. 위 ①의 항목 이름이 여기서 옵니다.

pose에는 x, y, theta, linear_velocity, angular_velocity가 있습니다. 필드 이름이 기억나지 않을 때는 이렇게 ros2 interface show로 정의를 확인하는 습관을 들이세요. 이 장에서 쓰는 메시지 형식에 확신이 없으면 같은 방법으로 확인하면 됩니다.

서비스 (1.4장)

ros2 service list -t

목록에는 /clear, /kill, /reset, /spawn, /turtle1/set_pen, /turtle1/teleport_absolute, /turtle1/teleport_relative와 각 노드의 파라미터 서비스(.../get_parameters 등)가 섞여 나옵니다. 거북이를 하나 더 만들어 봅니다.

ros2 interface show turtlesim/srv/Spawn
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2.0, y: 2.0, theta: 0.2, name: ''}"

요청은 x, y, theta, name이고 응답은 만들어진 거북이의 이름입니다. name을 빈 문자열로 주면 이름을 자동으로 붙이며 turtle2, turtle3 순으로 정해집니다. 창에 두 번째 거북이가 나타나고 ros2 topic list에는 /turtle2/cmd_vel 같은 토픽이 생깁니다. 서비스 한 번이 노드의 토픽 구성까지 바꾸는 예입니다.

칸 3에서 spawn 서비스를 호출한 결과와 topic list, 칸 1의 turtle2 생성 로그에 번호 표시
  • ① 칸 3에 입력한 service call 명령
  • ② 응답의 name='turtle2': 빈 이름을 주면 이렇게 이름이 붙습니다
  • ③ 새로 생긴 /turtle2/cmd_vel 토픽 (/turtle2/pose도 함께 생김)
  • ④ 칸 1(turtlesim 노드)의 로그에도 turtle2가 만들어졌다고 찍힙니다

선의 색과 굵기를 바꾸는 서비스도 있습니다. YAML에서 off는 참/거짓 값으로 읽힐 수 있어서 키에 따옴표를 붙입니다.

ros2 service call /turtle1/set_pen turtlesim/srv/SetPen "{r: 255, g: 0, b: 0, width: 5, 'off': 0}"

이후 turtle1을 움직이면 빨간 굵은 선이 그려집니다. 선을 지우거나 처음 상태로 돌릴 때는 입력이 없는 서비스를 부릅니다.

ros2 service call /clear std_srvs/srv/Empty
ros2 service call /reset std_srvs/srv/Empty

/clear는 선만 지우고, /reset은 선을 지우고 거북이를 처음 위치로 되돌리며 spawn으로 만든 거북이도 지웁니다.

파라미터 (1.5장)

ros2 param list
ros2 param get /turtlesim background_r
ros2 param set /turtlesim background_r 150
ros2 param set /turtlesim background_g 40
set_pen 서비스 호출과 응답, background_r 조회와 값 변경 결과에 번호 표시
  • ① set_pen 서비스 호출
  • ② 응답 SetPen_Response(): 서비스가 끝났다는 뜻입니다. 돌려줄 값은 없습니다.
  • ③ param get: 지금 배경 빨강 값 (이 화면에서는 69)
  • ④ param set이 두 번 모두 Set parameter successful로 끝났습니다.
배경이 보라색으로 바뀐 TurtleSim 창과 거북이에 번호 표시
  • ① background_r을 150, background_g를 40으로 바꾼 뒤의 배경
  • ② 거북이는 그대로 한가운데에 있습니다.

배경색은 background_r, background_g, background_b 세 파라미터가 정합니다. 값을 바꿨는데 화면이 그대로면 /clear 서비스를 한 번 부르세요. 바뀐 값은 노드를 껐다 켜면 처음 값으로 돌아갑니다. 값을 파일에 보관하고 시작할 때 읽게 하는 방법은 1.5장과 1.7장의 런치 파일에서 다뤘습니다.

액션 (1.6장)

ros2 action list -t
ros2 action info /turtle1/rotate_absolute
ros2 interface show turtlesim/action/RotateAbsolute

/turtle1/rotate_absolute는 거북이를 정해진 각도로 돌리는 액션입니다. 목표는 theta(라디안)이고 결과는 돌아간 양, 피드백은 남은 각도입니다. 목표를 보내고 피드백까지 출력해 보세요.

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}" --feedback
rotate_absolute 액션의 피드백이 줄어들다가 결과 delta와 SUCCEEDED가 나온 화면. 번호 표시
  • ① 피드백: 남은 각도 remaining이 0에 가까워집니다.
  • ② 결과: 실제로 돌아간 양 delta
  • ③ Goal finished with status: SUCCEEDED

거북이가 천천히 돌아가는 동안 터미널에는 남은 각도(remaining)가 줄어드는 피드백이 이어지고, 도착하면 결과가 나옵니다. 서비스는 요청하면 끝날 때까지 기다렸다가 결과만 받는 반면, 액션은 진행 상황을 계속 보내 주고 중간에 취소할 수도 있습니다. 앞에서 본 teleop의 방향 고정 키도 이 액션을 이용하는 기능입니다. 화면 안내 문구에서 F 키가 취소로 적혀 있는 것을 확인해 보세요.

4. rqt로 보기

명령어로 하나씩 조사하던 내용을 rqt는 창으로 보여 줍니다. 이 절의 rqt 도구들도 모두 OVA에 설치되어 있습니다. rqt는 작은 도구 여러 개를 플러그인으로 묶은 프로그램입니다.

rqt 도구와 보여 주는 것실행 중인 ROS2 시스템turtlesim 노드 두 개rqt_graph노드와 토픽의연결 그림rqt_console노드들의로그 모아 보기rqt 패널서비스 호출,토픽 발행·확인rqt_plot숫자 값의시간 그래프
rqt 도구는 각각 다른 면을 보여 줍니다. 같은 시스템에 여러 개를 동시에 띄워도 됩니다.

rqt_graph

rqt_graph

처음에는 노드만 보이는 Nodes only 상태로 열립니다. 왼쪽 위 드롭다운에는 Nodes only, Nodes/Topics (active), Nodes/Topics (all) 세 가지가 있습니다.

rqt_graph 창의 드롭다운이 열려 Nodes/Topics (all) 항목에 번호 표시
  • ① 보기 방식을 고르는 드롭다운
  • ② Nodes/Topics (all): 토픽까지 모두 그립니다. 이 항목을 고릅니다.
  • ③ 새로고침 버튼: 노드를 새로 켜거나 끈 뒤에는 이 버튼을 눌러야 그림이 바뀝니다.

Nodes/Topics (all)로 보면 1.2장에서 본 노드 그림이 진짜 시스템으로 그려집니다.

rqt_graph에 /turtlesim 노드, /teleop_turtle 노드, /turtle1/cmd_vel 토픽이 그려져 있다
  • ① /turtlesim 노드
  • ② /turtle1/cmd_vel 토픽: 속도 명령이 지나가는 길
  • ③ /teleop_turtle 노드: 방향키 입력을 속도 명령으로 바꿔 발행합니다.
  • ④ 지금 고른 보기 방식

/teleop_turtle에서 /turtle1/cmd_vel을 거쳐 /turtlesim으로 이어지는 선을 찾아보세요.

위 그림에는 앞에서 spawn한 turtle2의 토픽이 없습니다. 아래쪽 Hide 줄의 Dead sinks와 Leaf topics가 체크되어 있으면 받는 쪽이 없는 토픽이 숨겨지기 때문입니다. 두 체크를 풀고 새로고침하면 turtle2가 나타납니다.

Dead sinks와 Leaf topics 체크를 푼 뒤 turtle1과 turtle2의 토픽이 모두 보이는 rqt_graph
  • ① 체크를 푼 Dead sinks와 Leaf topics
  • ② /turtle2 묶음: cmd_vel, pose, color_sensor와 액션 토픽이 보입니다.

rqt_graph는 앞으로도 가장 자주 쓰는 도구입니다. 토픽 이름이 안 맞아서 노드끼리 연결이 안 되었을 때, 그림에서 선이 끊긴 곳이 바로 원인입니다.

rqt_console

ros2 run rqt_console rqt_console

이 VM에서는 rqt_console만 입력하면 명령을 찾지 못하므로 ros2 run 패키지 실행파일 형태로 실행합니다.

rqt_console 창에 turtlesim 노드의 Warn 로그가 쌓인 화면. 번호 표시
  • ① 메시지 표: 거북이가 벽에 부딪힐 때마다 Oh no! I hit the wall! 줄이 하나씩 늘어납니다.
  • ② 레벨(Severity)과 노드 이름. 이 줄들은 Warn이고 turtlesim 노드가 보낸 것입니다.
  • ③ 레벨 제외 필터. 보고 싶지 않은 레벨을 여기에 추가해 숨깁니다.

모든 노드가 rosout으로 보내는 로그가 표 형태로 모입니다. 레벨(Debug, Info, Warn, Error, Fatal)로 거르거나 문구로 검색할 수 있습니다. 거북이를 일부러 벽에 부딪히게 하면 Warn 줄이 쌓이는 것을 볼 수 있습니다. 터미널에서 지나가 버리는 로그를 모아 두고 보기에 편합니다.

rqt 플러그인 패널

rqt

빈 창이 열립니다. 위쪽 Plugins 메뉴에서 필요한 도구를 골라 창 안에 올립니다. 메뉴는 Actions, Configuration, Introspection, Logging, Miscellaneous Tools, Services, Topics, Visualization으로 나뉘어 있고, Services 아래에 Service Caller와 Service Type Browser가 있습니다.

rqt의 Plugins 메뉴에서 Services를 열어 Service Caller 항목에 번호 표시
  • ① Plugins 메뉴
  • ② Services 분류
  • ③ Service Caller

이 장에서는 세 개를 써 봅니다. 메뉴 이름은 버전에 따라 조금씩 다를 수 있습니다.

메뉴하는 일대응하는 명령
Services, Service Caller서비스를 목록에서 골라 요청 값을 채워 호출ros2 service call
Topics, Topic Monitor토픽마다 값이 오가는지, 주기는 어떤지 표시ros2 topic echo, hz
Topics, Message Publisher토픽에 메시지를 주기적으로 발행ros2 topic pub -r

Service Caller를 열면 처음에는 서비스 목록에 rqt 자신의 파라미터 서비스만 보입니다. 먼저 새로고침 버튼을 눌러야 /spawn 같은 서비스가 목록에 올라옵니다.

Service Caller에서 /spawn을 골라 x와 y를 8.0으로 넣고 Call을 눌러 turtle3 응답을 받은 화면
  • ① 새로고침: 먼저 누르지 않으면 /spawn이 목록에 없습니다.
  • ② 서비스 선택: /spawn
  • ③ 요청 값: Expression 칸을 더블클릭해 x, y에 8.0을 입력
  • ④ Call 버튼
  • ⑤ 응답: 방금 만든 거북이 이름 turtle3

명령으로 부를 때와 결과가 같습니다. 명령을 외우기 어려운 서비스는 이 화면에서 요청 형식을 먼저 눈으로 보면 입력하기 쉽습니다. rqt_console은 Plugins의 Logging 아래 Console로도 열 수 있습니다.

Message Publisher로는 /turtle1/cmd_vel을 골라 + 버튼으로 추가하고, linear/x와 angular/z 칸에 값을 넣은 뒤 주기(rate)를 켜 보세요. 체크를 해제하면 발행이 멈춥니다.

플러그인이 메뉴에 안 보이면 설치 직후 캐시 때문일 수 있습니다. 이때는 이렇게 다시 찾습니다.

rqt --force-discover

rqt_plot (선택)

값이 시간에 따라 어떻게 변하는지 그래프로 보고 싶을 때 씁니다.

ros2 run rqt_plot rqt_plot /turtle1/pose/x /turtle1/pose/y

rqt_console과 마찬가지로 ros2 run으로 실행합니다. 거북이를 계속 움직이려면 다른 칸에서 ros2 topic pub -r 10 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 1.0}, angular: {z: 0.8}}"를 실행해 두세요. 거북이가 원을 그리며 도는 동안 두 선이 따라 움직입니다.

거북이를 움직이면 두 선이 따라 움직입니다. 지금은 그래프 모양이 아니라 "토픽의 숫자 필드 하나하나를 그래프로 그릴 수 있다"는 사실만 알아 두세요. 로봇의 속도나 오차를 눈으로 확인할 때 같은 방식으로 씁니다.

5. 실습: 정사각형 그리기

거북이로 한 변이 2 정도인 정사각형을 그립니다. 거북이 창은 한 변이 약 11인 정사각형 모양이고 거북이는 한가운데에서 오른쪽을 보고 시작합니다. 칸 3에서 한 줄씩 실행하고, 변마다 거북이가 어디에 있는지 눈으로 확인하세요.

ros2 service call /reset std_srvs/srv/Empty
ros2 service call /turtle1/set_pen turtlesim/srv/SetPen "{r: 255, g: 0, b: 0, width: 4, 'off': 0}"

한 변은 속도 메시지로, 방향 전환은 액션으로 합니다. 시간으로 돌리는 방법은 오차가 쌓이지만 액션은 목표 각도까지 확인해 주기 때문입니다.

ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0}}"
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0}}"
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 3.14}"
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0}}"
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.57}"
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0}}"
빨간 선으로 정사각형이 그려진 TurtleSim 창과 출발점 부근의 거북이에 번호 표시
  • ① 거북이가 그린 빨간 정사각형
  • ② 네 번째 변을 마친 거북이. 출발점 부근에 서 있습니다.

네 번째 변까지 마치면 거북이는 출발점 부근에 있고, 빨간 선이 사각형을 이룹니다. theta는 각도 0이 오른쪽(+x)이고 반시계 방향이 양수입니다. 첫 회전 1.57은 위쪽을 보게 합니다. 한 변을 지날 때마다 ros2 topic echo /turtle1/pose --once로 x, y, theta를 확인해서 표에 기록하세요.

단계기대 위치(대략)내가 본 위치차이
처음x 5.5, y 5.5
첫 번째 변 뒤x 7.5, y 5.5
두 번째 변 뒤x 7.5, y 7.5
세 번째 변 뒤x 5.5, y 7.5
네 번째 변 뒤x 5.5, y 5.5

기대값은 한 변이 2.0으로 정확히 이동한다고 가정한 계산입니다. 실제 값이 다르면 얼마나 어긋나는지 적으세요. 거북이는 일정 시간 속도를 받아 이동하기 때문에 --once 메시지 한 번으로 정확히 2.0만큼 가는지는 직접 확인해야 합니다. 차이가 보이면 linear.x 값을 조금 바꿔서 다시 해 보세요.

이 방식은 2.7장에서 코드로 쓰는 정사각형 주행과 같은 구조입니다. 거리와 각도를 명령으로 주고 결과를 확인하는 과정이 반복됩니다. 이 장에서는 손으로 하고, 2.7장에서는 코드가 대신합니다.

생각해 볼 질문입니다. 위 방식을 ros2 topic pub -r 1로 바꾸면 어떤 문제가 생길까요? 직접 시도하고, 답은 확인 문제와 함께 보세요.

막혔을 때

증상원인해결
ros2: command not found이 터미널에서 ROS2 환경을 불러오지 않음source /opt/ros/humble/setup.bash, 3.4장의 .bashrc 설정 확인
Package 'turtlesim' not foundturtlesim 미설치sudo apt install ros-humble-turtlesim
rqt_graph: command not foundrqt 패키지 미설치sudo apt install '~nros-humble-rqt*'
방향키를 눌러도 거북이가 안 움직임포커스가 teleop 터미널에 없음, 또는 노드가 떠 있지 않음teleop 터미널을 클릭하고 ros2 node list로 두 노드 확인
거북이 창이 검거나 아예 안 뜸VM 3D 가속 문제3.2장: Xorg 세션, 3D 가속 on/off, 비디오 메모리
ros2 node list에 아무것도 안 나옴노드가 꺼져 있음, 또는 터미널마다 ROS_DOMAIN_ID가 다름노드 실행 터미널 확인, 두 터미널에서 echo $ROS_DOMAIN_ID 비교 (3.9장)
서비스 호출이 waiting for service to become available에서 멈춤서비스 이름 오타, 또는 노드가 없음ros2 service list로 이름 확인
service call 입력이 오류서비스 타입이나 YAML 형식이 틀림ros2 service type /spawn 결과를 쓰고 ros2 interface show로 필드 이름 확인
파라미터를 바꿨는데 색이 그대로화면이 아직 다시 그려지지 않음ros2 service call /clear std_srvs/srv/Empty
rqt_graph가 비어 있음새로고침 안 함, 또는 필터 설정새로고침 버튼, Nodes/Topics (all) 선택, Dead sinks와 Leaf topics 체크 해제
rqt 메뉴에 플러그인이 없음설치 직후 캐시rqt --force-discover
rqt 창이 느리거나 깨짐VM 그래픽, 창이 너무 많음창을 닫고 필요한 것만 연다. 3.2장의 성능 항목

한눈에 정리

  1. turtlesim과 rqt는 ros-humble-desktop에 들어 있다. 없으면 sudo apt install ros-humble-turtlesim과 sudo apt install '~nros-humble-rqt*'로 설치한다.
  2. 방향키는 turtle_teleop_key를 실행한 터미널이 받는다. 창이 검거나 안 뜨면 3.2장의 그래픽 설정을 먼저 본다.
  3. 조사 순서는 1.2장과 같다. ros2 node list, node info, topic list -t, topic echo, 필요하면 ros2 interface show로 형식을 확인한다.
  4. 토픽은 topic pub, 서비스는 service call(/spawn, /clear, /reset), 파라미터는 param set, 액션은 action send_goal로 부른다.
  5. rqt_graph는 노드와 토픽의 연결을, rqt_console은 로그를, rqt의 Service Caller와 Message Publisher는 서비스와 토픽을 화면에서 다룬다.
  6. 정사각형은 변마다 속도 명령으로 이동하고 액션으로 방향을 돌려 그린다. 이 구조는 2.7장의 코드가 이어받는다.

확인 문제

Q1. turtle_teleop_key를 실행했는데 방향키를 눌러도 거북이가 움직이지 않습니다. 가장 먼저 확인할 두 가지는?
  1. 키를 누를 때 turtle_teleop_key가 실행 중인 터미널 창이 선택되어 있는지 (거북이 창을 클릭하면 안 됩니다).
  2. 다른 터미널에서 ros2 node list로 /turtlesim과 /teleop_turtle이 모두 보이는지. 하나라도 없으면 그 노드를 다시 실행합니다.
Q2. ros2 service call /spawn 으로 거북이를 하나 더 만든 뒤 ros2 topic list를 보니 새 토픽이 생겼습니다. 어떤 토픽이고 이유는?

/turtle2/cmd_vel, /turtle2/pose 같은 토픽입니다. turtlesim 노드가 거북이마다 이름 공간을 만들어 속도 입력과 위치 출력을 따로 두기 때문입니다. 이름이 turtle2가 아니면 spawn 응답에 나온 이름을 확인하세요.

Q3. 정사각형 실습에서 방향 전환을 시간으로 돌리지 않고 action send_goal로 하는 이유는?

시간으로 돌리면 angular.z와 시간의 곱이 목표 각도와 정확히 같다는 보장이 없어서 변마다 오차가 쌓입니다. 액션은 목표 각도를 받아 그 각도에 도착했는지까지 판단하고 결과를 돌려주므로 끝나기를 기다렸다가 다음 단계로 넘어갈 수 있습니다. -r 1로 속도 명령을 반복하면 거북이가 멈추지 않고 계속 나아가므로 한 변이 2보다 길어집니다.

다음 장

다음 장(3.6장)에서는 패키지와 워크스페이스, colcon이 무엇인지 개념을 정리합니다. 3.7장에서 직접 패키지를 만들어 빌드하면 이 장에서 쓴 ros2 run <패키지> <실행파일>의 패키지 자리에 내가 만든 이름이 들어갑니다.