هذه مكتبة C++ مع واجهة ROS لإدارة خرائط الشبكة ثنائية الأبعاد مع طبقات بيانات متعددة. إنه مصمم لرسم الخرائط الروبوتية المتنقلة لتخزين البيانات مثل الارتفاع والتباين واللون ومعامل الاحتكاك وجودة موطئ القدم والسطح الطبيعي وإمكانية العبور وما إلى ذلك. ويتم استخدامه في حزمة رسم الخرائط للارتفاعات المتمحورة حول الروبوت والمصممة للملاحة في الأراضي الوعرة.
سمات:
هذا هو رمز البحث، توقع أنه يتغير كثيرًا ويتم إخلاء المسؤولية عن أي ملاءمة لغرض معين.
يتم إصدار الكود المصدري بموجب ترخيص BSD 3-Clause.
المؤلف: بيتر فانكهاوزر
الانتماء: ANYbotics
المشرف: ماكسيميليان وولف، [email protected]، ماغنوس جارتنر، [email protected]
بمساهمات من: سيمون أريجيني، تانيا باومان، جيف ديلميريكو، ريمو ديثيلم، بيري فرانكلين، ماجنوس جارتنر، روبن جرانديا، إيدو يلافيتش، دومينيك جود، رالف كيستنر، فيليب كروسي، أليكس ميلان، دانييل ستونير، إيلينا ستوم، مارتن فيرميلينجر، كريستوس زاليديس
تم تطوير هذا المشروع في البداية في ETH Zurich (مختبر الأنظمة الذاتية ومختبر الأنظمة الروبوتية).
يتم إجراء هذا العمل كجزء من ANYmal Research، وهو مجتمع لتطوير الروبوتات ذات الأرجل.
إذا كنت تستخدم هذا العمل في سياق أكاديمي، يرجى ذكر المنشور التالي:
P. Fankhauser وM. Hutter، "مكتبة خرائط الشبكة العالمية: حالة التنفيذ والاستخدام للملاحة في التضاريس الوعرة" ، في نظام تشغيل الروبوت (ROS) - المرجع الكامل (المجلد 1)، أ. كوبا (تحرير)، سبرينغر ، 2016. (بي دي إف)
@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++ هنا:
لتثبيت جميع الحزم من مكتبة خرائط الشبكة كما تستخدم حزم دبيان
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 هو عرض توضيحي موسع لوظائف المكتبة. قم بتشغيل البرنامج التعليمي_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
يوضح solution_change_demo كيف يمكن تغيير دقة خريطة الشبكة بمساعدة طرق قياس الصورة OpenCV. ورؤية النتائج، استخدم
roslaunch grid_map_demos resolution_change_demo.launch
يستخدم Filters_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 .
ملحوظة: للحصول على أقصى قدر من الكفاءة عند استخدام التكرارات، يوصى بتخزين الوصول المباشر محليًا إلى طبقات البيانات الخاصة بخريطة الشبكة باستخدام grid_map::Matrix& data = map["layer"]
خارج حلقة 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;
}
يمكنك العثور على قياس أداء التكرارات في عقدة iterator_benchmark
الخاصة بحزمة grid_map_demos
والتي يمكن تشغيلها باستخدام
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(...)
: ينقل المنطقة التي تم التقاطها بواسطة خريطة الشبكة إلى إطار خريطة الشبكة الثابتة. استخدم هذا لتحريك حدود خريطة الشبكة دون نقل بيانات خريطة الشبكة. يعتني بجميع عمليات معالجة البيانات، بحيث تكون بيانات خريطة الشبكة ثابتة في إطار خريطة الشبكة.
ملاحظة : نظرًا للبنية المؤقتة الدائرية، قد لا تقع المؤشرات المجاورة بالقرب من إطار الخريطة. ينطبق هذا الافتراض فقط على المؤشرات التي تم الحصول عليها بواسطة getUnwrappedIndex().
setPosition(...) | move(...) |
---|---|
يتصور هذا البرنامج المساعد RViz طبقة خريطة الشبكة كمؤامرة سطحية ثلاثية الأبعاد (خريطة الارتفاع). يمكن اختيار طبقة منفصلة كطبقة لمعلومات اللون.
توفر هذه الحزمة خوارزمية فعالة لتحويل خريطة الارتفاع إلى حقل مسافة كثيف ثلاثي الأبعاد. تحتوي كل نقطة في الشبكة ثلاثية الأبعاد على المسافة إلى أقرب نقطة في الخريطة مع التدرج.
تشترك هذه العقدة في موضوع من النوع 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
(sensor_msgs/PointCloud2)
تظهر خريطة الشبكة كسحابة نقطية "مسطحة"، أي أن جميع النقاط على نفس الارتفاع z . يعد هذا أمرًا مناسبًا لتصور الخرائط أو الصور ثنائية الأبعاد (أو حتى تدفقات الفيديو) في RViz بمساعدة Color Transformer
الخاص بها. يحدد height
المعلمة الموضع z المطلوب للسحابة ذات النقطة المسطحة.
name: flat_grid
type: flat_point_cloud
params:
height: 0.0
ملحوظة: لحذف النقاط الموجودة في سحابة النقطة المسطحة من الخلايا الفارغة/غير الصالحة، حدد الطبقات التي يجب التحقق من صحتها باستخدام setBasicLayers(...)
.
vectors
(visualization_msgs/Marker)
تصور البيانات المتجهة لخريطة الشبكة كعلامات مرئية. حدد الطبقات التي تحتوي على مكونات x - و y - و z للمتجهات باستخدام معلمة layer_prefix
. تحدد المعلمة 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. علاوة على ذلك، يمكن كتابة مرشحات إضافية وإتاحتها من خلال آلية البرنامج الإضافي ROS، مثل InpaintFilter
من الحزمة grid_map_cv
.
يتم توفير العديد من المرشحات الأساسية في الحزمة Grid_map_filters :
gridMapFilters/ThresholdFilter
قم بتعيين القيم في طبقة الإخراج إلى قيمة محددة إذا كانت طبقة الحالة تتجاوز العتبة العلوية أو السفلية (عتبة واحدة فقط في كل مرة).
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 من الطبقة المتوسطة (للحدود) داخل رقعة ذات نصف قطر. بشكل اختياري، قم بتطبيق الحسابات المتوسطة للقيم المحدودة بالفعل، ويتم تحديد نصف قطر التصحيح لهذه النقاط بواسطة radius_value_radius. لاحظ أن حساب التعبئة يتم إجراؤه فقط إذا كان قناع التعبئة صالحًا لهذه النقطة.
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 | |||
وثيقة |
الحركية | لحني | عقلي | |
---|---|---|---|
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_visualization |
يرجى الإبلاغ عن الأخطاء وطلب الميزات باستخدام أداة تعقب المشكلات.