-
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와 route_network로 osm 데이터를 시각화하는 방법을 정리해보려고 한다.
아래 내용은 Ubuntu 20.04 LTS와 ROS Noetic에서 진행되었다.
viz_osm
1. 패키지 다운로드
https://github.com/ros-geographic-info/open_street_map
깃허브에서 코드를 다운(클론)받아 워크스페이스 src 폴더(여기서는 catkin_ws/src)에 저장해준다.
2. 패키지 빌드
워크스페이스 폴더로 이동한 후 빌드해준다.
cd catkin_ws && catkin_make
이 과정에서 geodesy 등 필요한 패키지가 없다고 나올 경우 설치해준다.
(설치된 ROS 버전에 맞게 입력해준다. melodic일 경우 ros-melodic-geodesy)
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 좌표로 변환한다.
Latitude에 위도를, Longtitude에 경도를 입력한 후,
출력되는 UTM 좌표를 복사해서 다음 명령어에 붙여 넣고 실행한다.
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' 카테고리의 다른 글
ROS1, ROS2 동시 사용 (0) 2024.11.12 ROS gdb, valgrind 디버깅 (0) 2023.03.01 터틀봇3 Navigation (0) 2020.12.30 터틀봇3 SLAM (0) 2020.12.27 터틀봇3 연결하기 (Ubuntu 18.04, ROS Melodic) (3) 2020.12.18