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

Читайте в сообщении облака точек из сети ROS. Вычислите центр массы координат и отобразите облако точек как изображение.

Этот пример требует Computer Vision Toolbox® и Robotics System Toolbox®.

Запустите сеть ROS.

rosinit
Initializing ROS master on http://ah-rhosea:11311/.
Initializing global node /matlab_global_node_07639 with NodeURI http://ah-rhosea:51851/

Загрузите демонстрационные сообщения, чтобы отправить включая сообщение облака точки выборки, ptcloud. Создайте издателя, чтобы отправить PointCloud2 ROS обменивайтесь сообщениями на '/ptcloud_test' тема. Задайте тип сообщения как 'sensor_msgs/PointCloud2'. Отправьте сообщение облака точек.

exampleHelperROSLoadPCloud
pub = rospublisher('/ptcloud_test','sensor_msgs/PointCloud2');
send(pub,ptcloud)

Откройте модель Simulink® для подписки на сообщение ROS и чтения в облаке точек от ROS.

Убедитесь, что Subscribe блок подписывается на '/ptcloud_test' тема. Под вкладкой Simulation выберите ROS Toolbox> Variable Size Arrays и проверьте 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_07639 with NodeURI http://ah-rhosea:51851/
Shutting down ROS master on http://ah-rhosea:11311/.

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