이 포스트는 theconstructsim.com의 ROS Navigation in 5 Days 를 참고하였습니다.
이번 포스트에서 다룰 내용은
- ROS Navigation에서 맵핑(Mapping)이란 무엇인가?
- ROS Mapping은 어떻게 동작하는가?
- 대부분의 어떠한 로봇에서라도 맵핑이 동작하도록 ROS를 설정하는 방법
- 지도를 만드는 여러가지 방법
이번 course에서는 turtlebot simulation package를 사용합니다. 아래 링크를 참조하세요
emanual.robotis.com/docs/en/platform/turtlebot3/simulation/
시뮬레이션 모델은 Waffle 모델을 사용합니다.
waffle 모델을 사용하기 위해서는 환경 변수를 추가하거나, bash shell에 해당 명령을 입력하면 됩니다.
$ export TURTLEBOT3_MODEL=waffle
또는, ~/.bashrc 를 수정하여 맨 밑에 export TURTLEBOT3_MODEL=waffle 를 추가합니다.
여기서 말하는 내비게이션이란, 우리가 일반적으로 차를 운전하면서 사용하는 내비게이션처럼 단순히 길만 찾는것이 아닌, 해당 경로를 따라 주행까지 하는 것을 말합니다.
만약 이전의 포스트의 내용을 다 이해하셨다면, 내비게이션의 실행을 위해서는 주변 환경에 대한 지도가 필요하다는 것은 알게 되었을 것입니다. 로봇은 이 지도를 경로 계획, 장애물 회피 등 여러가지에 사용합니다.
우리는 이전에 이미 만들어진 지도를 사용할 수도 있고, 직접 만들 수도 있습니다. 일반적으로는 직접 만드는 방법을 사용합니다. 이번 포스트에서는 맵을 직접 만드는 법에 대해 좀 더 자세히 알아보겠습니다.
시작 전에, 우리는 ROS Navigation에서 매우 중요한 툴인 RViz를 사용해서 맵핑 프로세스를 시각화하는 방법에 대해 알아보겠습니다.
RViz를 사용한 맵핑의 시각화
이전에 보았듯이, 맵핑 프로세스를 보기 위해 RViz를 실행하여 이를 GUI환경에서 볼 수 있습니다. 우리는 맵핑을 위해서 기본적으로 2가지 데이터를 RViz에서 나타낼 것입니다.
- LaserScan Display
- Map Display
- 연습 2.1
다음 명령으로 turtlebot3 시뮬레이션 환경과 slam node를 실행합니다.
$ roslaunch turtlebot3_gazebo turtlebot3_house.launch
$ roslaunch turtlebot3_slam turtlebot3_slam.launch
slam node를 실행하면 기존에 설정된 RViz가 실행될 것인데, 지금은 RViz의 사용법을 알아보기 위해에 추가로 RViz를 하나 더 실행하겠습니다.
$ rviz
레이저 데이터의 시각화
rviz를 실행하면 위와 같은 화면이 보일 것입니다. 왼쪽 하단의 Add를 클릭합니다
LaserScan을 더블클릭합니다.
LaserScan의 topic을 설정해줍니다.
topic까지 설정해주면 레이저 데이터가 보이긴 하는데, 너무 작아서 잘 보이지 않을 것입니다. size를 좀 키워주면 점들이 잘 보입니다. 키보드로 숫자를 직접 입력해주면 됩니다.
RobotModel을 추가하면 로봇도 확인할 수 있습니다.
지도의 시각화
왼쪽 하단의 Add를 누르고, Map을 더블클릭합니다.
Map의 topic을 설정해주면, slam을 통해 만들어진 지도를 볼 수 있습니다.
- 연습 2.1 끝
이제 RViz를 사용하여 맵핑 프로세스와 지도를 시각화 하는 방법을 알았습니다.
하지만, 이렇게 우리가 원하는 데이터들을 시각화 하였으나, RViz를 종료 후 다시 실행하면 추가했던 플러그인들은 모두 사라지고, 초기 상태로 실행됩니다. 매번 이렇게 원하는 데이터들을 시각화하기 위한 설정을 다시 해주기는 귀찮으므로, 현재 상태를 저장하여 다음에도 사용할 수 있도록 하는 기능이 있습니다.
RViz 설정 저장
왼쪽 상단의 File - Save Config를 클릭하여 원하는 경로에 저장합니다. 이를 나중에 다시 불러오기를 해도 되고, 나중에 launch파일 생성 시, 이 파일의 경로를 추가하여 자동으로 실행되도록 할 수도 있습니다.
SLAM
SLAM이란, Simultaneous Localization and Mapping 즉, 동시적 위치추적 및 지도작성 입니다. 이는 알려지지 않은 환경의 지도를 작성하며, 작성중인 그 지도에서 로봇의 위치를 추적하는 로봇의 문제를 의미합니다. 요약하자면, 우리는 지도를 만들기 위해서는 SLAM을 해야 한다는 것입니다.
The gmapping package
gmapping ROS 패키지는 gmapping이라고 불리는 특정 SLAM 알고리즘을 구현한 것입니다. 이는 누군가가 gmapping알고리즘을 ROS에 이미 구현해뒀으며, 우리는 이 코드에 대해 알 필요는 없다는 것입니다. 만약 우리가 ROS Navigation stack을 사용한다면, 단지 사용할 로봇에 맞도록 gmapping을 설정하는 방법만 알면 됩니다.
gmapping 패키지는 로봇이 움직이는 동안 제공하는 주변 환경을 나타내는 레이저 데이터와 위치 및 방향 데이터를 사용하여 2D 지도를 만들게 해주는 slam_gmapping이라는 패키지를 포합니다. 이 node는 레이저 센서와 로봇의 좌표변환(transform)데이터를 읽고, 이를 점유 격자 지도(occupancy grid map, OGM)로 바꿉니다.
우리가 이전의 연습 및 예제에서 실행해본 것들은 다음과 같습니다.
- 이미 만들어진 configuration launch 파일을 실행하여 turtlebot3을 사용한 gmapping 패키지를 launch했습니다.
- 이 launch파일은 slam_gmapping node를 실행했고, 그 후에 우리는 로봇을 움직여봤습니다.
- 다음으로, slam_gmapping node는 필요한 데이터를 얻기 위해 레이저 센서의 데이터와 transform topics를 subscribe했고, 이를 바탕으로 지도를 작성했습니다.
- 생성된 지도는 전체 프로세스가 진행되는 동안 /map topic으로 publish되었으며, RViz로 이 데이터를 시각화 했습니다.
/map topic은 nav_msgs/OccupancyGrid 타입의 메시지를 사용합니다. Occupancy는 0부터 100 까지의 정수로 나타냅니다. 0은 완전한 자유 공간(free space)를 의미하며, 100은 완전하게 점유된(occupied) 공간을 의미하고, 이 범위 밖의 특별한 값 -1 은 알려지지 않은 공간을 의미합니다.
이제, 다음과 같은 질문을 생각해 보겠습니다.
- 만약 로봇의 중앙이 아닌 다른쪽에 레이저 센서가 있다면?
- 레이저 센서 대신 Kinect를 사용한다면?
- turtlebot3가 아닌 다른 로봇으로 맵핑을 하고 싶다면?
먼저, 기존에 만들었던 지도에 대해 좀 더 알아보겠습니다.
이전 포스트에서, SLAM을 통해 지도를 제작했었습니다. 지도를 저장할 때, -f 옵션으로 지도의 이름을 지정할 수도 있습니다. 지정해주지 않으면 map.png, map.yaml로 저장됩니다.
$ rosrun map_server map_saver -f <name_of_map>
YAML File
yaml파일을 텍스트 편집기로 열어보면, 다음과 같습니다.
만들어진 YAML 파일은 다음과 같이 6개의 부분으로 나뉩니다.
- image: 생성된 지도 파일의 이름
- resolution: 지도의 해상도(미터/픽셀)
- origin: 지도에서 왼쪽 하단 픽셀의 좌표. 2D 좌표(x, y)로 주어집니다. 세 번째 값은 회전을 나타냅니다. 지금은 회전이 없으므로 0입니다.
- occupied_thresh: 점유 구역을 결정하는 threshold값입니다 이 값보다 크면 점유 구역으로 여깁니다.
- free_thresh: 자유 구역을 결정하는 threshold값입니다. 이 값보다 작으면 자유 공간으로 여깁니다.
- negate: 지도의 색을 바꿉니다. 기본값으로는 흰 색은 자유 공간이고 검은색은 점유 공간입니다.
Image File (PGM)
생성된 이미지 파일을 열어보면 다음과 같습니다.
이 파일은 text파일이 아니라 PGM(Portable Gray Map) 파일이기 때문에, 우리는 이 파일로부터 텍스트 에디터로는 딱히 중요한 정보를 얻을 수 없습니다. 이를 시각화 하기 위해서는 이미지 편집 파일을 사용해야 합니다. 이미지 편집기 또는 이미지 뷰어 프로그램으로 확인해보면 다음과 같습니다(로봇의 움직임에 따라 지도가 다르게 나올 수 있습니다).
이 이미지는 로봇의 환경에 대응되는 각각의 픽셀의 점유 상태를 묘사합니다. 흰색은 자유 공간, 검은색은 점유 공간, 회색은 알려지지 않은 공간입니다. 각 부분은 YAML 파일의 threshold값을 사용하여 나눕니다.
ROS 메시지를 사용하여 통신을 할 때, 점유(occupancy)는 0부터 100 까지 범위의 정수로 나타내어집니다. 0은 완전히(completely) 자유 구역이고, 100은 완전히 점유 구역이며, 특별한 값 -1은 완전히 알 수 없는 구역입니다.
Providing the map
map_server 패키지는 map_saver 뿐 아니라 map_server node도 있는데, 이 node는 저장공간으로부터 맵 파일을 읽고 ROS service를 통해 이를 요청하는 다른 node에게 제공합니다.
많은 node들은 map_server에 현재 로봇이 움직이는 지도를 요청합니다. 예를 들어, 이 요청은 지도로부터 데이터를 얻거나 경로 계획(path planning)을 수행하기 위해 move_base node에서 처리되거나, 로봇이 어디 있는지 알아내기 위해 localizatoin node에서 처리됩니다. 이 지도를 얻기 위한 service 호출은 다음과 같습니다
- static_map (nav_msgs/GetMap): 이 서비스를 통해 지도의 점유 데이터를 제공
위에 설명했던 서비스를 통해 요청하는 지도와 다르게, 지도의 데이터를 가진 ROS 메시지를 얻기 위해 사용할 수 있는 두 가지의 topic들이 있습니다.
- *map_metadata (nav_msgs/MapMetaData): 이 topic을 통해 지도의 metadata를 제공
- *map (nav_msgs/OccupancyGrid): 이 topic을 통해 지도의 점유 데이터 제공
map server node를 launch하기 위한 명령
주어진 맵 파일의 정보를 제공하기 위해 map_server node를 launch하기 위해서는 다음 명령을 사용합니다
$ rosrun map_server map_server <map_file.yaml>
이전에 실행했던 내비게이션의 예제에서는 launch파일에서 이 명령을 실행하도록 하였기 때문에 굳이 터미널에서 이를 실행하지 않아도 됐습니다. launch 파일에서 이 node를 실행하도록 기술하지 않는다면, 이렇게 직접 터미널에서 실행해줘야합니다.
- 연습 2.2.
map_server node를 다음 명령을 사용하여 실행합니다. 예제 1.에서 만들었던 지도를 사용합니다.
$ rosrun map_server map_server map.yaml
해당 지도에 대한 정보를 확인해봅니다.
- 연습 2.2 끝
이전의 연습에서, 우리는 map_server node가 지도 데이터를 제공하기위해 쓴 topic들을 확인하였습니다. 하지만 이전에 말했듯이, 이 node는 service를 통해서도 이 데이터를 얻을 수 있다고 했습니다. 이는 다음과 같은 service를 사용합니다.
- static_map (nav_msgs/GetMap): 이 service를 통해 지도 점유 데이터를 제공
- 연습 2.3.
연습 2.2와 같은 데이터를 service를 통해 얻는 것을 확인해보기 위해, 다음과 같이 명령을 입력합니다.
$ rosservice call /static_map "{}"
- 연습 2.3 끝
위에서 설명했던 지도 작성 방법에 대해 알아야 할 점이 있습니다
- 우리가 만든 지도는 정적(static) 지도입니다. 이는 지도가 만들어진 상태에서 변하지 않고 계속 그대로 남아있는 것입니다. 그래서 우리가 지도를 만들 때, 맵핑 프로세스가 진행중인 그 순간의 환경만을 나타냅니다. 따라서 나중에 환경이 바뀐다 하더라도 이는 반영되지 않을 것이고, 그렇게 되면 이 지도는 더이상 실제 환경에 대응되지 않거나 유효하지 않게 될 것입니다.
- 우리가 제작한 지도는 2D 지도입니다. 이 말은, 장애물들이 높이를 가지지 않는다는 것입니다. 그러므로 만약 드론을 사용하여 이 내비게이션을 실행한다면, 잘 동작하지 않을것입니다. 3D 맵핑을 하는 패키지도 있으나, 이에 대한 내용은 나중에 따로 다루겠습니다. 이번 코스에서는 2D만을 다룹니다.
하드웨어 요구사항
이전 내용에서 우리가 알아야 했던 것은, 적절한 지도를 만들기 위해서는 설정(configuration)이 매우 중요하다는 것입니다. 우리의 로봇에 맞는 좋은 설정 없이는, 환경을 잘 나타내는 좋은 지도를 얻을 수 없습니다. 환경에 대한 좋은 지도가 없으면, 내비게이션도 제대로 실행되지 않을 것입니다.
따라서, 적절한 지도를 만들기 위해서는, 다음 두 가지의 요구사항을 충족해야합니다.
- 좋은 레이저 데이터
- 좋은 오도메트리 데이터
slam_gmapping node는 들어오는 각각의 레이저 데이터를 오도메트리 프레임으로 변환할 것입니다.
- 연습 2.4
위에서 언급했던 레이저와 오도메트리 데이터를 로봇이 어떤 식으로 publish하는지 확인해봅니다. (turtlebot3 시뮬레이션 node가 실행중이어야 합니다.)
- 연습 2.4 끝
좌표변환(Transforms)
이전의 연습에서, 로봇의 좌표변환이 잘 설정되어 레이저 데이터가 오도메트리 프레임으로 변환이 제대로 수행된 것을 볼 수 있었습니다.
레이저 데이터를 제대로 받아들이기 위해서는, 우리는 레이저 센서와 로봇의 베이스 사이의 좌표변환을 설정해야 하고, 이를 좌표변환 트리(transform tree)에 추가해야 합니다.
좌표변환에 대한 자세한 내용은 구글에 로봇공학 좌표변환(robotics coordinate transformation)을 검색해보세요. 여기서는 간단한 설명만 하겠습니다.
지금 우리가 사용하는 모델은 로봇 위에 레이저 센서가 장착된 형태입니다. 레이저 데이터를 사용하기 위해서는, 이 레이저 센서가 로봇의 어느 부분에 장착되어있는지에 대한 정보를 로봇에게 알려줘야합니다. 우리는 이 것을 프레임 사이의 변환(transform between frame)이라고 합니다.
변환이란, 어떤 프레임에서의 데이터를 다른 프레임에서 나타낼 때 어떻게 표현해야하는가?를 말합니다. 예를 들어, 레이저 센서가 전방 3cm앞에 장애물을 감지했다고 했을 때, 이는 레이저 센서의 전방 3cm앞에 장애물이 있는 것이지, 로봇의 중심(보통 /base_link로 정의합니다)에서 3cm 전방에 장애물이 있다는 뜻이 아닙니다. 로봇 중심에서 장애물까지의 거리를 알기 위해서는, 로봇 중심으로부터 레이저 센서(laser_frame이라고 하겠습니다)까지의 거리를 3cm에 더해야 합니다(이는 경로 계획을 수행할 때, 반드시 알아야 하는 값입니다. 장애물을 피하기 위해서는 로봇 중심과 장애물의 거리를 계산하여 장애물 회피 경로 계획을 실행합니다)
따라서, 이렇게 좌표변환 데이터를 알려주지 않으면, 로봇은 장애물이 정확히 어디 있는지 알 수 없습니다. 이렇게 센서의 위치를 로봇에게 알려주기 위해서는, 다음과 같은 과정을 거칩니다.
첫 번째, 두 개의 프레임(두 좌표계)을 정의합니다. 하나는 센서의 중심부분이고, 하나는 로봇의 중심부분입니다. 내비게이션에서, 로봇의 중심은 반드시 로봇의 회전의 중심(rotational center)에 놓여야 합니다. 그냥 로봇의 중심이 아닙니다. 이렇게 센서의 중심을 base_laser, 로봇의 중심을 base_link라고 하겠습니다.
이제, 우리는 위치와 방향이라는 용어를 사용하여 base_laser와 base_link의 관계를 정의해야합니다. 예를 들어, base_laser 프레임이 base_link프레임으로부터 x축 방향으로 10cm, y축 방향으로 20cm 떨어져 있다고 하겠습니다. 그러면 이 정보를 로봇에게 알려줄 것입니다. 이 레이저와 로봇의 base 사이의 관계는 ROS에서 레이저와 로봇 사이의 변환(transform)이라고 정의됩니다. slam_gmapping node가 제대로 동작하기 위해서는, 우리는 2개의 변환이 필요합니다.
- laser -> base_link: 일반적으로 고정된 값이며, 주기적으로 robot_state_publisher 또는 tf static_transform_publisher에 의해 주기적으로 broadcast 됩니다.
- base_link -> odom: 일반적으로 오도메트리 시스템에 의해 제공됩니다.
로봇은 이 정보에 언제든지 액세스할 수 있어야 하기 때문에, 우리는 이 정보를 변환 트리(transform tree)형태로 publish할 것입니다. 이 변환 트리는 로봇의 각각 다른 프레임들 간의 모든 변환 정보를 찾을 수 있는 데이터베이스라고 생각하시면 됩니다. 이 변환 트리는 다음 명령으로 시각화하여 확인할 수 있습니다.
$ rosrun tf2_tools view_frames.py
이 명령은 우리 시스템의 변환 트리를 그래프로 나타낸 pdf파일을 생성합니다.
위 명령을 위해서는 다음 패키지를 설치해야합니다.
$ sudo apt-get install ros-noetic-tf2-tools
- 연습 2.5
변환 트리를 시각화해봅니다.
turtlebot3 시뮬레이션 및 slam_gmapping node까지 실행하고, 위의 명령을 실행해봅니다
$ roslaunch turtlebot3_gazebo turtlebot3_house.launch
$ roslaunch turtlebot3_slam turtlebot3_slam.launch
$ rosrun tf2_tools view_frames.py
그러면 frames.pdf 파일이 생성되는데, 이를 확인해보면 다음과 같습니다
- 연습 2.5 끝
이제, 우리가 레이저 센서를 로봇에 장착했지만 아직 레이저 센서와 로봇 사이의 좌표 변환은 세팅되지 않았다고 생각해보겠습니다. 이 때, 좌표변환 데이터를 publish하는 방법은 두 가지가 있습니다.
- static_transform_publisher를 사용하는 방법
- transform broadcaster를 사용하는 방법
이번 코스에서는, static_transform_publisher가 가장 빠른 방법이기 때문에, 이를 사용할 것입니다. static_transform_publisher는 우리가 커맨드 명령으로 간단하게 직접 좌표변환을 publisher할 수 있는 ready-to-use node이기 때문입니다. 이 명령의 구조는 다음과 같습니다
$ static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms
이 때,
- x, y, z 는 미터 단위의 offset
- yaw, pitch, roll 라디안 단위의 회전
- period_in_ms 변환 데이터를 보낼 주기
커맨드 창 말고, launch 파일에서 다음과 같이 설정해줄 수 있습니다.
<launch>
<node pkg="tf" type="static_transform_publisher" name="name_of_node"
args="x y z yaw pitch roll frame_id child_frame_id period_in_ms">
</node>
</launch>
- 참고사항
로봇 모델의 묘사는 URDF파일을 통해 이루어집니다. 사실, 좌표 변환 데이터의 publish도 URDF파일을 통해 이루어질 수 있으며, 일반적으로 이 방법을 사용합니다. 하지만, URDF 파일을 사용하지 않고 따로 변환 데이터를 publish해야하는 경우도 있습니다. 예를 들어,
- 만약 로봇에 임시로 센서를 추가했다고 하겠습니다. 이 센서는 며칠 동안만 사용할 것이고, 그 후에는 다시 제거할 것입니다. 이 경우, 로봇의 URDF파일을 수정하기 보다는(이는 꽤 귀찮은 작업입니다) 그냥 이 새로운 센서의 변환 데이터를 publish하는 broadcaster를 만드는게 더 편합니다.
- 로봇에 장착되지 않은, 어떤 고정된 위치에 센서가 있는 경우입니다. 아래에 예시를 들겠습니다.
만약 매니퓰레이터가 있고, 이렇게 로봇과 떨어진 곳에 테이블과 매니퓰레이터의 데이터를 제공하기 위한 Kinect카메라가 있습니다. 이 경우, 카메라는 로봇의 일부가 아니기 때문에 URDF파일에 이 관계를 정의하지 않고, 다른 broadcaster를 통해 publish합니다.
slam_gmapping node를 위한 launch file 생성
이제, 우리는 slam_gmapping node를 시작하기 위한 launch file을 생성할 준비가 되었습니다. 이 launch file을 생성하기 위한 주요 작업은, slam_gmapping node를 위한 파라미터들을 제대로 설정하는 것입니다. 이 node는 아주 configurable하며, 맵핑의 성능을 향상시키기 위해 수정할 수 있는 파라미터들이 많습니다. 이 파라미터들은 ROS Parameter Server를 통해 읽게되며, launch file자체를 통해 설정되거나, 따로 분리된 YAML파일을 통해 설정될 수도 있습니다. 파라미터를 설정하지 않으면 기본값으로 설정됩니다. 각 파라미터에 대한 설명들은 http://wiki.ros.org/gmapping 에서 확인할 수 있으며, 해당 이론은 soohwan-justin.tistory.com/2?category=941681 를 참고하세요.
이제 가장 중요한 부분들을 확인해보겠습니다.
General Parameters
- base_frame (default: "base_link"): 모바일 로봇의 base 프레임의 이름
- map_frame (default: "map"): map(지도) 프레임의 이름
- odom_frame (default: "odom"): 오도메트리 시스템 프레임의 이름
- map_update_interval (default: 5.0): 지도가 업데이트 될 때까지 기다리는 시간 설정(초 단위)
- 연습 2.6
** 기존에 실행중이던 slam node들을 모두 종료하고 다음을 진행하세요 **
a) turtlebot3/turtlebot3_slam 패키지에서, launch 디렉토리에 있는 turtlebot3_slam.launch 파일을 확인해봅니다. 해당 파일을 보면, 설정에 따른 slam node를 불러오는 부분이 있는데, 기본값은 gmapping 입니다. 여기서 실행하도록 기술된 파일을 찾아 열어봅니다.
b) 위 경로를 따라가 turtlebot3_gmapping.launch 파일을 확인해보면, gmapping_params.yaml 파일을 불러오는 slam_gmapping node에 대한 부분을 확인할 수 있습니다.
c) my_mapping_launcher 이라는 패키지를 생성하고, 해당 패키지 안에 launch, config 디렉토리를 만들고, 필요한 파일들의 내용을 복사할 것입니다.
turtlebot3/turtlebot3_slam/turtlebot3_slam.launch >> my_mapping_launcher/launch/my_slam.launch 파일로 내용 복사
turtlebot3/turtlebot3_slam/turtlebot3_gmapping.launch >> my_mapping_launcher/launch/my_gmapping.launch 파일로 내용 복사
turtlebot3/turtlebot3_slam/config/gmapping_params.yaml >> my_mapping_launcher/config/my_params.yaml 파일로 내용 복사
turtlebot3/turtlebot3_slam/config/turtlebot3_lds_2d.lua >> my_mapping_launcher/config/ 디렉토리로 해당 파일 복사
d) 복사한 파일들의 내용을 수정합니다.
my_slam.launch
my_gmapping.launch
위와 같이 수정하였으면, my_paarams.yaml 에서 map_update_interval 을 15로 수정해봅니다.
e) 그 후, 이전처럼 slam node를 실행해보고, 지도 업데이트가 이전과 어떻게 달라졌는지 확인해봅니다.
$ roslaunch my_mapping_launcher my_slam.launch
최종적으로, Rviz에서 지도의 업데이트가 매우 느려지는 결과가 보여야 합니다.
- 연습 2.6 끝
레이저 센서 파라미터
gmapping_params.yaml 또는 my_params.yaml에 있는 파라미터들 중, 레이저 센서에 관련된 파라미터입니다.
- maxRange (float): 레이저 센서의 최대 측정 거리를 설정합니다. 센서의 스펙에 따라 설정해줘야 하며, 실제 센서의 최대 측정거리보다 약간 높게 설정합니다.
- maxUrange (default: 80.0): 레이저 데이터를 사용할 최대의 거리를 설정합니다. 예를 들어, 레이저 센서가 5m까지 읽을 수 있더라도 이 값을 3으로 설정하면, 3m 이내의 데이터만 사용합니다.
- minimumScore (default: 0.0): 레이저 스캔 매칭의 결과가 좋다고 여길 최소 점수를 정합니다.
- 연습 2.7
a) maxUrange 값을 1.5로 수정해보고, slam 결과를 확인해봅니다.
maxUrange = 3
maxUrange = 1.5
- 연습 2.7 끝
다른 파라미터들
- linearUpdate (default: 1.0): 레이저 데이터를 추가로 처리하기 위해서 이동해야하는 linear distance
- angularUpdate (default: 0.5): 레이저 데이터를 추가로 처리하기 위해서 이동해야 하는 angular distance
- temporalUpdate (default: -1.0): 레이저 데이터를 읽기 위해 기다리는 시간 설정(초 단위). -1로 설정 시 해당 기능을 off
- particles (default: 30): 필터에서 사용할 파티클 수
더 많은 파라미터의 설명에 대해서는 wiki.ros.org/gmapping를 참조하고, 해당 파라미터들의 이론에 관해서는 soohwan-justin.tistory.com/2?category=941681 를 참조하세요.
지금까지 맵핑 프로세스에서 파라미터를 바꿨을 때의 변화를 확인했습니다. 이후에는 자신이 만든 로봇의 센서의 스펙에 따라 해당 값들을 조절해주면 됩니다.
참고로, 로봇이 가지 않기를 원하는 곳, 예를들면 낭떠러지 같은 곳은 만들어진 지도 파일을 수정하여 검은색으로 선을 그어버리면 로봇이 해당 위치는 막힌 곳으로 판단하게 됩니다. 마찬가지로, 노이즈로 인해 원하지 않는 장애물같은 것이 생기면 그림 파일을 편집하여 해당 부분을 지워버려도 됩니다.
'Study > [ROS] Navigation' 카테고리의 다른 글
ROS Navigation(4. Path Planning 2) (0) | 2021.01.12 |
---|---|
ROS Navigation(4. Path Planning 1) (0) | 2021.01.10 |
ROS Navigation(3. Localization) (0) | 2021.01.10 |
ROS Navigation(1. Basic Concept) (0) | 2021.01.05 |