본문 바로가기

카테고리 없음

ICP(Iterative Closest Point)와 레이저 센서로 2D 지도구축 3

이전 글에서 ICP 알고리즘으로 지도를 그리는 소프트웨어를 작성해 보았습니다. 여기서는 이 소프트웨어를 좀 더 쓰기 쉽도록 설명을 추가하도록 하겠습니다. 이전 소스코드도 일부 수정되었고 OpenMP로 멀티코어를 지원하도록 하였습니다.

MapBuilding.zip
3.79MB

 

상기 MapBuilding 파일을 다운받아 VisualStudio C++ 2008로 열어 컴파일하고 실행합니다. 그러면 laser.bin 파일을 읽어 프로그램이 맵을 이어붙여 나갑니다. MapBuilding 윈도우의 크기는 조절 가능하며 만들어지고 있는 지도를 마우스 왼쪽 버튼으로 누른 상태에서 드래그 하여 위치를 이동 가능합니다. 그리고 마우스 스크롤로 지도의 축소와 확대가 가능합니다.

 

laser.bin 파일은 소스코드 내에 첨부 되어 있는데, 다음과 같이 만들어집니다. 여기서 로봇의 위치와 방위 (posture.x, posture.y, posture.th)는 좌우 바퀴의 엔코더 값을 Dead-reckoning 하여 계산하면 됩니다. 굳이 외부의 위치인식 센서로 정확한 위치를 측정하지 않아도 됩니다.

 // 레이저 스캐너 데이터와 로봇의 위치를 계산한다. 로봇의 위치는 바퀴의 오도메트리로 계산한다.
  // 그리고 다음과 같이 파일을 열고 기록한다.
 
   FILE *fp = fopen("laser.bin", "a+b");
   if (fp) {
    fwrite (&measuredTime, sizeof(double), 1, fp);
    fwrite (&posture.x, sizeof(double), 1, fp);
    fwrite (&posture.y, sizeof(double), 1, fp);
    fwrite (&posture.th, sizeof(double), 1, fp);
    fwrite (&sensorCount, sizeof(long), 1, fp);
    fwrite (&measured[0], sizeof(double), sensorCount, fp);
    fclose (fp);
   }

저의 경우는 호쿠요 UTM 30LX를 사용하여 laser.bin 파일을 만들었습니다. 하지만 아무 레이저 스캐너나 문제 없이 될 것으로 생각합니다만, 측정거리가 10m 이상은 되어야 맵을 제대로 복원할 수 있습니다. 복도나 홀 같이 넓은 공간에서는 30m 이상 측정가능한 레이저 스캐너를 사용하시기 바랍니다.

 

레이저 스캐너를 장착한 로봇은 자율주행을 할 필요없습니다. 저같은 경우는 조이스틱으로 로봇을 뒤에서 조정하면서 복도와 사무실을 다니면서 laser.bin 파일을 만들었습니다. laser.bin 파일을 만들었다면 이제 MapBuilding 프로그램으로 맵을 복원할 차례입니다. MapBuilding 프로그램이 제대로 맵을 복원하기 위해서는 레이저 스캐너의 장착 위치와 레이저 스캐너의 몇몇 특성을 알아야 합니다. 이러한 정보들은 MapBuilding.ini 파일에서 설정을 하시면 되는데 아래 간략히 설명하겠습니다.

[Property]

scale=52.5591                          <-- 이 값은 1m를 표현하기 위해 몇 개의 pixel이 사용되는지를 의미
                                                      ICP 윈도우에는 Map resolution 이라는 값으로 표시되는데 1/scale 값
offset_x=-14.6066                     <-- 지도의 x, y 축 방향 offset 값
offset_y=-8.22897                    
 
MainWindowLeft=644               <-- 윈도우의 위치
MainWindowTop=473
MainWindowRight=2024
MainWindowBottom=1348
 
robot_diameter=0.5                  <-- 로봇의 반경을 설정
 
laser_scan_range=180            <-- 레이저 스캐너의 측정 범위(단위: deg)
laser_pos_x=0.772                  <-- 로봇을 기준으로 레이저 스캐너가 장착된 x, y 위치와 방위
laser_pos_y=0                         
laser_dir_theta=0                     
laser_distance_min=1             <-- 레이저 스캐너가 측정한 거리 중 1m 이하 거리는 무시
laser_distance_max=15           <-- 레이저 스캐너가 측정한 거리 중 15m 이상 거리는 무시
laser_p2p_min=0.05                <-- 측정한 포인트들간의 거리가 0.05m 이하 일 때는 둘 중 하나를 버림
 
data_begin=200                      <-- 측정 데이터 중에서 200번째부터 사용 시작
data_end=-1                          <-- (사용 안함)
data_step=10                         <-- 측정 데이터 10회 분량 중 한회만 사용, 즉 9회는 버리고 1회만 사용
 
file_name=laser.bin                <-- 읽어들일 데이터 파일 지정
 
robot_init_pos_x=0                  <-- 로봇의 시작 위치와 방위 지정
robot_init_pos_y=0              
robot_init_dir_theta=-2.5

* scale, offset_x, offset_y, MainWindowLeft, MainWindowTop, MainWindowRight, MainWindowBottom 값들은 윈도우가 직접 변경하는 값들이니 사용자가 변경할 필요 없습니다.

 

laser.bin 데이터를 확보하고 ini 파일의 설정을 마쳤다면, MapBuilding 프로그램을 실행해 보시기 바랍니다.