如何在Matlab中(循环)更新scatter3图

时间:2019-01-16 03:04:18

标签: matlab matlab-figure point-clouds scatter3d

一个简单的问题,但无法在线找到答案...我想可视化从激光雷达收集的点云。我可以绘制单个帧,但想循环它们以创建“动画”。我知道如何使用drawow在普通情节中做到这一点,但无法使其与散点图一起工作。如果像在注释的代码中那样再次简单地调用scatter3,则我在散点图中查看的帧会在每次更新时跳来跳去(非常不舒服)。我如何在不更改散点图UI的情况下将scatter3图更新到新点。循环时,仍然可以在可视化点云之间平移和缩放。

编辑:该文件是rosbag文件,因为它为170MB,所以无法附加。当在具有正常数组的循环中使用scatter3似乎是使用scatter3通过frame = readMessages(rawBag,i)调用PointCloud2类型文件时,不会发生此问题。

编辑:问题似乎不在于轴限制,而在于图形窗口内的轴视图。初始化散点后,将正x移至右侧,将正y移出屏幕,将正z向上移,如视图1所示。然后过一会儿,它会跳到第二个视图,其中轴具有更改后,正x不在屏幕上,正y在右边,z在向上(两个视图均在图中显示)。由于不断切换,因此无法循环查看。那么基本上如何在不调用scatter3( pointCloudData )的情况下更新图?


rawBag = rosbag('jackwalking.bag');

frame = readMessages(rawBag, 1);
scatter3(frame{1});
hold on

for i = 1:length(readMessages(rawBag))
    disp(i)
    frame = readMessages(rawBag, i);

    % UPDATE the 3D Scatter %
    % drawnow does not work?
    % Currently using:
    scatter3(frame{1})
    pause(.01)
end

View 1

View 2

2 个答案:

答案 0 :(得分:2)

诀窍是不要在动画中使用诸如scatterplot之类的函数,而是修改已经存在的绘图中的数据。这些功能始终会重置轴属性,这就是为什么您会看到视图重置的原因。修改现有图时,轴不受影响。

函数scatter3(与所有绘图功能一样)返回用于渲染图形的图形对象的句柄。对于scatter3,此句柄在此处具有三个感兴趣的属性:XDataYDataZData。您可以更新这些属性以更改点的位置:

N = 100;
data = randn(N,3) * 40;

h = scatter3(data(:,1),data(:,2),data(:,3));
for ii = 1:500
   data = data + randn(N,3);
   set(h,'XData',data(:,1),'YData',data(:,2),'ZData',data(:,3));
   drawnow
   pause(1/5)
end

新的data也可以完全不同,甚至不需要包含相同数量的点。

但是在修改这三个属性时,您将看到轴的XLimYLimZLim属性发生变化。也就是说,轴将重新缩放以容纳所有数据。如果需要防止这种情况,请将轴的XLimModeYLimModeZLimMode设置为'manual'

set(gca,'XLimMode','manual','YLimMode','manual','ZLimMode','manual')

手动设置限制时,限制模式始终设置为手动。

答案 1 :(得分:0)

据我所知,您所描述的“图跳来跳去”,其原因是{{1}的自动调整的xyz限制情节。您可以将scatter3XLimModeYLimMode的行为更改为ZLimMode,以强制轴保持固定。不过,您必须提供初始轴限制。

manual

这会产生图的“动画”,您可以在循环中添加连续点的同时平移和缩放数据