3.7 KiB
Узел ROS2 для генерации точек вблизи поверхности мэша
Узел содержит сервисы для создания и удаления точек вблизи поверхности указанного мэша.
Мэш должен состоять только из треугольных граней; требований по непрерывности и др. хорошим свойствам нет, но обрабатываются только грани с уклоном не более 0.1 рад (5.7 градусов), чтобы не заставлять робота ездить по крутым склонам.
Если в составе мэша есть несколько отдельных несвязных областей с почти горизонтальными мэшами, используется только та, в которой больше граней (независимо от площади и т.п.).
По возможности точки располагаются друг от друга на расстоянии не меньше 0.01 (в единицах, в которых заданы координаты мэша); от поверхности они удалены на 0.1. Вероятность генерации на каждом треугольнике одинакова
Установка
Для работы требуется нестандартный модуль Python trimesh. Чтобы поставить его, можно использовать rosdep:
export PIP_BREAK_SYSTEM_PACKAGES=1
rosdep install --from-paths src -y --ignore-src
Собирать всё потом можно, как обычно
colcon build --symlink-install
Запуск
source install/local_setup.bash
ros2 launch gen_locations_on_mesh mesh_loc_generator.py
После первого запуска генерируется кэшированный результат предобработки мэша в течение нескольких секунд (10-20); об окончании этого говорит появившееся сообщение
Cache for gen_locations_on_mesh saved successfully
Если нужно использовать другой мэш, то кэшированную версию надо удалить вручную из директории install/gen_locations_on_mesh/share/gen_locations_on_mesh/share/cache.pkl
Топик
Состояние постоянно спамится в топик locations типа gen_locations_on_mesh_msgs/msg/LocationsOnMesh. Каждое из его полей: location_id, x, y, z --- список, содержащий параметры точек. Все списки имеют одну длину.
Сервисы
Генерация точки выполняется вызовом сервиса generate_location без параметров:
ros2 service call /generate_location gen_locations_on_mesh_msgs/srv/GenerateLocation {}
В ответе содержатся номер точки и её координаты: gen_locations_on_mesh_msgs.srv.GenerateLocation_Response(location_id=1, x=434.56764747196445, y=-969.690370275587, z=73.794516038155)
Для уничтожения ранее созданной точки вызывается сервис remove_location с параметром location_id --- номером точки.
ros2 service call /remove_location gen_locations_on_mesh_msgs/srv/RemoveLocation '{location_id: 2}'
Возвращаемое значение False говорит о том, что такая точка неизвестна; True --- что точка успешно удалена.