Programming/ROS

Navigation 아무거나 끄적임

오숭이 2022. 2. 22. 23:52

네비게이션은 로봇의 휠 엔코더, IMU, Lidar등을 이용하여 현재 위치로부터 지도상에 지정된 목적지까지 이동하는 것입니다. 그 순서를 말씀드리자면 먼저 robot_pose_ekf가 확장 칼만필터를 사용해 odometry, imu 센서 등 측정된 데이터를 결합하여 wheel odometry보다 나은 주행거리 측정데이터로 amcl을 위한 3d pose 추정을 하고 /odom_combined을 퍼블리쉬합니다. 그리고 base_footprint tf변환을 제공합니다. 그 다음 amcl로 tf형태로 그 정보를 전달합니다. 

 

amcl은 파티클 필터를 사용하는 확률적 위치추정 시스템으로 기존에 작성된 맵에 현재 로봇의 위치를 추적합니다. 이를 위해 testclass로부터 초기위치, map_saver로부터 맵정보, scan값과 tf값을 서브스크라이브합니다. 그리고 맵에서 추정되는 로봇의 위치인 amcl_pose와 particlecloud을 testclass로 tf값을 move_base로 퍼블리시합니다. 

 

move_base는 로봇 이동 경로 계획을 위한 허브로 lidar의 scan, map_saver부터 맵정보, amcl 포지셔닝 등의 데이터를 서브스크라이브하여 현재 위치로부터 지도상에 지정된 목표지점까지 맵 전체상의 global plan, 로봇 중심 일부 지역을 대상으로 한 local plan으로 나누어 이동 경로를 생성한 다음, 경로를 로봇의 속도 정보로 변환하여 네비게이션 동작을 합니다. agv는 장애물 회피 알고리즘인 teb를 기반으로 한 move_base 이동 경로 계획 패키지를 사용합니다. 로봇 네비게이션 동작 중 센싱, 위치 추정모션 계획은 계속 수행 중이고 갑자기 나타난 장애물, 이동 물체등은 teb 알고리즘을 사용하여 회피하여 이동합니다.

 

네비게이션 패키지 구동에 필요한 필수 노드와 토픽들의 관계를 설명드리자면 tf 상대 위치 변환은 로봇의 센서의 위치를 예를들어 base_scan 라고 할 때, 이 센서 위치는 로봇의 하드웨어적 구성에 따라 위치가 상대적으로 바뀌기 때문에 ROS에서는 tf 라는 상대 위치 변환을 이용합니다. 이는 단순히 오도메트리로 로봇의 위치를 알게되는데 "그 로봇의 위치로부터 x,y,z 좌표 상 센서가 얼마만큼 떨어져 있다." 라는 형태로 기술해줍니다. 예를 들어,  odom → base_footprint → base_link → base_scan 의 변환을 거쳐서 토픽으로 발행하게 됩니다. 이는 move_base 노드에서 이 정보를 받아 로봇의 위치와 센서의 위치를 가지고 이동 경로 계획을 수행하게 됩니다. 

 

map_saver로부터 lowermap을 서브스크라이브해서 static map으로 설정하고 제공되는 너비, 높이 및 기존 장애물 정보와 일치하도록 초기화하여 amcl scan 데이터로 costmap을 업데이트 할 수 있도록 합니다. 

 

costmap 1)로봇 위치, 2)센서 위치, 3)장애물 위치 정보, 그리고 SLAM의 결과물로 얻은 점유 격자 지도를 4)고정 지도(static map) 로 불러와서 점유 영역(occupied area), 자유 영역(free area), 미지 영역(unknown area)에 대한 정보를 사용하게 된다 내비게이션에서는 4가지 요소를 기반으로 장애물 영역, 장애물과 충돌이 예상되는 영역, 로봇이 이동 가능한 영역을 계산하게 되는데 이것을 costmap 이라고 부른다. costmap 은 다시 내비게이션의 종류에 따라 2개로 분리된다. 하나는 global_costmap라고 하여서 전역 이동 경로 계획에서 고정 지도의 전체 영역을 대상으로 이동 계획을 수립하는데 이 때에의 출력물을 말하고, 다른 하나는 local_costmap 이라고 한다. 이는 국부 이동 경로 계획에서 로봇을 중심으로 일부 한정된 영역에 대해 이동 계획할 때나 장애물 회피에 사용되는 지도를 말한다. 하지만, 두 costmap 은 사용 목적이 다를 뿐 지도 표현 방식에서는 동일한 지도이다. 

 

costmap 은 0에서 255까지의 값으로 표현된다. 값에 따라 로봇이 이동 가능한 영역인지 장애물에 충돌하는 영역인지를 알 수 있게 된다. 각 영역은 costmap 설정 파라미터에 따라 달라지게 된다.

000 ~ 000 : 로봇이 자유롭게 이동 가능한 자유 영역 (free area)

001 ~ 127 : 충돌하지 않는 영역

128 ~ 252 : 충돌 가능성이 있는 영역

253 ~ 254 : 충돌 영역

255 ~ 255 : 로봇이 이동 불가능한 점유 영역 (occupied area)

 

예를 들어 노란색 셀이 실제 장애물, 하늘색 영역은 로봇 중심 위치가 이 영역으로 오게되면 충돌하게 된는 지점이고 굵은 간색 픽셀로 경계선을 긋고 있다. 파랑색은 안전한 지역을 말한다.