(1) 다음을 조사하시오
- SLAM의 정의와 원리를 조사하시오.
SLAM(Simultaneous Localization and Mapping)
실시간으로 자신의 위치를 파악하면서 환경 지도를 구축할 수 있도록 하는 것이다.
2D SLAM같은 경 단선 LiDAR를 이용하여 2차원 평면상에서 로봇의 x, y좌표와 회전각을 추정하며 지도를 그린다.
- SLAM 알고리즘의 종류와 장단점을 조사하시오.
(8) ros2용 다른 slam 패키지를 조사하시오. cartographer와 성능을 비교하시오.
| 알고리즘 종류 | 장점 | 단점 |
| EKF-SLAM, FastSLAM | 계산량이 비교적 적어 실시간 처리에 유리하다. | 지도가 커질수록 오차가 누적되며 연산 효율이 급격히 떨어진다. |
| Cartographer, Karto SLAM | 전체 경로를 최적화하여 오차를 보정하는 능력이 뛰어나다. | 그래프가 복잡해지면 많은 메모리와 연산 능력이 필요하다. |
| ORB-SLAM | 환경의 특징(코너, 모서리 등)만 저장하기 때문에 데이터 처리가 빠르다. | 특징이 없는 단순한 환경에서는 작동이 불안정하다. |
(2) 연구실, PC실, 복도 등의 지도를 작성하시오.
jetson LiDAR에서 메모리 부족 오류가 생길 때
jetson
| jetson sudo apt install ros-foxy-rmw-cyclonedds-cpp echo "export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp" >> ~/.bashrc sudo swapoff /swapfile sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab source ~/.bashrc |
Ubuntu
| jazzy sudo apt update sudo apt install ros-jazzy-rmw-cyclonedds-cpp echo "export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp" >> ~/.bashrc source ~/.bashrc |
1. 연구실
xdg-open map_1767291136.pgm
ros2 run rviz2 rviz2
2. 복도
(3) cartographer 설정파일인 lua파일의 설정 파라미터를 조사하시오.
map_frame : 전역 좌표계 이름
tracking_frame : 알고리즘이 위치를 추적할 기준 프레임, SLAM의 중심이 되는 프레임
published_frame : Cartographer가 포즈를 발행할 기준 프레임
odom_frame : 오도메트리 프레임 이름
provide_odom_frame : 오도메트리 프레임을 제공할지 여부를 설정
publish_frame_projected_to_2d : 3D 위치 추정을 하더라도 결과를 2D 평면(Z축 0)으로 투영하여 발행할지 여부
use_odometry : 도메트리 데이터를 사용할지 여부
use_nav_sat : GPS 데이터를 사용할지 여부
use_landmarks : 랜드마크 데이터를 사용할지 여부
num_laser_scans : 사용할 라이다 스캔 데이터의 개수
num_multi_echo_laser_scans : 라이다 센서로부터 받은 다중 에코(laser echo)스캔 데이터의 개수 설정
num_subdivisions_per_laser_scan : : 하나의 스캔 데이터를 몇 개로 쪼개어 처리할지 여부
num_point_clouds :3D LiDAR 등을 사용할 때 입력받을 포인트 클라우드 개수
lookup_transform_timeout_sec : TF(좌표 변환)를 조회할 때 기다릴 최대 시간
submap_publish_period_sec : 생성된 지도 조각을 시각화 도구(Rviz 등)로 보낼 주기설정
pose_publish_period_sec : 로봇의 현재 위치를 발행하는 주기
rangefinder_sampling_ratio : LiDAR 데이터 중 실제 연산에 사용할 비율 <- 1.0 = 100%
imu_sampling_ratio : IMU 데이터 사용 비율
min_range / max_range : LiDAR 센서 값 중 SLAM에 반영할 거리 범위를 미터 단위로 지정
missing_data_ray_length : max_range보다 멀리 있는 데이터가 들어왔을 때, 해당 방향이 비어있다고 간주할 거리
use_imu_data : 2D SLAM에서 IMU 데이터를 활용해 자세를 보정할지 여부
use_online_correlative_scan_matching : 매칭을 시작하기 전, 계산량은 많지만 더 정확한 초기 위치를 찾는 알고리즘을 사용
motion_filter.max_angle_radians : 로봇이 최소 각도만큼은 움직여야 새로운 스캔 데이터를 지도에 업데이트
constraint_builder.min_score : 루프 클로저를 확정 짓기 위한 최소 일치 점수
global_localization_min_score : 전역 위치 추정시 일치 여부를 판단
(4) pgm 파일형식을 설명하고 맵에서 검정색, 흰색, 회색의 의미를 설명하시오.
흑백 이미지 포맷으로 이미지의 각 픽셀 값을 텍스트나 바이너리 형태로 그대로 저장한다.
흰색
로봇이 이동할 수 있는 비어있는 공간
검은색
벽, 가구, 기둥 등 로봇이 지나갈 수 없는 장애물
회색
로봇 센서가 도달하지 못해 정보가 없는 공간.
(5) 최종결과물 map.yaml의 내용을 설명하시오. 파일의 내용을 이용하여 map의 원점의 좌표를 어떻게 구하는지 설명하라.
image: 이미지 파일의 경로
mode : trinary
trinary는 각 픽셀을 장애물, 이동가능, 미탐사세 가지 중 하나로 분류
resolution: 0.050
지도의 해상도 / 0.050( 픽셀 하나가 5cm를 의미 )
origin: [-5.417, -5.521, 0]
지도의 원점 설정값
negate: 0
흰색/검은색의 의미를 반전시킬지 여부
0 <- 반전하지 않음
occupied_thresh: 0.65
이 값보다 큰 점유 확률을 가진 픽셀은 장애물로 간주
free_thresh: 0.196
이 값보다 작은 점유 확률을 가진 픽셀은 이동 가능으로 간주
(6) rqt_graph를 이용하여 slam을 실행하는 동안 모든 노들들이 주고받는 토픽을 조사하시오.
1. cartographer_node
Subscribes
/scan : LiDAR 센서로부터 들어오는 2D 거리 데이터
/tf : 각 센서 및 로봇 프레임 간의 좌표 변환 정보
Publishes
/submap_list : Cartographer가 생성한 로컬 지도 조각 리스트
/trajectory_node_list : 로봇이 이동한 경로상의 노드 정보
/scan_matched_points2 : 스캔 매칭에 사용된 포인트 클라우드 데이터
/constraint_list : 루프 클로저(Loop Closure)를 위한 제약 조건 리스트
/tf : 계산된 로봇의 포즈를 다시 좌표계에 반영
2. cartographer_occupancy_grid_node
Subscribes
/submap_list : cartographer_node에서 보낸 서브맵 정보를 받아온다.
Publishes
/map: 최종적으로 nav2나 rviz에서 사용하는 2D 점유 격자 지도를 발행
3. rviz
Subscribes
/map, /map_updates: 생성된 지도를 화면에 표시
/tf: 로봇과 지도의 위치 관계를 시각화
Publishes
/initialpose :사용자가 지정한 초기 위치 정보를 보낸다.
/goal_pose : 로봇에게 이동할 목표 지점을 전달한다.
/clicked_point: 화면에서 클릭한 지점의 좌표를 발행한다.
| 단계 | 흐름 | 설명 |
| 센서 입력 | /scan → cartographer_node | LiDAR 데이터가 SLAM으로 입력됨 |
| SLAM 연산 | cartographer_node → /submap_list | 스캔 매칭을 통해 조각 지도를 생성함 |
| 지도 생성 | /submap_list → occupancy_grid_node → /map | 조각 지도를 합쳐 하나의 완성된 지도로 변환함 |
| 시각화 | /map, /tf → rviz | 사용자가 현재 지도와 로봇 위치를 확인함 |
| 제어 명령 | rviz → /goal_pose | 사용자가 목표치를 설정하면 내비게이션으로 전달됨 |
(7) (6)에서조사된 토픽에 포함된 정보를 설명하시오.
cartographer_node
| 구분 | 토픽명 | 포함된 주요 정보 및 역할 |
| 센서 데이터 | /scan | LiDAR의 거리(m), 각도(rad), 강도(intensity) 정보. 장애물의 위치를 파악하는 기초 데이터입니다. |
| 좌표 변환 | /tf | 센서와 로봇 본체간의 물리적 거리와 방향 정보를 가져옵니다. |
| 로컬 지도 | /submap_list | 작은 단위로 쪼개진 지도 조각(Submap)들의 ID와 상대적 포즈 정보를 담고 있음 |
| 이동 경로 | /trajectory_node_list | 로봇이 이동하며 위치를 기록한 궤적 점(Point)들의 집합입니다. |
| 시각화 | /scan_matched_points2 | 스캔 데이터가 지도에 맞춰진 결과물, 매칭 정확도를 확인하는 용도 |
| 루프 보정 | /constraint_list | 이전에 왔던 곳을 재방문했을 때 생기는 제약 조건 정보로, 지도 왜곡을 바로잡음 |
| 위치 발행 | /tf | SLAM 연산 결과로 계산된 로봇의 최종 위치(map -> odom)를 시스템 좌표계에 반영 |
cartographer_occupancy_grid_node
| 입력 서브맵 | /submap_list | cartographer_node로부터 생성된 조각 지도를 입력받음 |
| 최종 지도 | /map | 해상도, 원점 좌표, 격자 상태 데이터(−1,0,100)를 포함한 전체 점유 격자 지도 |
rviz
| 구분 | 토픽명 | 포함된 주요 정보 및 역할 |
| 지도 시각화 | /map, /map_updates | 생성된 전체 지도 및 변경된 일부 영역(Patch)을 화면에 출력 |
| 위치 시각화 | /tf | 지도 위에서 로봇의 실시간 위치와 자세를 아이콘으로 표시 |
| 위치 초기화 | /initialpose | 사용자가 수동으로 로봇의 현재 위치를 잡아줄 때의 좌표(x,y)와 방향 정보를 보낸다 |
| 목표 지점 | /goal_pose | 로봇이 가야 할 목적지의 좌표와 자세 정보 |
| 지점 선택 | /clicked_point | 사용자가 지도 상의 특정 지점을 마우스로 클릭했을 때 해당 위치의 x,y,z 좌표를 보낸다. |
(9) gazebo simulator를 이용하여 cartographer를 이용하여 맵을 작성하시오.
https://cafe.daum.net/SmartRobot/RoVa/2456
