• osm_cartography - RViz에 오픈스트리트맵(OSM) 데이터 시각화하기
    ROS 2022. 12. 25. 17:31

     

    osm_cartography

    오픈스트리트맵(OpenStreetMap)에서 다운받은 데이터를 RViz에 띄워주는 ROS 패키지 (BSD Lisence)

    http://wiki.ros.org/osm_cartography

     

    osm_cartography - ROS Wiki

    melodic noetic   Show EOL distros:  EOL distros:   fuerte groovy hydro indigo kinetic lunar fuerte: Documentation generated on January 02, 2014 at 11:33 AMgroovy: Documentation generated on October 06, 2014 at 03:04 AMhydro: Documentation generated on

    wiki.ros.org

     

     

    osm_cartography와 route_network로 osm 데이터를 시각화하는 방법을 정리해보려고 한다.

    (아래 내용은 Ubuntu 20.04 LTS와 ROS Noetic에서 진행되었다.)

     

    viz_osm

    1. 패키지 다운로드

    https://github.com/ros-geographic-info/open_street_map

    먼저 깃허브에서 코드를 다운 받은 후, catkin_ws/src 폴더로 옮긴다.

     

    2. 패키지 빌드

    catkin_ws 폴더로 이동한 후, catkin_make 명령어로 다운받은 패키지를 빌드해준다.

    cd catkin_ws && catkin_make

    이 과정에서 geodesy 등 필요한 패키지가 없다고 나올 경우 설치해준다. ('noetic'은 설치된 ROS 버전으로 변경)

    sudo apt install ros-noetic-geodesy

     

    3. 파이썬 스크립트 수정

    패키지가 파이썬 2.xx 버전으로 작성되었으므로, 3.xx 버전에서 사용할 수 있도록 수정하는 과정이 필요하다.

    코드를 수정하지 않고 실행할 경우 Syntax error로 인해 프로세스가 종료된다.

     

    3-1. open_street_map-master/osm_cartography/scripts/viz_osm 파일 수정

    3-1-1. 다음과 같이 line 107, 112, 117, 122에서 f를 감싸고 있는 소괄호를 없애준다.

    3-1-2. line 174의 itertools.ifilter를 filter로 수정한다.

    for feature in filter(predicate, self.map.features):

     

    3-2. open_street_map-master/osm_cartography/scripts/osm_server 파일 수정

    3-2-1. line 84의 /map을 map으로 수정한다.

    self.resp.map.header.frame_id = "map"

     

    4. static_transform_publisher를 통한 좌표 변환

    osm 지도를 RViz에 시각화하기 위해 경위도 좌표를 UTM 좌표로 변환한다.

    이 때 맵의 UTM 좌표를 정확하게 입력하지 않을 경우 RViz 내에서 맵이 보이지 않는다. (엉뚱한 위치에 생성됨)

    rosrun tf static_transform_publisher 622150 3362350 0 0 0 0 1 map local_map 100

     

    5. viz_osm 노드 실행

    roslaunch osm_cartography viz_osm.launch url:=package://osm_cartography/tests/prc.osm

     

    6. RViz 실행

    Fixed frame을 local_map으로 변경하고 MarkerArray를 추가한다.

     

    7. 시각화된 맵 확인

    예제로 제공된 prc.osm 파일 내 데이터가 정상적으로 시각화된 것을 확인할 수 있다.

     

    8. 커스텀 맵 띄우기

    예제로 제공된 osm파일 이외에 https://www.openstreetmap.org/에서 다운 받은 파일을 직접 띄워보자.

     

    8-1. OSM 맵 다운로드

    osm 홈페이지에서 원하는 위치의 맵을 다운로드 받는다.

    8-2. UTM 좌표 변환

    다운로드 받은 맵 내 중심 지점의 경위도 좌표를 UTM 좌표로 변환한다.

    https://www.latlong.net/lat-long-utm.html

    Latitude에 위도를, Longtitude에 경도를 입력한 후,

    출력되는 UTM 좌표를 복사해서 다음 명령어에 붙여 넣고 실행한다. (e.g. 참고)

    rosrun tf static_transform_publisher UTM_Easting UTM_Northing 0 0 0 0 1 frame_id child_frame_id period_in_ms

    e.g.

    rosrun tf static_transform_publisher 550995.94 5272953.34 0 0 0 0 1 map local_map 100

     

    8-3. 파일 경로 수정

    불러올 osm 맵의 경로를 다운받은 맵이 위치해있는 경로로 수정해준 후, 실행한다.

    roslaunch osm_cartography viz_osm.launch url:=package://osm_cartography/maps/map_221217.osm

     

    8-4. RViz 실행

    Fixed frame을 frame_id 값으로 변경하고, MarkerArray를 추가하여 시각화 된 맵을 확인한다.

     

     

    geo_planner

    1. 패키지 빌드 및 코드 수정

    위 viz_osm 과정의 3번까지 수행한 후, 진행한다.

     

    2. 파이썬 스크립트 수정

    해당 스크립트 역시 파이썬 2.xx 버전으로 작성되었으므로, 3.xx 버전에서 실행할 수 있도록 코드를 수정한다.

     

    2-1. open_street_map-master/route_network/scripts/rviz_goal 파일 수정

    2-1-1. 다음과 같이 line 189, 191에 소괄호를 추가한다.

     

    2-1-2. line 116의 xrange를 range로 수정한다.

    for sid in range(len(graph.segments)):

     

    2-2. open_street_map-master/route_network/scripts/route_network 파일 수정

    2-2-1. line 76 정도에 다음과 같이 PKG_NAME을 입력해준다.

     

    2-2-2. line 137의 itertools.ifilter를 filter로 수정한다.

    for feature in filter(is_route, self.map.features):

     

    3. geo_planner.launch 파일 수정

    런치 파일 내 인자 값을 커스텀 맵에 맞게 수정해준다.

    <launch>
      <!-- OSM 파일의 경로 -->
      <arg name="map_url" default="package://osm_cartography/maps/map_221217.osm" />
    
      <!-- Start map server -->
      <node pkg="osm_cartography" type="osm_server" name="osm_server" output="screen" />
    
      <!-- Start map visualization -->
      <node pkg="osm_cartography" type="viz_osm" name="viz_osm" >
        <param name="map_url" value="$(arg map_url)" />
      </node>
      
      <!-- Build a graph out of the OSM information -->
      <node pkg="route_network" type="route_network" name="route_network" >
          <param name="map_url" value="$(arg map_url)" />
      </node>
      
      <!-- Provide the planning service -->
      <node pkg="route_network" type="plan_route" name="plan_route" />
    
      <node pkg="tf" type="static_transform_publisher" name="tf_world_map" args="0 0 0 0 0 0 1 /world /map 100" >
        <param name="capability_group" value="0 tf"/>
      </node>
    
      <!-- 커스텀 맵의 UTM 좌표 입력 -->
      <node pkg="tf" type="static_transform_publisher" name="tf_map_local_map" args="550995.94 5272953.34 0 0 0 0 1 /map /local_map 100" >
        <param name="capability_group" value="0 tf"/>
      </node>
      
      <node name="rviz" pkg="rviz" type="rviz" args="-d $(find osm_cartography)/rviz/geo_planner.rviz"/>
      <!-- Handle start and goal positions via RVIZ -->
      <!--
       In RVIZ: 
         Start Position: 2D Pose Estimate (topic: /initialpose)
         Goal Position: 2D Nav Goal (topic: /goal)
      -->
      <node pkg="route_network" type="rviz_goal" name="rviz_goal" />
    
    </launch>

     

    4. 수정한 런치 파일 실행

    roslaunch osm_cartography geo_planner.launch

     

    5. 최단 경로 생성

    RViz에서 2D Pose Estimate와 2D Nav Goal을 이용해 출발 지점과 도착 지점을 클릭하면,

    A* 알고리즘에 의해 생성된 최단 경로가 시각화되어 나타난다.

     

    viz_osm 파일 내 roads_osm와 rviz_goal 파일 내 path_marker의 ColorRGBA/scale 값을 조정하면

    시각화되는 Marker의 색상/두께를 변경할 수 있다.

     

    'ROS' 카테고리의 다른 글

    터틀봇3 Navigation  (0) 2020.12.30
    터틀봇3 SLAM  (0) 2020.12.27
    터틀봇3 연결하기 (Ubuntu 18.04, ROS Melodic)  (3) 2020.12.18
    ROS Melodic 설치 (Ubuntu 18.04)  (0) 2020.12.18

    댓글

ABOUT ME

공부한 것을 기록하기 위해 블로그를 개설했습니다. 관심 분야는 ROS와 머신러닝입니다.

VISIT

/