Читайте в сообщении облака точек из сети ROS. Вычислите центр массы координат и отобразите облако точек как изображение.
Этот пример требует Computer Vision System Toolbox® и Robotics System Toolbox®.
Запустите сеть ROS.
rosinit
Initializing ROS master on http://bat5238win64:53347/. Initializing global node /matlab_global_node_62966 with NodeURI http://bat5238win64:53351/
Загрузите демонстрационные сообщения, чтобы отправить включая сообщение облака точки выборки, ptcloud
. Создайте издателя, чтобы отправить сообщение PointCloud2
ROS по теме '/ptcloud_test'
. Задайте тип сообщения как 'sensor_msgs/PointCloud2'
. Отправьте сообщение облака точек.
exampleHelperROSLoadMessages pub = rospublisher('/ptcloud_test','sensor_msgs/PointCloud2'); send(pub,ptcloud)
Откройте модель Simulink® для подписки на сообщение ROS и чтения в облаке точек от ROS.
Гарантируйте, что блок Subscribe
подписывается на тему '/ptcloud_test'
. В меню под Инструментами> Операционная система Робота> Управляет Длинами массива, проверяет, что массив Data
имеет максимальную длину, больше, чем демонстрационное изображение (9 830 400 точек).
Модель только отображает значения RGB облака точек как изображение. XYZ
вывод используется, чтобы вычислить центр массы (среднее значение) координат с помощью блока MATLAB function. Все значения NaN
проигнорированы.
open_system('read_point_cloud_example_model.slx')
Запустите модель. Video Viewer
показывает облако точки выборки изображением. Выходным центром массы является [-0.2869 -0.0805 2.232]
для этого облака точек.
Остановите симуляцию и закройте сеть ROS.
rosshutdown
Shutting down global node /matlab_global_node_62966 with NodeURI http://bat5238win64:53351/ Shutting down ROS master on http://bat5238win64:53347/.
Функциональный блок pointCloudCOM
содержит следующий код для вычисления центра массы координат.
function comXYZ = pointCloudCOM(xyzPoints) % Compute the center of mass of a point cloud based on the input NxMx3 % matrix. % Turn matrix into vectors. xPoints = reshape(xyzPoints(:,:,1),numel(xyzPoints(:,:,1)),1); yPoints = reshape(xyzPoints(:,:,2),numel(xyzPoints(:,:,2)),1); zPoints = reshape(xyzPoints(:,:,3),numel(xyzPoints(:,:,3)),1); % Calculate the mean for each set of coordinates. xMean = mean(xPoints,'omitnan'); yMean = mean(yPoints,'omitnan'); zMean = mean(zPoints,'omitnan'); comXYZ = [xMean,yMean,zMean]; end