ROS2 심화 3
________________________________________________________________________________________
< 사용자 실습>
리눅스
(이전 라이다 퍼블리시와 모터 컨트롤러 코드 패키지 그대로 사용)
rplidar 패키지 실행 : /scan 토픽을 퍼블리시
$ ros2 run rplidar_ros2 rplidar_scan_publisher
dynamixel_workbench_controllers 실행 : cmd_vel 토픽을 서브스크라이브
$ ros2 run dynamixel_workbench_controllers dynamixel_workbench_controllers
-------------------------------------------------------------------------------------------
PC
최종 map을 저장해주는 노드
> ros2 run cartographer_ros occupancy_grid_node -resolution 0.05 -publish_period_sec 1.0
cartographer_node 실행 : submap을 작성하여 퍼블리시하면 occupancy_grid_node 에서 map을 완성
> ros2 run cartographer_ros cartographer_node -configuration_directory C:\Users\ncslab\Downloads -configuration_basename turtlebot3_lds_2d.lua
rviz 실행
> ros2 run rviz2 rviz2
dynamixel_workbench_controllers 실행
>ros2 run dynamixel_workbench_operators dynamixel_workbench_operators
맵 저장
> ros2 run nav2_map_server map_saver_cli
-------------------------------------------------------------------------------------------
결과
저장된 파일
________________________________________________________________________________________
< 실습 과제>
(1) 현대자동차 자율주행교육자료에서 SLAM관련 부분을 읽고 답하시오.
- SLAM의 정의와 원리를 조사하시오.
정의:SLAM(Simultaneous Localization And Mapping) : 지도 생성 및 위치인식을 동시에 해나가는 알고리즘
원리:라이다 또는 카메라 센서로부터 받아오는 정보를 optimization(최적화) 과정을 거쳐서
정확한 3d reconstruction(3차원공간)재구성
- SLAM 알고리즘의 종류와 장단점을 조사하시오.
Visual SLAM(카메라)
Lidar SLAM(라이다)
Lidar는 매 scan 에서 정확한 거리 정보를 담긴 data 가 들어옵니다.
하지만 라이다 센서는 많은 양의 데이터를 생성하므로,
이를 처리하고 저장하는 데 많은 계산 리소스와 저장 공간이 필요합니다.
Camera는 Lidar에 비해 거리 정보가 부정확한 특성을 가지고 있습니다.
또한 camera는어두운 환경이나 극도로 밝거나 반짝이는 조명 조건에서는
시각적인 특징을 추출하는 데도어려움을 겪을 수 있습니다.
-------------------------------------------------------------------------------------------
(2) 연구실, PC실, 복도 등의 지도를 작성하시오.
연구실 지도
복도 지도
-------------------------------------------------------------------------------------------
(3) cartographer 설정파일인 lua파일의 설정 파라미터를 조사하시오.
<turtlebot3_lds_2d.lua>
include "map_builder.lua" --헤더파일 포함
include "trajectory_builder.lua" --헤더파일 포함
options = { -- 옵션 정보들
map_builder = MAP_BUILDER, --맵 작성에 필요한 다양한 구성 요소와 옵션 변수에 저장
trajectory_builder = TRAJECTORY_BUILDER, -- 로봇의 움직임과 센서 데이터를 기반으로 맵을 구성하는 역할을 합니다.
map_frame = "map", --맵을 저장할 프레임의 이름을 지정합니다.
tracking_frame = "laser_frame", -- 로봇의 위치를 추적하는 데 사용되는 프레임의 이름을 지정
published_frame = "laser_frame", --로봇의 위치를 추적하는 데 사용되는 프레임의 이름을 지정
odom_frame = "odom", -- 로봇의 오도메트리 프레임의 이름을 지정합니다.
provide_odom_frame = false, --true로 설정하면 Cartographer가 오도메트리 정보를 생성하고 odom_frame에 게시합니다.
publish_frame_projected_to_2d = true, --Cartographer가 게시되는 프레임을 2D로 투영하여 게시할지 여부를 지정합니다.
use_odometry = false, --Cartographer가 오도메트리 정보를 사용하여 로봇의 위치 추정 및 맵 작성에 활용할지 여부를 지정합니다.기본적으로 use_odometry는 true
use_nav_sat = false, --Cartographer가 GPS(NavSat) 정보를 사용하여 로봇의 위치 추정 및 맵 작성에 활용할지 여부를 지정합니다.
use_landmarks = false, --Cartographer가 랜드마크(Landmark) 정보를 사용하여 로봇의 위치 추정 및 맵 작성에 활용할지 여부를 지정합니다.
num_laser_scans = 1, --Cartographer가 처리할 레이저 스캔 데이터의 개수를 지정합니다.
num_multi_echo_laser_scans = 0, --이 매개 변수는 Cartographer가 처리할 멀티 에코(Multi Echo) 레이저 스캔 데이터의 개수를 지정합니다.
num_subdivisions_per_laser_scan = 1, --Cartographer가 레이저 스캔 데이터를 처리할 때 각 스캔을 몇 개의 하위 분할(subdivision)로 나눌지를 지정합니다.
num_point_clouds = 0, --Cartographer가 처리할 포인트 클라우드(Point Cloud) 데이터의 개수를 지정합니다.
lookup_transform_timeout_sec = 0.2, -- Cartographer가 변환(Transform) 정보를 조회하는 데 사용되는 타임아웃 시간을 지정합니다.
submap_publish_period_sec = 0.3, --Cartographer가 서브맵(Submap)을 게시하는 주기를 지정합니다.
pose_publish_period_sec = 5e-3, --Cartographer가 로봇의 위치 및 자세 정보를 게시하는 주기를 지정합니다.
trajectory_publish_period_sec = 30e-3, --Cartographer가 추정된 로봇의 경로 정보를 게시하는 주기를 지정합니다.
rangefinder_sampling_ratio = 1., -- Cartographer가 레이저 스캐너 데이터를 샘플링하는 비율을 지정합니다.
odometry_sampling_ratio = 0.1, --Cartographer가 오도메트리(Odometry) 데이터를 샘플링하는 비율을 지정합니다.
fixed_frame_pose_sampling_ratio = 1., -- Cartographer가 고정 프레임(Fixed Frame)의 위치 정보를 샘플링하는 비율을 지정합니다.
imu_sampling_ratio = 0.1, --Cartographer가 IMU 데이터를 샘플링하는 비율을 지정합니다.
landmarks_sampling_ratio = 1., --Cartographer가 랜드마크(Landmark) 데이터를 샘플링하는 비율을 지정합니다.
}
MAP_BUILDER.use_trajectory_builder_2d = true --2D 트라젝토리 빌더(Trajectory Builder)를 사용하여 맵을 작성하는 옵션을 활성화하는 역할을 합니다.
TRAJECTORY_BUILDER_2D.min_range = 0.1 --레이저 스캐너 데이터의 최소 감지 거리를 지정합니다.
TRAJECTORY_BUILDER_2D.max_range = 8.0 --레이저 스캐너 데이터의 최대 감지 거리를 지정합니다.
TRAJECTORY_BUILDER_2D.missing_data_ray_length = 3. --레이저 스캐너로부터 누락된 데이터에 대해 생성하는 가상의 레이저 빔의 길이를 지정합니다.
TRAJECTORY_BUILDER_2D.use_imu_data = false --IMU 데이터를 사용하는지 여부를 지정합니다.
TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true --2D 트라젝토리 빌더(Trajectory Builder)에서 온라인 상관 스캔 매칭(Online Correlative Scan Matching)을 사용하는지 여부를 지정합니다.
TRAJECTORY_BUILDER_2D.motion_filter.max_angle_radians = math.rad(0.1) --모션 필터(Motion Filter)의 최대 회전 각도를 지정합니다.
POSE_GRAPH.constraint_builder.min_score = 0.65 --Pose Graph의 Constraint Builder에서 사용되는 제약 조건의 최소 점수를 지정합니다.
POSE_GRAPH.constraint_builder.global_localization_min_score = 0.7 --전역 위치 추정(Global Localization)에 사용되는 제약 조건의 최소 점수를 지정합니다.
return options -- 옵션 정보들 리턴
-------------------------------------------------------------------------------------------
(4) pgm 파일형식을 설명하고 파일을 열어서 내용을 확인하시오.
PGM(Portable Gray Map)은 이미지 파일 형식 중 하나로, 흑백 이미지를 저장하는 데 사용됩니다. PGM 파일은 픽셀 값을 그레이스케일 값으로 표현하며, 각 픽셀은 0부터 최대 그레이스케일 값까지의 범위 내에서 정의됩니다.
-------------------------------------------------------------------------------------------
(5) 최종결과물 map.yaml의 내용을 설명하시오.
<map.yaml>
#생성된 맵의 이미지 파일 이름
image: map_1688712250
#맵 데이터를 흑백 이미지로 표현하는 방식
#밝은 영역, 중간 영역, 어두운 영역을 세 가지 값으로 구분하여 맵의 구성 요소를 표현.
mode: trinary
#해상도를 지정 ,맵의 각 픽셀이 0.05 미터
resolution: 0.05
#맵 데이터의 원점(origin) 위치를 지정
origin: [-6.38, -1.88, 0]
#negate: 1로 설정되어 있다면, 맵 데이터의 픽셀 값이 반전
negate: 0
#장애물로 판단되는 픽셀 값의 임계치를 나타냅니다.
occupied_thresh: 0.65
#맵 데이터에서 빈 공간으로 판단되는 픽셀 값의 임계치를 지정합니다.
free_thresh: 0.25
-------------------------------------------------------------------------------------------
(6) rqt_graph를 이용하여 slam을 실행하는 동안 모든 노들들이 주고받는 토픽을 조사하시오.
토픽 리스트 확인
$ ros2 topic list
/clicked_point
사용자가 클릭한 지점에 대한 정보를 전달하기 위해 활용됩니다.
/cmd_vel
로봇의 선속도(linear velocity)와 각속도(angular velocity)를 나타내는 메시지를 보내 로봇을 제어합니다
/constraint_list
봇 제어 시스템에서 경로 계획기나 제어기에게 제약 조건을 전달하기 위해 사용됩니다.
/dynamixel_state
다이나믹셀(Dynamixel) 서보 모터의 상태 정보를 전달하기 위해 사용됩니다.
/goal_pose
로봇 경로 계획이나 제어에서 목표 위치와 방향 정보를 전달하기 위해 사용됩니다.
/initialpose
로봇의 초기 위치와 방향 정보를 설정하기 위해 사용됩니다.
/joint_states
로봇의 관절 상태 정보를 전달하기 위해 사용됩니다.
/landmark_poses_list
랜드마크(Landmark)의 위치와 방향 정보를 리스트 형태로 전달하기 위해 사용됩니다.
/map
로봇의 지도(Map) 정보를 전달하기 위해 사용됩니다.
/map_updates
동적인 지도 업데이트 정보를 전달하기 위해 사용됩니다.
/parameter_events
파라미터(Parameter) 이벤트 정보를 전달하기 위해 사용됩니다.
/rosout
로봇 시스템 및 노드에서 발생하는 로그 메시지를 전달하기 위해 사용됩니다.
/scan
라이다(Lidar) 센서에서 수신한 거리 데이터를 전달하기 위해 사용됩니다.
/scan_matched_points2
스캔 매칭(Scan Matching) 알고리즘을 통해 처리된 매칭된 포인트 데이터를 전달하기 위해 사용됩니다.
/submap_list
서브맵(Submap) 리스트 정보를 전달하기 위해 사용됩니다.
/tf
로봇의 변환(Transform) 정보를 전달하기 위해 사용됩니다.
/tf_static
정적인 변환(Transform) 정보를 전달하기 위해 사용됩니다.
정적인 변환 정보는 로봇의 프레임 간의 고정된 위치와 방향 변환을 나타냅니다.
/trajectory_node_list
로봇의 경로 노드(Trajectory Node) 리스트 정보를 전달하기 위해 사용됩니다.
-------------------------------------------------------------------------------------------
(7) (6)에서조사된 토픽의 자료형을 설명하시오.
자료형까지 확인 -t 옵션
$ ros2 topic list -t
/clicked_point [geometry_msgs/msg/PointStamped]
좌표와 회전 정보가 포함
로봇이나 시뮬레이션 환경에서 이 지점을 활용하여 움직임이나 작업을 수행 가능.
/cmd_vel [geometry_msgs/msg/Twist]
/cmd_vel 토픽을 통해 로봇으로 전송하면, 로봇은 해당 속도에 따라 움직이거나 회전합니다.
/constraint_list [visualization_msgs/msg/MarkerArray]
메시지는 여러 개의 제약 조건을 포함할 수 있는 리스트 형태의 메시지입니다.
각 제약 조건은 최대 속도, 최대 가속도, 회전 반경 등과 같은 제약 조건의 종류와 해당 값을 포함합니다.
/dynamixel_state [dynamixel_workbench_msgs/msg/DynamixelStateList]
메시지는 다이나믹셀 서보 모터의 상태 정보를 담고 있습니다.
(서보 모터의 이름, 현재 위치, 속도, 하중 및 토크 등)
/goal_pose [geometry_msgs/msg/PoseStamped]
3D 공간 상의 위치와 방향 정보를 담고 있습니다.
메시지에는 위치(x, y, z 좌표)와 방향(롤, 피치, 요우) 정보가 포함됩니다.
/initialpose [geometry_msgs/msg/PoseWithCovarianceStamped]
3D 공간 상의 위치와 방향 정보를 담고 있습니다.
메시지에는 위치(x, y, z 좌표)와 방향(롤, 피치, 요우) 정보+위치와 방향에 대한 불확실성(covariance) 정보 포함.
/joint_states [sensor_msgs/msg/JointState]
로봇의 각 관절의 이름, 위치, 속도, 토크 등의 정보가 포함됩니다.
/landmark_poses_list [visualization_msgs/msg/MarkerArray]
메시지는 시각화 목적으로 사용되며, 여러 개의 시각화 메시지를 담을 수 있는 배열 형태의 메시지입니다.
/map [nav_msgs/msg/OccupancyGrid]
로봇의 환경 지도를 표현하기 위해 사용됩니다. 메시지에는 2D 또는 3D 공간을 격자(Grid)로 분할한 후, 각 격자 셀의 상태 정보를 나타냅니다.
/map_updates [map_msgs/msg/OccupancyGridUpdate]
기존 지도에 대한 업데이트 정보를 담고 있습니다.
메시지에는 업데이트가 발생한 격자 셀의 인덱스와 해당 셀의 새로운 상태 정보가 포함됩니다.
/parameter_events [rcl_interfaces/msg/ParameterEvent]
파라미터 이벤트 정보를 담고 있습니다.
메시지에는 파라미터의 이름, 변경 사항 유형(추가, 업데이트, 삭제), 변경된 값 등의 정보가 포함됩니다.
/rosout [rcl_interfaces/msg/Log]
메시지는 로봇 시스템이나 노드에서 발생하는 로그 정보를 담고 있습니다.
메시지에는 로그의 심각도(level), 타임스탬프, 로그 내용 등의 정보가 포함됩니다.
/scan [sensor_msgs/msg/LaserScan]
라이다 센서에서 얻은 거리 데이터, 각도, 범위, 각도 해상도 등의 정보가 포함됩니다.
/scan_matched_points2 [sensor_msgs/msg/PointCloud2]
메시지에는 3D 포인트 클라우드 데이터가 포함됩니다.
메시지에는 각 포인트의 좌표, 강도, 색상 등의 정보가 포함될 수 있습니다.
/submap_list [cartographer_ros_msgs/msg/SubmapList]
여러 개의 서브맵 정보가 포함됩니다.
각 서브맵은 ID, 위치, 방향, 크기 등의 속성을 가지며, 지도 작성에 사용됩니다.
/tf [tf2_msgs/msg/TFMessage]
변환 정보와 함께 해당 변환의 프레임 ID, 타임스탬프 등의 정보를 가지고 있습니다.
/tf_static [tf2_msgs/msg/TFMessage]
변환 정보와 함께 해당 변환의 프레임 ID, 타임스탬프 등의 정보를 가지고 있습니다.
/trajectory_node_list [visualization_msgs/msg/MarkerArray]
여러 개의 마커(Marker)를 포함하는 배열 형태의 메시지입니다.
다음과 같은 필드를 포함합니다.
header: 메시지의 헤더 정보를 포함합니다.
markers: 마커들의 배열입니다. 각 마커는 식별자(ID), 위치, 방향, 색상, 크기, 유형 등의 속성을 가지고 있습니다.
-------------------------------------------------------------------------------------------
(8) ros2용 다른 slam 패키지를 조사하시오. cartographer와 성능을 비교하시오.
Hector SLAM:
- 특징:
- 실시간으로 작동하는 SLAM 알고리즘으로, 비교적 저사양 하드웨어에서도 높은 성능을 발휘
- 메모리 사용량이 적으며, 작은 메모리 용량에서도 효과적으로 동작
- 2D 라이다 데이터를 사용하여 지도를 작성하고 로봇의 위치를 추정하는 데 주로 사용
- 성능:
- Hector SLAM은 맵 작성을 위한 경량 알고리즘을 사용. 일반적으로 Cartographer보다 낮은 정확성을 가짐
- 단순한 환경에서는 효과적이지만, 복잡한 환경이나 고도차 지형에서는 성능이 저하
GMapping:
- 특징:
- 2D 스캔 매핑 알고리즘으로, 라이다 데이터를 기반으로 지도 작성과 로봇 위치 추정을 수행
- Rao-Blackwellized 파티클 필터(Rao-Blackwellized Particle Filter)를 기반으로한 SLAM 알고리즘
- 성능:
- Cartographer보다 상대적으로 정확한 맵을 그려내지 못함
- 정확성과 처리 속도는 Cartographer보다 낮을 수 있으나, 저비용 센서와 낮은 컴퓨팅 자원에서도 잘 작동함
________________________________________________________________________________________