Как обновить сюжет scatter3 (в цикле) в Matlab - PullRequest
0 голосов
/ 16 января 2019

Довольно простой вопрос, но просто не смог найти ответ в Интернете ... Я хочу визуализировать облако точек, собранных из лидара. Я могу нанести отдельные кадры, но хотел зациклить их, чтобы создать «анимацию». Я знаю, как сделать это для обычных графиков с Drawnow, но не могу заставить его работать с Scatter3. Если я просто вызываю scatter3 снова, как я это делал в закомментированном коде, то кадр, который я просматриваю на графике разброса, перемещается с каждым обновлением (очень неудобно). Как получить график scatter3 для обновления до новых точек без изменения пользовательского интерфейса скаттера, т.е. По-прежнему сможете перемещаться и визуализировать облако точек, пока оно проходит.

РЕДАКТИРОВАТЬ: файл представляет собой файл rosbag, я не могу прикрепить его, потому что это 170 МБ. Проблема не возникает, когда использование scatter3 в цикле с обычным массивом похоже на использование scatter3 для вызова файла типа PointCloud2 с использованием frame = readMessages (rawBag, i).

РЕДАКТИРОВАТЬ: Проблема, кажется, не в пределах осей, а скорее в виде оси в окне рисунка. Когда разброс инициализируется, он просматривается с положительным знаком 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 голосов
/ 17 января 2019

Хитрость заключается в том, чтобы не использовать такие функции, как scatter или plot в анимации, а вместо этого изменять данные на графике, который уже существует. Эти функции всегда сбрасывают свойства осей, поэтому вы видите сброс представления. При изменении существующего графика оси не затрагиваются.

Функция scatter3 (как и все функции построения графиков) возвращает дескриптор графического объекта, который отображает график. В случае scatter3 этот дескриптор имеет здесь три свойства, представляющие интерес: XData, YData и ZData. Вы можете обновить эти свойства, чтобы изменить расположение точек:

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 также может быть совершенно другим, ему даже не нужно содержать одинаковое количество точек.

Но при изменении этих трех свойств вы увидите, что свойства осей XLim, YLim и ZLim изменятся. То есть оси будут масштабироваться для размещения всех данных. Если вам нужно это предотвратить, установите оси XLimMode, YLimMode и ZLimMode на 'manual':

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

При ручной установке пределов режим ограничения всегда устанавливается на ручной.

0 голосов
/ 16 января 2019

Насколько я понял, то, что вы описываете как "скачки вокруг графиков", является причиной автоматически настраиваемых пределов x, y, z графика scatter3. Вы можете изменить поведение XLimMode, YLimMode, ZLimMode на manual, чтобы заставить ось оставаться неподвижной. Однако вы должны указать начальные пределы осей.

% Mock data, since you haven't provided a data sample
x = randn(200,50);
y = randn(200,50);
z = randn(200,50);

% Plot first frame before loop
HS = scatter3(x(:,1), y(:,1), z(:,1));
hold on

% Provide initial axes limits (adjust to your data)
xlim([-5,5])
ylim([-5,5])
zlim([-5,5])
% Set 'LimModes' to 'manual' to prevent auto resaling of the plot
set(gca, 'XLimMode', 'manual', 'YLimMode', 'manual', 'ZLimMode', 'manual')

for i=2:len(x,2)
    scatter3(x(:,i), y(:,i), z(:,i))
    pause(1)
end 

Это дает «анимацию» графиков, где вы можете перемещаться и увеличивать масштаб данных, в то время как непрерывные точки добавляются в цикл

...