从 ValueChangingFcn 中访问其他滑块的值
Accessing the value of other sliders from within a ValueChangingFcn
我在一个图形中有多个滑块,我想在其中一个更改时发布它们的值(使用机器人工具箱)。我无法访问多个滑块的值 - 尝试访问滑块值时在 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
回调中访问所有可用滑块的值?
您的问题是因为 sliderMoving
函数不知道调用工作区中的变量名称。也就是说,
function out = func(in)
% do something with in
end
如果我们像 func(in1)
或 func(in2)
.
那样调用它,其行为不会有所不同
在您的情况下,事件将始终在内部回调中被称为event
。
如果您想要根据使用的滑块的不同行为,您应该根据回调的前两个输入来决定(commonly:src
和 eventData
),或者通过一些额外的输入参数(就像你已经做的那样)。如果需要访问另一个滑块的值,可以使用 event.Source.Parent.otherSld
.
您还应注意,在回调内部找到的语句 first_val = 1;
对回调外部的值没有影响。你应该阅读 nested functions.
我想这就是你的意思:
function sliderchanging
...
fig = uifigure;
...
function sliderMoving(...)
end
end
正如错误消息所说,event1 不是变量或class。您不能复制滑块代码并在每个条目后放一个 1。
我建议您查看 events
上的 MATLAB 文档。您将不得不使用 event
在两个滑块定义中,或者为每个滑块使用不同的回调,或者如果您使用相同的回调,那么您将需要找到某种方式来识别哪个滑块触发了回调。
我在一个图形中有多个滑块,我想在其中一个更改时发布它们的值(使用机器人工具箱)。我无法访问多个滑块的值 - 尝试访问滑块值时在 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
回调中访问所有可用滑块的值?
您的问题是因为 sliderMoving
函数不知道调用工作区中的变量名称。也就是说,
function out = func(in)
% do something with in
end
如果我们像 func(in1)
或 func(in2)
.
在您的情况下,事件将始终在内部回调中被称为event
。
如果您想要根据使用的滑块的不同行为,您应该根据回调的前两个输入来决定(commonly:src
和 eventData
),或者通过一些额外的输入参数(就像你已经做的那样)。如果需要访问另一个滑块的值,可以使用 event.Source.Parent.otherSld
.
您还应注意,在回调内部找到的语句 first_val = 1;
对回调外部的值没有影响。你应该阅读 nested functions.
我想这就是你的意思:
function sliderchanging
...
fig = uifigure;
...
function sliderMoving(...)
end
end
正如错误消息所说,event1 不是变量或class。您不能复制滑块代码并在每个条目后放一个 1。
我建议您查看 events
上的 MATLAB 文档。您将不得不使用 event
在两个滑块定义中,或者为每个滑块使用不同的回调,或者如果您使用相同的回调,那么您将需要找到某种方式来识别哪个滑块触发了回调。