이는 여러 데이터 레이어가 있는 2차원 그리드 맵을 관리하기 위한 ROS 인터페이스를 갖춘 C++ 라이브러리입니다. 이는 고도, 분산, 색상, 마찰 계수, 발판 품질, 표면 법선, 횡단 가능성 등과 같은 데이터를 저장하기 위해 모바일 로봇 매핑용으로 설계되었습니다. 거친 지형 탐색을 위해 설계된 로봇 중심 고도 매핑 패키지에 사용됩니다.
특징:
이것은 연구 코드이므로 자주 변경될 것으로 예상되며 특정 목적에 대한 적합성은 부인됩니다.
소스 코드는 BSD 3-Clause 라이센스에 따라 공개됩니다.
저자: 피터 팡하우저(Péter Fankhauser)
소속 : 애니보틱스
유지관리자: Maximilian Wulf, [email protected], Magnus Gärtner, [email protected]
기여: Simone Arreghini, Tanja Baumann, Jeff Delmerico, Remo Diethelm, Perry Franklin, Magnus Gärtner, Ruben Grandia, Edo Jelavic, Dominic Jud, Ralph Kaestner, Philipp Krüsi, Alex Millane, Daniel Stonier, Elena Stumm, Martin Wermelinger, Christos 잘리디스
이 프로젝트는 처음에 ETH Zurich(자율 시스템 연구소 및 로봇 시스템 연구소)에서 개발되었습니다.
이 작업은 다리 로봇 공학을 발전시키기 위한 커뮤니티인 ANYmal Research의 일부로 수행됩니다.
이 저작물을 학문적 맥락에서 사용하는 경우 다음 출판물을 인용해 주세요.
P. Fankhauser 및 M. Hutter, "A Universal Grid Map Library: Implement and Use Case for Rough Terrain Navigation" , 로봇 운영 체제(ROS) – 전체 참조(1권), A. Koubaa(Ed.), Springer , 2016. (PDF)
@incollection{Fankhauser2016GridMapLibrary,
author = {Fankhauser, P{'{e}}ter and Hutter, Marco},
booktitle = {Robot Operating System (ROS) – The Complete Reference (Volume 1)},
title = {{A Universal Grid Map Library: Implementation and Use Case for Rough Terrain Navigation}},
chapter = {5},
editor = {Koubaa, Anis},
publisher = {Springer},
year = {2016},
isbn = {978-3-319-26052-5},
doi = {10.1007/978-3-319-26054-9{_}5},
url = {http://www.springer.com/de/book/9783319260525}
}
현재 유지 관리되는 분기는 다음과 같습니다.
ROS 1에 대한 풀 요청은 master
대상으로 해야 합니다. ROS 2에 대한 풀 요청은 rolling
목표로 해야 하며 ABI를 위반하지 않는 경우 백포트됩니다.
이 책의 장에서는 튜토리얼을 포함하여 그리드 맵 라이브러리에 대한 소개를 제공합니다.
C++ API는 여기에 문서화되어 있습니다.
데비안 패키지를 사용하여 그리드 맵 라이브러리에서 모든 패키지를 설치하려면
sudo apt-get install ros-$ROS_DISTRO-grid-map
Grid_map_core 패키지는 선형 대수 라이브러리 Eigen에만 의존합니다.
sudo apt-get install libeigen3-dev
다른 패키지는 ROS 표준 설치( roscpp , tf , filters , sensor_msgs , nav_msgs 및 cv_bridge )에 추가로 의존합니다. 다른 형식별 변환 패키지(예: Grid_map_cv , Grid_map_pcl 등)는 아래 패키지 개요 에 설명된 패키지에 따라 다릅니다.
소스에서 빌드하려면 이 저장소의 최신 버전을 catkin 작업 공간에 복제하고 다음을 사용하여 패키지를 컴파일하십시오.
cd catkin_ws/src
git clone https://github.com/anybotics/grid_map.git
cd ../
catkin_make
성능을 최대화하려면 릴리스 모드에서 빌드해야 합니다. 설정을 통해 빌드 유형을 지정할 수 있습니다.
catkin_make -DCMAKE_BUILD_TYPE=Release
이 저장소는 다음 패키지로 구성됩니다.
GridMap
클래스와 반복자와 같은 여러 도우미 클래스를 제공합니다. 이 패키지는 ROS 종속성 없이 구현됩니다.추가 변환 패키지:
다음을 사용하여 단위 테스트를 실행합니다.
catkin_make run_tests_grid_map_core run_tests_grid_map_ros
또는
catkin build grid_map --no-deps --verbose --catkin-make-args run_tests
catkin 도구를 사용하는 경우.
Grid_map_demos 패키지에는 여러 데모 노드가 포함되어 있습니다. 이 코드를 사용하여 그리드 맵 패키지의 설치를 확인하고 라이브러리 사용을 시작하세요.
simple_demo는 그리드 맵 라이브러리 사용에 대한 간단한 예를 보여줍니다. 이 ROS 노드는 그리드 맵을 생성하고 여기에 데이터를 추가하고 게시합니다. RViz에서 결과를 보려면 다음 명령을 실행하십시오.
roslaunch grid_map_demos simple_demo.launch
tutorial_demo는 라이브러리 기능에 대한 확장된 데모입니다. 다음을 사용하여 tutorial_demo를 시작하세요.
roslaunch grid_map_demos tutorial_demo.launch
iterators_demo는 그리드 맵 반복자의 사용법을 보여줍니다. 다음으로 시작하세요
roslaunch grid_map_demos iterators_demo.launch
image_to_gridmap_demo는 이미지의 데이터를 그리드 맵으로 변환하는 방법을 보여줍니다. 데모를 시작하세요
roslaunch grid_map_demos image_to_gridmap_demo.launch
Grid_map_to_image_demo는 그리드 맵 레이어를 이미지에 저장하는 방법을 보여줍니다. 데모를 시작하세요
rosrun grid_map_demos grid_map_to_image_demo _grid_map_topic:=/grid_map _file:=/home/$USER/Desktop/grid_map_image.png
opencv_demo는 OpenCV 기능을 사용하여 지도 조작을 보여줍니다. 데모를 시작하세요
roslaunch grid_map_demos opencv_demo.launch
Resolution_change_demo는 OpenCV 이미지 크기 조정 방법을 사용하여 그리드 맵의 해상도를 변경하는 방법을 보여줍니다. 결과를 확인하고 사용하세요
roslaunch grid_map_demos resolution_change_demo.launch
filter_demo는 ROS 필터 체인을 사용하여 그리드 맵을 처리합니다. 지형 지도의 고도부터 시작하여 데모에서는 여러 필터를 사용하여 표면 법선을 계산하고, 인페인팅을 사용하여 구멍을 채우고, 지도를 부드럽게/흐리게 하고, 수학 표현식을 사용하여 가장자리를 감지하고, 거칠기와 횡단성을 계산하는 방법을 보여줍니다. 필터 체인 설정은 filters_demo_filter_chain.yaml
파일에서 구성됩니다. 데모를 시작하세요
roslaunch grid_map_demos filters_demo.launch
그리드 맵 필터에 대한 자세한 내용은 Grid_map_filters를 참조하세요.
interpolation_demo는 결과 표면에 대한 다양한 보간 방법의 결과를 보여줍니다. 데모 시작, 사용
roslaunch grid_map_demos interpolation_demo.launch
사용자는 interpolation_demo.yaml
파일에서 다양한 세계(표면)와 다양한 보간 설정을 가지고 놀 수 있습니다. 시각화는 녹색과 노란색으로 실제 실제값을 표시합니다. 보간 결과는 빨간색과 보라색으로 표시됩니다. 또한 데모에서는 최대 및 평균 보간 오류는 물론 단일 보간 쿼리에 필요한 평균 시간도 계산합니다.
그리드 맵에는 네 가지 보간 방법이 있습니다(정확도와 복잡성이 증가하는 순서대로).
자세한 내용은 CubicInterpolation.hpp
파일에 나열된 문헌을 확인하세요.
그리드 맵 라이브러리에는 편의를 위해 다양한 반복자가 포함되어 있습니다.
그리드 맵 | 서브맵 | 원 | 선 | 다각형 |
---|---|---|---|---|
타원 | 나선 | |||
for
루프에서 반복자를 사용하는 것이 일반적입니다. 예를 들어 GridMapIterator
를 사용하여 전체 그리드 맵을 반복합니다.
for (grid_map::GridMapIterator iterator(map); !iterator.isPastEnd(); ++iterator) {
cout << "The value at index " << (*iterator).transpose() << " is " << map.at("layer", *iterator) << endl;
}
다른 그리드 맵 반복자는 동일한 형식을 따릅니다. iterators_demo 노드에서 다양한 반복자를 사용하는 방법에 대한 더 많은 예제를 찾을 수 있습니다.
참고: 반복자를 사용할 때 효율성을 최대화하려면 for
루프 외부에 grid_map::Matrix& data = map["layer"]
사용하여 그리드 맵의 데이터 레이어에 대한 직접 액세스를 로컬로 저장하는 것이 좋습니다.
grid_map::Matrix& data = map["layer"];
for (GridMapIterator iterator(map); !iterator.isPastEnd(); ++iterator) {
const Index index(*iterator);
cout << "The value at index " << index.transpose() << " is " << data(index(0), index(1)) << endl;
}
다음과 같이 실행할 수 있는 grid_map_demos
패키지의 iterator_benchmark
노드에서 반복기 성능에 대한 벤치마킹을 찾을 수 있습니다.
rosrun grid_map_demos iterator_benchmark
반복자는 편리하지만 내장된 Eigen 메서드를 사용하는 것이 가장 명확하고 효율적인 경우가 많습니다. 다음은 몇 가지 예입니다.
레이어의 모든 셀에 상수 값 설정:
map["layer"].setConstant(3.0);
두 개의 레이어 추가:
map["sum"] = map["layer_1"] + map["layer_2"];
레이어 크기 조정:
map["layer"] = 2.0 * map["layer"];
최대. 두 레이어 사이의 값:
map["max"] = map["layer_1"].cwiseMax(map["layer_2"]);
평균 제곱근 오차를 계산합니다.
map.add("error", (map.get("layer_1") - map.get("layer_2")).cwiseAbs());
unsigned int nCells = map.getSize().prod();
double rootMeanSquaredError = sqrt((map["error"].array().pow(2).sum()) / nCells);
지도의 위치를 변경하는 방법에는 두 가지가 있습니다.
setPosition(...)
: 지도에 저장된 데이터를 변경하지 않고 지도의 위치를 변경합니다. 이는 데이터와 지도 프레임 간의 대응을 변경합니다.
move(...)
: 그리드 맵 wrt로 캡처한 영역을 정적 그리드 맵 프레임으로 재배치합니다. 그리드 맵 데이터를 재배치하지 않고 그리드 맵 경계를 이동하려면 이를 사용합니다. 그리드 맵 데이터가 그리드 맵 프레임에 고정되도록 모든 데이터 처리를 관리합니다.
참고 : 원형 버퍼 구조로 인해 인접 인덱스가 맵 프레임에 근접하지 않을 수 있습니다. 이 가정은 getUnwrappedIndex()로 얻은 인덱스에만 적용됩니다.
setPosition(...) | move(...) |
---|---|
이 RViz 플러그인은 그리드 맵 레이어를 3D 표면 플롯(높이 맵)으로 시각화합니다. 색상 정보에 대한 레이어로 별도의 레이어를 선택할 수 있습니다.
이 패키지는 고도 지도를 조밀한 3D 서명 거리 필드로 변환하는 효율적인 알고리즘을 제공합니다. 3D 그리드의 각 지점에는 그라데이션과 함께 지도에서 가장 가까운 지점까지의 거리가 포함되어 있습니다.
이 노드는 Grid_map_msgs/GridMap 유형의 주제를 구독하고 RViz에서 시각화할 수 있는 메시지를 게시합니다. 시각화 도우미의 게시된 주제는 YAML 매개변수 파일을 사용하여 완전히 구성할 수 있습니다. 다양한 매개변수를 사용하여 시각화를 원하는 만큼 추가할 수 있습니다. tutorial_demo 의 구성 파일에 대한 예는 다음과 같습니다.
포인트 클라우드 | 벡터 | 점유 그리드 | 그리드 셀 |
---|---|---|---|
grid_map_topic
(문자열, 기본값: "/grid_map")
시각화할 그리드 맵 주제의 이름입니다. 시각화 도우미에 대한 설명은 아래를 참조하세요.
/grid_map
(grid_map_msgs/GridMap)
시각화할 그리드 맵입니다.
게시된 주제는 YAML 매개변수 파일로 구성됩니다. 가능한 주제는 다음과 같습니다:
point_cloud
(sensor_msgs/PointCloud2)
그리드 맵을 포인트 클라우드로 표시합니다. layer
매개변수를 사용하여 포인트로 변환할 레이어를 선택합니다.
name: elevation
type: point_cloud
params:
layer: elevation
flat: false # optional
flat_point_cloud
(센서_msgs/PointCloud2)
그리드 맵을 "평평한" 포인트 클라우드로 표시합니다. 즉, 모든 포인트가 동일한 높이 z 에 있습니다. 이는 Color Transformer
의 도움으로 RViz에서 2D 지도나 이미지(또는 비디오 스트림)를 시각화하는 데 편리합니다. 매개변수 height
원하는 플랫 포인트 클라우드의 z 위치를 결정합니다.
name: flat_grid
type: flat_point_cloud
params:
height: 0.0
참고: 비어 있거나 유효하지 않은 셀에서 플랫 포인트 클라우드의 점을 생략하려면 setBasicLayers(...)
사용하여 유효성을 확인해야 하는 레이어를 지정하십시오.
vectors
(visualization_msgs/Marker)
그리드 맵의 벡터 데이터를 시각적 마커로 시각화합니다. layer_prefix
매개변수를 사용하여 벡터의 x -, y - 및 z 구성요소를 보유하는 레이어를 지정합니다. position_layer
매개변수는 벡터의 시작점으로 사용될 레이어를 정의합니다.
name: surface_normals
type: vectors
params:
layer_prefix: normal_
position_layer: elevation
scale: 0.06
line_width: 0.005
color: 15600153 # red
occupancy_grid
(nav_msgs/OccupancyGrid)
그리드 맵의 레이어를 점유 그리드로 시각화합니다. 시각화할 레이어를 layer
매개변수로 지정하고, 상한과 하한을 data_min
, data_max
로 지정합니다.
name: traversability_grid
type: occupancy_grid
params:
layer: traversability
data_min: -0.15
data_max: 0.15
grid_cells
(nav_msgs/GridCells)
그리드 맵의 레이어를 그리드 셀로 시각화합니다. layer
매개변수로 시각화할 레이어를 지정하고, lower_threshold
와 upper_threshold
로 상한과 하한을 지정합니다.
name: elevation_cells
type: grid_cells
params:
layer: elevation
lower_threshold: -0.08 # optional, default: -inf
upper_threshold: 0.08 # optional, default: inf
region
(visualization_msgs/Marker)
그리드맵의 경계를 표시합니다.
name: map_region
type: map_region
params:
color: 3289650
line_width: 0.003
참고: 색상 값은 연결된 정수로 RGB 형식입니다(각 채널 값 0-255). 녹색(빨간색: 0, 녹색: 255, 파란색: 0)에 대한 예로서 값은 다음과 같이 생성될 수 있습니다.
Grid_map_filters 패키지에는 레이어의 데이터에 대한 계산을 수행하기 위해 그리드 맵을 적용할 수 있는 여러 필터가 포함되어 있습니다. 그리드 맵 필터는 ROS 필터를 기반으로 합니다. 즉, 필터 체인을 YAML 파일로 구성할 수 있습니다. 또한, grid_map_cv
패키지의 InpaintFilter
와 같은 ROS 플러그인 메커니즘을 통해 추가 필터를 작성하고 사용할 수 있습니다.
Grid_map_filters 패키지에는 몇 가지 기본 필터가 제공됩니다:
gridMapFilters/ThresholdFilter
Condition_layer가 상한 또는 하한 임계값을 초과하는 경우 (한 번에 하나의 임계값만) 출력 레이어의 값을 지정된 값으로 설정합니다.
name: lower_threshold
type: gridMapFilters/ThresholdFilter
params:
condition_layer: layer_name
output_layer: layer_name
lower_threshold: 0.0 # alternative: upper_threshold
set_to: 0.0 # # Other uses: .nan, .inf
gridMapFilters/MeanInRadiusFilter
레이어의 각 셀에 대해 반경 내 평균값을 계산합니다.
name: mean_in_radius
type: gridMapFilters/MeanInRadiusFilter
params:
input_layer: input
output_layer: output
radius: 0.06 # in m.
gridMapFilters/MedianFillFilter
반경이 있는 패치 내부의 중앙값(유한값)을 레이어의 각 NaN 셀에 대해 계산합니다. 선택적으로 이미 유한한 값에 대한 중앙값 계산을 적용합니다. 이러한 점의 패치 반경은 기존_값_반경에 의해 제공됩니다. 채우기 계산은 해당 지점에 대해 fill_mask가 유효한 경우에만 수행됩니다.
name: median
type: gridMapFilters/MedianFillFilter
params:
input_layer: input
output_layer: output
fill_hole_radius: 0.11 # in m.
filter_existing_values: false # Default is false. If enabled it also does a median computation for existing values.
existing_value_radius: 0.2 # in m. Note that this option only has an effect if filter_existing_values is set true.
fill_mask_layer: fill_mask # A layer that is used to compute which areas to fill. If not present in the input it is automatically computed.
debug: false # If enabled, the additional debug_infill_mask_layer is published.
debug_infill_mask_layer: infill_mask # Layer used to visualize the intermediate, sparse-outlier removed fill mask. Only published if debug is enabled.
gridMapFilters/NormalVectorsFilter
지도에 있는 레이어의 법선 벡터를 계산합니다.
name: surface_normals
type: gridMapFilters/NormalVectorsFilter
params:
input_layer: input
output_layers_prefix: normal_vectors_
radius: 0.05
normal_vector_positive_axis: z
gridMapFilters/NormalColorMapFilter
법선 벡터 레이어를 기반으로 새 색상 레이어를 계산합니다.
name: surface_normals
type: gridMapFilters/NormalColorMapFilter
params:
input_layers_prefix: normal_vectors_
output_layer: normal_color
gridMapFilters/MathExpressionFilter
그리드 맵 레이어를 사용하여 수학적 행렬 표현식을 구문 분석하고 평가합니다. 표현식 문서는 EigenLab을 참조하세요.
name: math_expression
type: gridMapFilters/MathExpressionFilter
params:
output_layer: output
expression: acos(normal_vectors_z) # Slope.
# expression: abs(elevation - elevation_smooth) # Surface roughness.
# expression: 0.5 * (1.0 - (slope / 0.6)) + 0.5 * (1.0 - (roughness / 0.1)) # Weighted and normalized sum.
gridMapFilters/SlidingWindowMathExpressionFilter
그리드 맵 레이어의 슬라이딩 윈도우 내에서 수학적 행렬 표현식을 구문 분석하고 평가합니다. 표현식 문서는 EigenLab을 참조하세요.
name: math_expression
type: gridMapFilters/SlidingWindowMathExpressionFilter
params:
input_layer: input
output_layer: output
expression: meanOfFinites(input) # Box blur
# expression: sqrt(sumOfFinites(square(input - meanOfFinites(input))) ./ numberOfFinites(input)) # Standard deviation
# expression: 'sumOfFinites([0,-1,0;-1,5,-1;0,-1,0].*elevation_inpainted)' # Sharpen with kernel matrix
compute_empty_cells: true
edge_handling: crop # options: inside, crop, empty, mean
window_size: 5 # in number of cells (optional, default: 3), make sure to make this compatible with the kernel matrix
# window_length: 0.05 # instead of window_size, in m
gridMapFilters/DuplicationFilter
그리드 맵의 레이어를 복제합니다.
name: duplicate
type: gridMapFilters/DuplicationFilter
params:
input_layer: input
output_layer: output
gridMapFilters/DeletionFilter
그리드 맵에서 레이어를 삭제합니다.
name: delete
type: gridMapFilters/DeletionFilter
params:
layers: [color, score] # List of layers.
또한, Grid_map_cv 패키지는 다음 필터를 제공합니다:
gridMapCv/InpaintFilter
OpenCV를 사용하여 레이어의 구멍을 칠하거나 채울 수 있습니다.
name: inpaint
type: gridMapCv/InpaintFilter
params:
input_layer: input
output_layer: output
radius: 0.05 # in m
키네틱 | 멜로디 | 지식인 | |
---|---|---|---|
그리드_맵 | |||
의사 |
키네틱 | 멜로디 | 지식인 | |
---|---|---|---|
그리드_맵 | |||
그리드_맵_코어 | |||
Grid_map_costmap_2d | |||
그리드_맵_cv | |||
그리드_맵_데모스 | |||
그리드_맵_필터 | |||
그리드_맵_로더 | |||
Grid_map_msgs | |||
Grid_map_octomap | |||
그리드_맵_pcl | |||
그리드_맵_로스 | |||
Grid_map_rviz_plugin | |||
Grid_map_sdf | |||
그리드_맵_시각화 |
이슈 트래커를 사용하여 버그를 보고하고 기능을 요청하세요.