Ini adalah pustaka C++ dengan antarmuka ROS untuk mengelola peta kisi dua dimensi dengan banyak lapisan data. Ini dirancang untuk pemetaan robot seluler untuk menyimpan data seperti ketinggian, varians, warna, koefisien gesekan, kualitas pijakan, normal permukaan, kemampuan traversabilitas, dll. Ini digunakan dalam paket Pemetaan Ketinggian Berpusat pada Robot yang dirancang untuk navigasi medan kasar.
Fitur:
Ini adalah kode penelitian, diharapkan sering berubah dan kesesuaian apa pun untuk tujuan tertentu tidak disangkal.
Kode sumber dirilis di bawah lisensi BSD 3-Clause.
Penulis: Péter Fankhauser
Afiliasi: ANYbotics
Pengelola: Maximilian Wulf, [email protected], Magnus Gärtner, [email protected]
Dengan kontribusi oleh: 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 Zalidis
Proyeksi ini awalnya dikembangkan di ETH Zurich (Autonomous Systems Lab & Robotic Systems Lab).
Pekerjaan ini dilakukan sebagai bagian dari ANYmal Research, sebuah komunitas untuk memajukan robotika berkaki.
Jika Anda menggunakan karya ini dalam konteks akademis, harap mengutip publikasi berikut:
P. Fankhauser dan M. Hutter, "Perpustakaan Peta Grid Universal: Implementasi dan Kasus Penggunaan untuk Navigasi Medan Kasar" , dalam Sistem Operasi Robot (ROS) – Referensi Lengkap (Volume 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}
}
Cabang-cabang ini saat ini dipertahankan:
Permintaan tarik untuk ROS 1 harus menargetkan master
. Permintaan penarikan untuk ROS 2 harus menargetkan rolling
dan akan di-backport jika tidak merusak ABI.
Pengantar perpustakaan peta grid termasuk tutorial diberikan dalam bab buku ini.
C++ API didokumentasikan di sini:
Untuk menginstal semua paket dari perpustakaan peta grid seperti yang digunakan paket Debian
sudo apt-get install ros-$ROS_DISTRO-grid-map
Paket grid_map_core hanya bergantung pada perpustakaan aljabar linier Eigen.
sudo apt-get install libeigen3-dev
Paket lainnya juga bergantung pada instalasi standar ROS ( roscpp , tf , filter , sensor_msgs , nav_msgs , dan cv_bridge ). Paket konversi spesifik format lainnya (misalnya grid_map_cv , grid_map_pcl dll.) bergantung pada paket yang dijelaskan di bawah dalam Ikhtisar Paket .
Untuk membangun dari sumber, kloning versi terbaru dari repositori ini ke ruang kerja catkin Anda dan kompilasi paket menggunakan
cd catkin_ws/src
git clone https://github.com/anybotics/grid_map.git
cd ../
catkin_make
Untuk memaksimalkan kinerja, pastikan untuk membangun dalam mode Rilis . Anda dapat menentukan tipe build dengan mengatur
catkin_make -DCMAKE_BUILD_TYPE=Release
Repositori ini terdiri dari paket-paket berikut:
GridMap
dan beberapa kelas pembantu seperti iterator. Paket ini diimplementasikan tanpa ketergantungan ROS.Paket konversi tambahan:
Jalankan pengujian unit dengan
catkin_make run_tests_grid_map_core run_tests_grid_map_ros
atau
catkin build grid_map --no-deps --verbose --catkin-make-args run_tests
jika Anda menggunakan alat catkin.
Paket grid_map_demos berisi beberapa node demonstrasi. Gunakan kode ini untuk memverifikasi instalasi paket peta grid dan untuk memulai penggunaan perpustakaan Anda sendiri.
simple_demo mendemonstrasikan contoh sederhana untuk menggunakan perpustakaan peta grid. Node ROS ini membuat peta grid, menambahkan data ke dalamnya, dan menerbitkannya. Untuk melihat hasilnya di RViz, jalankan perintah
roslaunch grid_map_demos simple_demo.launch
tutorial_demo adalah demonstrasi lanjutan dari fungsi perpustakaan. Luncurkan tutorial_demo dengan
roslaunch grid_map_demos tutorial_demo.launch
iterators_demo menampilkan penggunaan iterator peta grid. Luncurkan dengan
roslaunch grid_map_demos iterators_demo.launch
image_to_gridmap_demo mendemonstrasikan cara mengkonversi data dari gambar ke peta grid. Mulailah demonstrasi dengan
roslaunch grid_map_demos image_to_gridmap_demo.launch
grid_map_to_image_demo mendemonstrasikan cara menyimpan lapisan peta grid ke gambar. Mulailah demonstrasi dengan
rosrun grid_map_demos grid_map_to_image_demo _grid_map_topic:=/grid_map _file:=/home/$USER/Desktop/grid_map_image.png
opencv_demo mendemonstrasikan manipulasi peta dengan bantuan fungsi OpenCV. Mulailah demonstrasi dengan
roslaunch grid_map_demos opencv_demo.launch
resolusi_perubahan_demo menunjukkan bagaimana resolusi peta grid dapat diubah dengan bantuan metode penskalaan gambar OpenCV. Lihat hasilnya, gunakan
roslaunch grid_map_demos resolution_change_demo.launch
filter_demo menggunakan rangkaian Filter ROS untuk memproses peta grid. Dimulai dari ketinggian peta medan, demo menggunakan beberapa filter untuk menunjukkan cara menghitung normal permukaan, menggunakan pengecatan ulang untuk mengisi lubang, memperhalus/mengaburkan peta, dan menggunakan ekspresi matematika untuk mendeteksi tepian, menghitung kekasaran dan kemampuan traversabilitas. Penyiapan rantai filter dikonfigurasikan di file filters_demo_filter_chain.yaml
. Luncurkan demo dengan
roslaunch grid_map_demos filters_demo.launch
Untuk informasi selengkapnya tentang filter peta kisi, lihat grid_map_filters.
interpolation_demo menunjukkan hasil metode interpolasi yang berbeda pada permukaan yang dihasilkan. Mulai demo, gunakan
roslaunch grid_map_demos interpolation_demo.launch
Pengguna dapat bermain dengan dunia (permukaan) berbeda dan pengaturan interpolasi berbeda di file interpolation_demo.yaml
. Visualisasi tersebut menampilkan kebenaran dasar dalam warna hijau dan kuning. Hasil interpolasi ditampilkan dengan warna merah dan ungu. Selain itu, demo ini menghitung kesalahan interpolasi maksimal dan rata-rata, serta waktu rata-rata yang diperlukan untuk satu kueri interpolasi.
Peta kisi menampilkan empat metode interpolasi yang berbeda (untuk meningkatkan akurasi dan meningkatkan kompleksitas):
Untuk lebih jelasnya periksa literatur yang tercantum dalam file CubicInterpolation.hpp
.
Pustaka peta grid berisi berbagai iterator untuk kenyamanan.
Peta kisi | Subpeta | Lingkaran | Garis | Poligon |
---|---|---|---|---|
Elips | Spiral | |||
Menggunakan iterator dalam perulangan for
adalah hal biasa. Misalnya, ulangi seluruh peta grid dengan GridMapIterator
dengan
for (grid_map::GridMapIterator iterator(map); !iterator.isPastEnd(); ++iterator) {
cout << "The value at index " << (*iterator).transpose() << " is " << map.at("layer", *iterator) << endl;
}
Iterator peta grid lainnya mengikuti bentuk yang sama. Anda dapat menemukan lebih banyak contoh tentang cara menggunakan iterator yang berbeda di node iterators_demo .
Catatan: Untuk efisiensi maksimum saat menggunakan iterator, disarankan untuk menyimpan akses langsung ke lapisan data peta grid secara lokal dengan grid_map::Matrix& data = map["layer"]
di luar loop for
:
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;
}
Anda dapat menemukan tolok ukur kinerja iterator di node iterator_benchmark
dari paket grid_map_demos
yang dapat dijalankan dengan
rosrun grid_map_demos iterator_benchmark
Berhati-hatilah karena meskipun iterator mudah digunakan, seringkali yang paling bersih dan efisien adalah menggunakan metode Eigen bawaan. Berikut beberapa contohnya:
Menetapkan nilai konstan ke semua sel lapisan:
map["layer"].setConstant(3.0);
Menambahkan dua lapisan:
map["sum"] = map["layer_1"] + map["layer_2"];
Menskalakan lapisan:
map["layer"] = 2.0 * map["layer"];
Maks. nilai antara dua lapisan:
map["max"] = map["layer_1"].cwiseMax(map["layer_2"]);
Hitung kesalahan akar rata-rata kuadrat:
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);
Ada dua metode berbeda untuk mengubah posisi peta:
setPosition(...)
: Mengubah posisi peta tanpa mengubah data yang tersimpan di peta. Hal ini mengubah korespondensi antara data dan bingkai peta.
move(...)
: Memindahkan wilayah yang ditangkap oleh peta grid ke bingkai peta grid statis. Gunakan ini untuk memindahkan batas peta grid tanpa merelokasi data peta grid. Menangani semua penanganan data, sehingga data peta grid tidak bergerak dalam bingkai peta grid.
Catatan : Karena struktur buffer melingkar, indeks tetangga mungkin tidak berada dekat dalam bingkai peta. Asumsi ini hanya berlaku untuk indeks yang diperoleh dengan getUnwrappedIndex().
setPosition(...) | move(...) |
---|---|
Plugin RViz ini memvisualisasikan lapisan peta grid sebagai plot permukaan 3d (peta ketinggian). Lapisan terpisah dapat dipilih sebagai lapisan untuk informasi warna.
Paket ini menyediakan algoritme yang efisien untuk mengubah peta ketinggian menjadi bidang jarak bertanda 3D yang padat. Setiap titik dalam kisi 3D berisi jarak ke titik terdekat di peta beserta gradiennya.
Node ini berlangganan topik tipe grid_map_msgs/GridMap dan menerbitkan pesan yang dapat divisualisasikan di RViz. Topik visualisator yang dipublikasikan dapat dikonfigurasikan sepenuhnya dengan file parameter YAML. Sejumlah visualisasi dengan parameter berbeda dapat ditambahkan. Contohnya di sini untuk file konfigurasi tutorial_demo .
Titik awan | vektor | Jaringan hunian | Sel kisi |
---|---|---|---|
grid_map_topic
(string, default: "/grid_map")
Nama topik peta grid yang akan divisualisasikan. Lihat di bawah untuk deskripsi visualisator.
/grid_map
(grid_map_msgs/GridMap)
Peta grid untuk divisualisasikan.
Topik yang diterbitkan dikonfigurasi dengan file parameter YAML. Topik yang mungkin adalah:
point_cloud
(sensor_msgs/PointCloud2)
Menampilkan peta kisi sebagai titik awan. Pilih lapisan mana yang akan diubah sebagai titik dengan parameter layer
.
name: elevation
type: point_cloud
params:
layer: elevation
flat: false # optional
flat_point_cloud
(sensor_msgs/PointCloud2)
Menampilkan peta grid sebagai titik awan "datar", yaitu dengan semua titik pada ketinggian yang sama z . Ini memudahkan untuk memvisualisasikan peta atau gambar 2d (atau bahkan aliran video) di RViz dengan bantuan Color Transformer
-nya. height
parameter menentukan posisi z yang diinginkan dari titik awan datar.
name: flat_grid
type: flat_point_cloud
params:
height: 0.0
Catatan: Untuk menghilangkan titik-titik di awan titik datar dari sel kosong/tidak valid, tentukan lapisan yang harus diperiksa validitasnya dengan setBasicLayers(...)
.
vectors
(visualisasi_msgs/Marker)
Memvisualisasikan data vektor peta grid sebagai penanda visual. Tentukan lapisan yang menampung komponen x -, y -, dan z - dari vektor dengan parameter layer_prefix
. Parameter position_layer
mendefinisikan lapisan yang akan digunakan sebagai titik awal vektor.
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)
Memvisualisasikan lapisan peta grid sebagai grid hunian. Tentukan lapisan yang akan divisualisasikan dengan parameter layer
, dan batas atas dan bawah dengan data_min
dan data_max
.
name: traversability_grid
type: occupancy_grid
params:
layer: traversability
data_min: -0.15
data_max: 0.15
grid_cells
(nav_msgs/GridCells)
Memvisualisasikan lapisan peta kisi sebagai sel kisi. Tentukan lapisan yang akan divisualisasikan dengan parameter layer
, dan batas atas dan bawah dengan lower_threshold
dan 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
(visualisasi_pesan/Penanda)
Menunjukkan batas peta grid.
name: map_region
type: map_region
params:
color: 3289650
line_width: 0.003
Catatan: Nilai warna dalam bentuk RGB sebagai bilangan bulat gabungan (untuk setiap nilai saluran 0-255). Nilainya bisa dihasilkan seperti ini sebagai contoh untuk warna hijau (merah: 0, hijau: 255, biru: 0).
Paket grid_map_filters berisi beberapa filter yang dapat menerapkan peta grid untuk melakukan komputasi pada data di lapisan. Filter peta kisi didasarkan pada Filter ROS, yang berarti rangkaian filter dapat dikonfigurasi sebagai file YAML. Selanjutnya, filter tambahan dapat ditulis dan tersedia melalui mekanisme plugin ROS, seperti InpaintFilter
dari paket grid_map_cv
.
Beberapa filter dasar disediakan dalam paket grid_map_filters :
gridMapFilters/ThresholdFilter
Tetapkan nilai di lapisan keluaran ke nilai yang ditentukan jika lapisan_kondisi melebihi ambang batas atas atau bawah (hanya satu ambang batas pada satu waktu).
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
Hitung untuk setiap sel lapisan nilai rata-rata di dalam radius.
name: mean_in_radius
type: gridMapFilters/MeanInRadiusFilter
params:
input_layer: input
output_layer: output
radius: 0.06 # in m.
gridMapFilters/MedianFillFilter
Hitung untuk setiap sel NaN dari suatu lapisan median (hingga) di dalam tambalan dengan radius. Secara opsional, terapkan penghitungan median untuk nilai yang sudah terbatas, radius patch untuk titik-titik ini diberikan oleh radius_nilai_yang ada. Perhatikan bahwa perhitungan pengisian hanya dilakukan jika fill_mask valid untuk titik tersebut.
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
Hitung vektor normal suatu lapisan pada peta.
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
Hitung lapisan warna baru berdasarkan lapisan vektor normal.
name: surface_normals
type: gridMapFilters/NormalColorMapFilter
params:
input_layers_prefix: normal_vectors_
output_layer: normal_color
gridMapFilters/MathExpressionFilter
Mengurai dan mengevaluasi ekspresi matriks matematika dengan lapisan peta kisi. Lihat EigenLab untuk dokumentasi ekspresi.
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
Mengurai dan mengevaluasi ekspresi matriks matematika dalam jendela geser pada lapisan peta kisi. Lihat EigenLab untuk dokumentasi ekspresi.
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
Gandakan lapisan peta grid.
name: duplicate
type: gridMapFilters/DuplicationFilter
params:
input_layer: input
output_layer: output
gridMapFilters/DeletionFilter
Hapus lapisan dari peta grid.
name: delete
type: gridMapFilters/DeletionFilter
params:
layers: [color, score] # List of layers.
Selain itu, paket grid_map_cv menyediakan filter berikut:
gridMapCv/InpaintFilter
Gunakan OpenCV untuk mengecat/mengisi lubang di sebuah lapisan.
name: inpaint
type: gridMapCv/InpaintFilter
params:
input_layer: input
output_layer: output
radius: 0.05 # in m
Kinetis | Merdu | Niskala | |
---|---|---|---|
grid_map | |||
dokter |
Kinetis | Merdu | Niskala | |
---|---|---|---|
grid_map | |||
grid_map_core | |||
grid_map_costmap_2d | |||
grid_map_cv | |||
grid_map_demos | |||
grid_map_filters | |||
grid_map_loader | |||
grid_map_msgs | |||
grid_map_octomap | |||
grid_map_pcl | |||
grid_map_ros | |||
grid_map_rviz_plugin | |||
grid_map_sdf | |||
grid_map_visualisasi |
Silakan laporkan bug dan minta fitur menggunakan Issue Tracker.