Считайте сообщение облака точек ROS в Simulink®

Читайте в сообщении облака точек из сети 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