Считайте в облаке точек сообщение от сети 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
. Создайте издателя для отправки ROS- PointCloud2
сообщение на '/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 > Массивы переменного размера и проверьте Data
массив имеет максимальную длину, большую, чем образец изображения (9 830 400 точки).
Модель отображает только значения RGB облака точек как изображение. The XYZ
выход используется для вычисления центра масс (среднего) координат с помощью блока MATLAB Function. Все NaN
значения игнорируются.
open_system('read_point_cloud_example_model.slx')
Запустите модель. The 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/.
The 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