Доступ к значению других ползунков из ValueChangingFcn - PullRequest
0 голосов
/ 30 августа 2018

У меня есть несколько ползунков внутри фигуры, и я хотел бы опубликовать их значения (используя набор инструментов робототехники), когда один из них изменится. Я не могу получить доступ к значению более чем одного ползунка - попытка доступа к значениям ползунка дает мне следующую ошибку в функции sliderMoving:

Undefined variable "event1" or class "event1.Value".

Код выглядит следующим образом:

function sliderchanging

%rosinit('129.78.214.177');
first_val = 0;
euler_v = rossubscriber('/Euler_values');
slider_v = rospublisher('/Slider_values', 'std_msgs/Float64MultiArray');
slidermsg = rosmessage(slider_v); 

eulermsg = rostopic('echo', '/Euler_values');
ypr = eulermsg.Data;
y = ypr(1);
p = ypr(2);
r = ypr(3);

fig = uifigure;
sld = uislider(fig,'Position',[20 50 260 20],'ValueChangingFcn',@(sld,event) sliderMoving(event, slidermsg, slider_v, y, p, r));
sld1 = uislider(fig,'Position',[20 80 260 20],'ValueChangingFcn',@(sld1,event1) sliderMoving(event1, slidermsg, slider_v, y, p, r));

if first_val == 0
   send(slider_v, eulermsg); 
end
sld.Limits = [y-2 y+2];
sld.Value = y;
sld.Position = [20 50 260 20];
sld1.Limits = [p-2 p+2];
sld1.Value = p;
sld1.Position = [20 80 260 20];
end

function sliderMoving(event, slidermsg, slider_v, y, p, r)
first_val = 1;

disp(event.Value)
disp(event1.Value)
slidermsg.Data = [event.Value, p, r];
send(slider_v, slidermsg)
end

Что не так с этим кодом? Как я могу получить доступ к значениям всех доступных ползунков из обратного вызова sliderMoving?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Как говорится в сообщении об ошибке, event1 не является переменной или классом. Вы не можете скопировать код слайдера и ставить 1 после каждой записи.

Я предлагаю вам взглянуть на документацию MATLAB по events. Вам придется использовать event в обоих определениях слайдера, либо используйте разные обратные вызовы для каждого слайдера, либо, если вы используете один и тот же обратный вызов, вам нужно найти способ определить, какой слайдер вызвал обратный вызов.

0 голосов
/ 30 августа 2018

Ваша проблема в том, что функция sliderMoving не знает имя переменной в вызывающей рабочей области. Другими словами,

function out = func(in)
  % do something with in
end

не будет вести себя иначе, если мы назовем его как func(in1) или func(in2).

В вашем случае событие всегда будет известно внутри обратного вызова как event.

Если вам нужно другое поведение в зависимости от того, какой ползунок был использован, вы должны решить, основываясь на первых двух входах для обратного вызова ( обычно : src и eventData), или через какой-либо дополнительный вход параметр (как вы уже делаете). Если вам нужно получить доступ к значению другого слайдера, вы можете сделать это, используя event.Source.Parent.otherSld.

Следует также отметить, что оператор first_val = 1;, который находится внутри обратного вызова, не влияет на значение вне обратного вызова. Вы должны прочитать о вложенных функциях .

Я думаю, это то, что вы хотели сделать:

function sliderchanging
...
fig = uifigure;
...

  function sliderMoving(...)

  end
end
...