1. 실습 전 확인 사항
Navigation2를 실행하기 전에 반드시 아래 항목을 확인합니다.
TurtleBot3 전원이 켜져 있어야 합니다.
Remote PC와 TurtleBot3가 같은 네트워크에 연결되어 있어야 합니다.
TurtleBot3 SBC의 IP 주소는 다음과 같습니다. 실습 팀별로 IP 주소는 다릅니다. 주의하셔서 적용하시기 바랍니다.
192.168.200.27
SLAM으로 생성한 지도 파일이 Remote PC에 있어야 합니다.
일반적으로 지도 파일은 다음 위치에 저장되어 있다고 가정합니다.
$HOME/map.yaml
$HOME/map.pgm
또한 TurtleBot3 모델, ROS_DOMAIN_ID, DDS 설정은 .bashrc에 이미 등록되어 있으므로 이번 실습에서는 매번 export하지 않습니다.
예를 들어 .bashrc에는 다음과 같은 설정이 들어가 있을 수 있습니다.
export TURTLEBOT3_MODEL=burger
export ROS_DOMAIN_ID=30
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
설정 후에는 터미널을 새로 열거나 아래 명령을 실행해야 적용됩니다.
source ~/.bashrc
2. TurtleBot3 SBC 접속하기
Remote PC에서 새 터미널을 엽니다. 터미널에서 TurtleBot3 SBC에 SSH로 접속합니다.
ssh sjyong@192.168.200.27
접속이 완료되면 TurtleBot3 SBC 내부 터미널에 들어온 상태가 됩니다.
3. TurtleBot3 Bringup 실행하기
TurtleBot3 SBC에 접속한 터미널에서 Bringup을 실행합니다.
ros2 launch turtlebot3_bringup robot.launch.py
정상적으로 실행되면 센서, 모터, LiDAR, TF 관련 노드들이 실행됩니다.
이 터미널은 계속 켜둡니다.
중간에 종료하면 Navigation2가 로봇 상태와 센서 데이터를 받을 수 없으므로 자율 주행이 정상적으로 동작하지 않습니다.
4. Remote PC에서 Navigation2 실행하기
Remote PC에서 새 터미널을 하나 더 엽니다.
.bashrc 설정이 적용되어 있는지 확인하기 위해 아래 명령을 실행합니다.
echo $TURTLEBOT3_MODEL
echo $ROS_DOMAIN_ID
echo $RMW_IMPLEMENTATION
예상 출력 예시는 다음과 같습니다.
burger
30
rmw_fastrtps_cpp
이제 Navigation2를 실행합니다.
ros2 launch turtlebot3_navigation2 navigation2.launch.py map:=$HOME/maps/map.yaml
정상적으로 실행되면 RViz2가 함께 실행되고, 저장된 지도가 화면에 표시됩니다.
여기서 사용하는 지도는 SLAM 실습에서 저장한 지도입니다.
만약 지도 파일 이름이나 위치가 다르다면 map:= 뒤의 경로를 실제 지도 파일 위치로 변경해야 합니다.
5. RViz2 화면 확인하기
Navigation2가 실행되면 RViz2 화면에서 다음 항목을 확인합니다.
지도 Map이 정상적으로 표시되는지 확인합니다.
LiDAR 스캔 데이터가 표시되는지 확인합니다.
로봇 모델 또는 TF가 지도 위에 표시되는지 확인합니다.
왼쪽 Displays 패널에서 에러가 계속 발생하는 항목이 없는지 확인합니다.
처음 실행 직후에는 로봇의 위치가 실제 위치와 다르게 보일 수 있습니다.
이 상태에서는 바로 목적지를 지정하면 안 됩니다.
먼저 초기 위치 추정을 해야 합니다.
6. 초기 위치 설정하기
Navigation2를 사용할 때 가장 먼저 해야 하는 작업은 초기 위치 설정입니다.
RViz2 상단 메뉴에서 다음 버튼을 클릭합니다.
2D Pose Estimate
그 다음 지도 위에서 실제 TurtleBot3가 있는 위치를 클릭합니다.
클릭한 상태로 드래그하여 로봇이 바라보는 방향으로 초록색 화살표를 맞춥니다.
여기서 중요한 것은 위치뿐만 아니라 방향까지 맞추는 것입니다.
화살표의 시작점은 로봇의 현재 위치입니다.
화살표의 방향은 로봇이 바라보는 방향입니다.
초기 위치를 한 번만 찍고 끝내지 말고, LiDAR 데이터가 지도와 최대한 겹칠 때까지 여러 번 반복합니다.
LiDAR 데이터가 벽이나 장애물 위치와 잘 맞으면 초기 위치 설정이 어느 정도 완료된 것입니다.
7. 키보드 조작으로 위치 추정 보정하기
초기 위치를 설정한 뒤에는 키보드 조작으로 로봇을 조금 움직여 위치 추정을 안정화합니다.
Remote PC에서 새 터미널을 엽니다.
키보드 조작 노드를 실행합니다.
ros2 run turtlebot3_teleop teleop_keyboard
로봇을 아주 조금씩 앞뒤로 움직입니다.
예를 들어 전진과 후진을 짧게 반복합니다.
w : 전진
x : 후진
a : 좌회전
d : 우회전
s : 정지
이 작업을 하면 AMCL이 주변 LiDAR 데이터를 이용해서 로봇의 위치 추정을 더 정확하게 맞춥니다.
RViz2 화면에서 작은 초록색 화살표들이 로봇 주변으로 모이는 것을 확인할 수 있습니다.
초록색 화살표들이 넓게 퍼져 있으면 위치 추정이 불안정한 상태입니다.
초록색 화살표들이 좁게 모이면 위치 추정이 안정된 상태입니다.
위치가 어느 정도 맞으면 키보드 조작 노드를 반드시 종료합니다.
Ctrl + C
이 과정이 중요합니다.
키보드 조작 노드가 계속 켜져 있으면 Navigation2와 teleop 노드가 동시에 /cmd_vel 명령을 보낼 수 있습니다.
그러면 로봇 움직임이 불안정해질 수 있습니다.
따라서 Navigation 목표를 보내기 전에는 키보드 조작 노드를 반드시 종료합니다.
8. Navigation 목표 지점 설정하기
초기 위치 설정이 끝났다면 이제 목적지를 지정합니다.
RViz2 상단 메뉴에서 다음 버튼을 클릭합니다.
Navigation2 Goal
지도 위에서 로봇이 이동할 목표 위치를 클릭합니다.
클릭한 상태로 드래그하여 목표 지점에서 로봇이 바라볼 방향을 지정합니다.
초록색 화살표가 표시됩니다.
화살표의 시작점은 목표 위치입니다.
화살표의 방향은 목표 지점에서 로봇이 바라볼 방향입니다.
마우스를 놓는 순간 TurtleBot3가 바로 이동을 시작합니다.
따라서 목표를 찍기 전에 주변에 장애물이 없는지 반드시 확인해야 합니다.
9. 로봇 이동 확인하기
목표 지점을 지정하면 RViz2에서 경로가 생성됩니다.
일반적으로 화면에 전역 경로와 지역 경로가 표시됩니다.
로봇은 생성된 경로를 따라 목적지까지 이동합니다.
이때 확인할 내용은 다음과 같습니다.
로봇이 지도상의 경로를 따라 이동하는지 확인합니다.
실제 로봇 위치와 RViz2의 로봇 위치가 크게 어긋나지 않는지 확인합니다.
장애물 근처에서 너무 가까이 붙지 않는지 확인합니다.
목표 지점에 도착했을 때 방향까지 맞추는지 확인합니다.
목표 지점에 도착하면 로봇은 정지합니다.
만약 로봇이 엉뚱한 방향으로 이동하거나 경로를 찾지 못한다면 초기 위치 설정이 잘못되었을 가능성이 큽니다.
이 경우 다시 2D Pose Estimate를 사용해서 로봇 위치를 맞춘 뒤 재시도합니다.
10. 실습 중 자주 발생하는 문제
첫 번째 문제는 RViz2에 지도가 보이지 않는 경우입니다.
이 경우 지도 파일 경로를 확인해야 합니다.
ls $HOME/map.yaml
ls $HOME/map.pgm
파일이 없다면 SLAM 실습에서 지도를 다시 저장해야 합니다.
두 번째 문제는 로봇이 움직이지 않는 경우입니다.
먼저 Bringup이 실행 중인지 확인합니다.
TurtleBot3 SBC 터미널에서 다음 명령이 실행되어 있어야 합니다.
ros2 launch turtlebot3_bringup robot.launch.py
또한 Remote PC와 SBC의 ROS_DOMAIN_ID가 같은지 확인합니다.
echo $ROS_DOMAIN_ID
Remote PC와 TurtleBot3 SBC의 값이 다르면 ROS 2 노드가 서로 통신하지 못합니다.
세 번째 문제는 LiDAR 데이터가 지도와 맞지 않는 경우입니다.
이 경우 초기 위치 설정이 잘못된 것입니다.
RViz2에서 2D Pose Estimate를 다시 클릭하고 실제 로봇 위치와 방향을 다시 지정합니다.
그 후 키보드 조작으로 로봇을 조금 움직여 AMCL 위치 추정을 안정화합니다.
네 번째 문제는 로봇이 목적지로 가다가 벽에 너무 가까이 붙는 경우입니다.
이 경우 Navigation2 파라미터 중 costmap 관련 설정을 조정해야 합니다.
특히 다음 값을 확인합니다.
inflation_layer:
inflation_radius
cost_scaling_factor
inflation_radius는 장애물 주변에 접근 금지 영역을 얼마나 넓게 만들지 결정합니다.
값을 크게 하면 로봇이 장애물에서 더 멀리 떨어져 이동합니다.
cost_scaling_factor는 장애물 주변 costmap 값이 줄어드는 정도를 결정합니다.
값을 너무 크게 하면 장애물을 피하는 여유가 줄어들 수 있습니다.
좁은 공간에서 로봇이 벽에 붙는다면 inflation_radius를 조금 키우는 방식으로 튜닝합니다.
11. Navigation2 속도 튜닝하기
TurtleBot3 Navigation2 파라미터는 다음 파일에서 수정할 수 있습니다.
turtlebot3_navigation2/param/${TURTLEBOT3_MODEL}.yaml
Burger 모델을 사용한다면 일반적으로 다음 파일을 확인합니다.
turtlebot3_navigation2/param/burger.yaml
주행 속도와 관련된 대표 파라미터는 다음과 같습니다.
max_vel_x
min_vel_x
max_vel_theta
min_speed_theta
max_speed_xy
min_speed_xy
acc_lim_x
acc_lim_theta
decel_lim_x
decel_lim_theta
max_vel_x는 전진 최대 속도입니다.
처음 실습할 때는 너무 빠르게 설정하지 않는 것이 좋습니다.
속도가 너무 빠르면 경로 추종이 불안정해지고, 좁은 공간에서 장애물 회피가 어려워질 수 있습니다.
max_vel_theta는 회전 최대 속도입니다.
이 값이 너무 크면 로봇이 급하게 회전합니다.
초보 실습에서는 속도를 낮춰서 안정적으로 확인하는 것이 좋습니다.
예를 들어 실습 환경이 좁다면 다음과 같은 방향으로 튜닝합니다.
max_vel_x: 0.15
max_vel_theta: 1.0
acc_lim_x: 0.5
acc_lim_theta: 1.0
정확한 값은 로봇 상태, 바닥 마찰, 실습 공간 크기에 따라 달라집니다.
처음에는 느리게 시작하고, 안정적으로 움직이면 조금씩 올리는 방식이 안전합니다.
12. 목표 도착 허용 오차 조정하기
목표 지점에 도착했는데 로봇이 계속 미세하게 움직이는 경우가 있습니다.
이때는 목표 허용 오차를 확인합니다.
대표 파라미터는 다음과 같습니다.
xy_goal_tolerance
yaw_goal_tolerance
xy_goal_tolerance는 목표 위치에 대해 허용할 거리 오차입니다.
yaw_goal_tolerance는 목표 방향에 대해 허용할 각도 오차입니다.
값이 너무 작으면 로봇이 목표 지점에서 계속 위치와 방향을 맞추려고 움직일 수 있습니다.
실습에서는 너무 정밀하게 맞추는 것보다 안정적으로 도착하는 것이 중요합니다.
따라서 처음에는 허용 오차를 너무 작게 설정하지 않는 것이 좋습니다.
13. 실습 종료하기
Navigation2 실습을 종료할 때는 실행 중인 터미널에서 각각 종료합니다.
Navigation2가 실행 중인 Remote PC 터미널에서 다음을 입력합니다.
Ctrl + C
TurtleBot3 Bringup이 실행 중인 SBC 터미널에서도 다음을 입력합니다.
Ctrl + C
SSH 접속을 종료하려면 다음 명령을 입력합니다.
exit
로봇 전원을 끄기 전에 모든 ROS 2 노드가 종료되었는지 확인합니다.
14. 전체 실행 순서 요약
1) TurtleBot3 SBC 접속
ssh ubuntu@192.168.200.27
2) Bringup 실행
ros2 launch turtlebot3_bringup robot.launch.py
3) Remote PC에서 Navigation2 실행
ros2 launch turtlebot3_navigation2 navigation2.launch.py map:=$HOME/map.yaml
4) RViz2에서 초기 위치 설정
2D Pose Estimate
5) 키보드 조작 실행
ros2 run turtlebot3_teleop teleop_keyboard
6) 로봇을 조금 움직여 위치 추정 보정
키보드 조작 종료
Ctrl + C
7) RViz2에서 목표 지점 설정
Navigation2 Goal
8) 로봇 자율 주행 확인
9) 실습 종료
Ctrl + C