В этом примере показано, как считать ROS 2 PointCloud2
сообщения в Simulink® и восстанавливают 3-D сцену путем объединения нескольких облаков точек с помощью алгоритма нормальных распределений преобразовывают (NDT). Этот пример требует Computer Vision Toolbox®.
Загрузите два демонстрационных sensor_msgs/PointCloud2
сообщения, ptcloudMsg1
и ptcloudMsg2
. Создайте узел ROS 2 с двумя издателями, чтобы опубликовать сообщения по темам /ptcloud1
и /ptcloud2
. Для издателей, набор свойство Durability
качества сервиса (QoS) к
transientlocal
. Это гарантирует, что издатели обеспечивают сообщения для любых подписчиков, которые присоединяются после того, как сообщения были уже отправлены. Опубликуйте сообщения с помощью send
функция.
load("ros2PtcloudMsgs.mat"); node = ros2node("/point_cloud_publisher"); ptcloudPub1 = ros2publisher(node,"/ptcloud1","sensor_msgs/PointCloud2",Durability="transientlocal",Depth=2); ptcloudPub2 = ros2publisher(node,"/ptcloud2","sensor_msgs/PointCloud2",Durability="transientlocal",Depth=2); send(ptcloudPub1,ptcloudMsg1) send(ptcloudPub2,ptcloudMsg2)
Откройте модель.
modelName = "read_pointcloud_and_perform_stitching_example_model.slx";
open_system(modelName)
Убедитесь, что эти два Подписываются, блоки соединяются с темами, /ptcloud1
и /ptcloud2
. Значением Длительности параметр QoS Подписать блоков является Transient
local
. Это гарантирует совместимость с настройками QoS издателей, которых вы сконфигурировали в предыдущем разделе. Сообщения от подписчиков питаются блоки Облака точек Чтения, чтобы извлечь данные об облаке точек, которые затем питаются registerAndStitchPointclouds
Блок MATLAB function, чтобы выполнить регистрацию и сшивание.
Под вкладкой Simulation выберите ROS Toolbox> Variable Size Messages. Заметьте, что пределы значения по умолчанию Использования для этого типа сообщения ясны. Затем в Максимальном столбце длины проверьте что data
свойство sensor_msgs/PointCloud2
сообщение имеет значение, больше, чем число точек в pointcloud (4915200). Запустите модель.
sim(modelName);
Модель выполняет регистрацию облака точек с помощью алгоритма NDT и оценивает 3-D преобразование облака точек, опубликованного на /ptcloud2
тема, относительно облака точек опубликована на /ptcloud1
тема. Затем это преобразовывает /ptcloud2
облако точек к системе координат привязки /ptcloud1
облако точек. Это затем сшивает преобразованное облако точек с /pcloud1
облако точек, чтобы создать 3-D мировую сцену. Это также визуализирует эти два облака точек наряду с мировой сценой.
Эта модель использует алгоритм в ExampleHelperRegisterAndStitchPointclouds
Функция MATLAB, чтобы выполнить облако точек, сшивающее использование регистрации, состоя из этих шагов:
Downsample облака точек с 10
сеточный фильтр cm, чтобы ускорить регистрацию и улучшить точность при помощи pcdownsample
(Computer Vision Toolbox) функция.
Выровняйте два прореженных облака точек с помощью pcregisterndt
(Computer Vision Toolbox) ,
который использует алгоритм NDT, чтобы оценить 3-D твердое преобразование второго pointcloud относительно первого облака точек.
Преобразуйте второе облако точек к системе координат первого облака точек с помощью pctransform
(Computer Vision Toolbox) функция.
Объедините преобразованное облако точек и первое облако точек с сеточным фильтром поля на 1,5 см при помощи pcmerge
(Computer Vision Toolbox) функция.
Визуализируйте эти два облака точек и восстановленную 3-D мировую сцену.
Для получения дополнительной информации о регистрации и сшивании облаков точек, смотрите 3-D Регистрацию облака точек и Сшивание (Computer Vision Toolbox). Регистрация является также ключевым начальным шагом в облаке точек приложения SLAM. Для обзора облака точек рабочий процесс SLAM с помощью MATLAB смотрите Облако точек Реализации SLAM в MATLAB (Computer Vision Toolbox).
function ExampleHelperRegisterAndStitchPointclouds(xyzPoints1, rgbValues1, xyzPoints2, rgbValues2) %% %#codegen % Declare functions not supported for code generation as extrinsic coder.extrinsic("pcshow"); %% %Create pointcloud objects from extracted xyz points and color data pcloud1 = pointCloud(xyzPoints1); pcloud1.Color = uint8(rgbValues1*255); pcloud2 = pointCloud(xyzPoints2); pcloud2.Color = uint8(rgbValues2*255); %Downsample the point clouds pcloud1Downsampled = pcdownsample(pcloud1,gridAverage=0.1); pcloud2Downsampled = pcdownsample(pcloud2,gridAverage=0.1); % Register the two pointclouds using the NDT algorithm gridStep = 0.5; tform = pcregisterndt(pcloud2Downsampled,pcloud1Downsampled,gridStep); % Transform and align the frame of point cloud 2 to the frame of point cloud 1 pCloudAligned = pctransform(pcloud2,tform); % Stitch the transformed point cloud 2 with point cloud 1 mergeSize = 0.015; ptCloudScene = pcmerge(pcloud1, pCloudAligned, mergeSize); % Visualize the two point clouds and the merged point clouds subplot(2,2,1) pcshow(pcloud1.Location,pcloud1.Color,VerticalAxis="Y",VerticalAxisDir="Down"); title("Point Cloud 1") view(0,-90); subplot(2,2,2) pcshow(pcloud2.Location,pcloud2.Color,VerticalAxis="Y",VerticalAxisDir="Down"); title("Point Cloud 2") view(0,-90); subplot(2,2,[3,4]) pcshow(ptCloudScene.Location,ptCloudScene.Color,VerticalAxis="Y",VerticalAxisDir="Down"); title("Merged Point Cloud") view(0,-90); end