如何并行接收ROS主题工人?

4视图(30天)
你好,
我尝试运行ROS-Nodes和回调订阅主题在一个平行的工人。不幸的是我的回调是从来没有启动。
没有并行计算同一线路在Matlab运行良好。
第二次我试着跟随Matlab活动通过添加调试的代码行。有人知道如何调试并行工人和回调在一个更好的方法吗?
函数应用= myInit(应用)% 1日我们init并行计算和活性氧
%并行计算工具箱
gcp (p =“nocreate”);%如果没有游泳池,不创建新的。
如果isempty (p)
disp (“开始并行计算工具箱”)
app.pool。obj = parpool;
其他的
disp (并行计算工具箱已经运行的)
app.pool。obj = gcp (“nocreate”);
结束
app.pool。n = 0;%计算并行任务的数量
%检查ROS是否已经运行,如果没有,则启动活性氧
(地位、cmdout) =系统(“p ef | grep ros的);
如果状态= = 0
如果包含(cmdout' / opt / ros /旋律/ bin / roscore ')
disp (ROS已经运行的)
其他的
disp (“开始ROS…”)
(地位、cmdout) =系统(“roscore &”);
暂停(2);
结束
其他的
警告(cmdout);
错误([检查ROS”p ef | grep ROS”状态:“num2str(地位)]);
结束
%初始化通过创建活性氧ROS大师在MATLAB和启动全球节点连接到主人。
app.iP。localIpAddr =“192.168.213.1”;
rosinit (app.iP.localIpAddr的节点名,' / MatlabInit ')
app.iP。rosNode = ros.Node (' / Matlab ');
disp (' ')
app.iP。rtl = rostopic (“列表”);
app.iP。d = rosdevice (app.iP.localIpAddr“用户”,“pw”);
app.pool。q = parallel.pool.DataQueue ();
如果isfield (app.pool“未来”)= = 0
app.pool。未来= afterEach (app.pool。问,@disp);
结束
结束
函数startTopic(应用)%,我们开始和停止ROS的话题
如果app.Button.Value
startMyRosTopics ();
暂停(5)
topicType = rostopic (“类型”,“myTopicType”);%,这是好的
topicEcho = rostopic (“回声”,' / myTopic ');%这也不错
app.pool。n= app.pool.n +1;
disp (“叫parMonitor1”)
app.pool.F (app.pool.n) = parfeval (app.pool.q @parMonitor1, 1日,“开始”);
disp (“parMonitor1叫”)
app.lP。parPoolFcnIdx1 = app.pool.n;
其他的
app.pool。app.lP.parPoolFcnIdx1 F (1) .Error.message
disp (的错误堆栈:)
如果(大小(app.pool求和。app.lP.parPoolFcnIdx1 F (1) . error)) = = 0
disp (“没有错误@ parMonitor1”)
其他的
2 = 1:尺寸(app.pool。app.lP.parPoolFcnIdx1 F (1) .Error.stack, 1)
disp ([的文件:app.pool。app.lP.parPoolFcnIdx1 F (1) .Error.stack .file (ii)
“Fcn名字:”app.pool。app.lP.parPoolFcnIdx1 F (1) .Error.stack (ii) . name
的行号:num2str (app.pool。app.lP.parPoolFcnIdx1 F (1) .Error.stack (ii) .line)))
结束
结束
app.pool。app.lP.parPoolFcnIdx1 F (1) .Diary
disp (' ')
disp (“抓取parFcn输出…”)
app.lP。= fetchOutputs (app.pool.F (app.lP.parPoolFcnIdx1));
disp (app.lP.out);
% app.lP。= rmfield (app.lP.out, PCSub1);
% app.lP。= rmfield (app.lP.out, MonNode);
app.pool.F (app.lP.parPoolFcnIdx1) = parfeval (app.pool.q @parMonitor1, 1日,“停止”);
app.lP。= fetchOutputs (app.pool.F (app.lP.parPoolFcnIdx1));
disp (app.lP.out);
结束
结束
函数= parMonitor1 (q,任务)
%这个函数已经运行在并行工作。
%订阅ROS-Topic和注册回调
持续的n
持续的nodeAndSub
如果isempty (n)
n = 0;
结束
n = n + 1;
发送(q, sprintf (“parMonitor1启动% d。次了。任务:% s的n、任务));
开关任务
情况下“开始”
试一试
rosinit (“192.168.213.1”)
e
disp (e)
结束
如果包含(e.message全球ROS节点已经初始化和连接到主)
发送(q, sprintf (“ROS已经市政府@ parMonitor1”))
其他的
发送(q, sprintf (“开始ROS”))
暂停(10)
结束
发送(q, sprintf (“parMonitor1 rosinit做的));
nodeAndSub。MonNode = ros.Node (“MonNode”,“http://192.168.213.1:11311”);
发送(q, sprintf (ros。节点created'))
disp (nodeAndSub.MonNode)
暂停(5);
试一试
发送(q, sprintf (“订阅/ myTopic parMonitor1 ()”));
nodeAndSub。PCSub1 = ros.Subscriber (nodeAndSub.MonNode,' / myTopic ',@Callback1);
发送(q, sprintf (' / myTopic订阅的));
e
发送(q, sprintf (在ros的错误。订户在parMonitor1 ()”));
发送(q, sprintf (标识符是:\ n % s的e.identifier));
发送(q, sprintf (“有一个错误!消息是:\ n % s的e.message));
结束
发送(q, sprintf (ros。用户名为“))
情况下“停止”
nodeAndSub。PCSub1 = [];
nodeAndSub。MonNode = [];
否则
发送(q, sprintf (错误:parMonitor1不知道该怎么做的))
结束
=任务;
发送(q, sprintf (“parMonitor1做”))
结束
函数Callback1(~,消息)
%这个回调应该定期执行在一个平行的工人。
持续的神经网络
这里=“海尔”;
保存(“CallbackWasHere.mat”,“在这里”)
如果isempty (nn)
nn = 0;
结束
nn = nn + 1;
debug = [“Callback1运行n:”mnum2str (nn)“次”];
文件名= [“Callback1_”num2str (nn)“.mat”];
保存(文件名,“调试”,“消息”)
结束
我认为,Callback1函数应该运行。
然而,文件” CallbackWasHere。垫”和“Callback1_ *。垫”从来没有创建。
有人知道为什么吗?
为什么Callback1从来没有执行?
这是我的工作输出:
平行计算工具箱已经运行
ROS已经运行
ROS_IP环境变量的值192.168.213.1,用于设置广告地址ROS节点。
初始化全球节点/ MatlabInit NodeURI http://192.168.213.1:40537
ROS_MASTER_URI环境变量的值http://localhost: 11311年用于连接到ROS的主人。
ROS_IP环境变量的值192.168.213.1,用于设置广告地址ROS节点。
调用parMonitor1
parMonitor1被称为
parMonitor1推出了3。次了。任务:开始
ROS已经市政府@ parMonitor1吗
parMonitor1rosinit做
ROS_IP环境变量的值192.168.213.1,用于设置广告地址ROS节点。
ros。节点创建
订阅/ myTopic在parMonitor1 ()
/ myTopic订阅
ros。用户名为
parMonitor1完成
错误栈:
没有错误@ parMonitor1
ans =
“ROSException属性:
标识符:“ros: mlros:节点:GlobalNodeRunningError”
信息:全球ROS节点已经初始化和连接到主在URI“http://192.168.213.1:11311”。如果你想重新启动全球节点,称为“rosshutdown”放在第一位。”
原因:{}
堆栈(2 x1结构):
更正:[]
ROS_IP环境变量的值192.168.213.1,用于设置广告地址ROS节点。
节点属性:
名称:' / MonNode '
MasterURI:“http://192.168.213.1:11311”
NodeURI:“http://192.168.213.1:33741”
CurrentTime (1 x1时间):
抓取parFcn输出
开始
parMonitor1推出了4。次了。任务:停止
parMonitor1完成
停止
有人能帮助吗?
如何调试并行工人和回调函数里面?
如何检查是否必须调用并执行吗?
有没有注册在Matlab正确检查回调是否订阅?
检查“rostopic bw / myTopic”linux shell中,我们可以看到主题存在的更新率1 Hz。
谢谢你!
6个评论
Jagadeesh这位Konakalla
Jagadeesh这位Konakalla 2021年6月15日
你好安德烈亚斯,
很高兴知道你的问题解决了。但是你提到一切正常没有平行的工具箱。
谢谢,
Jagadeesh这位K。

登录置评。

答案(0)

类别

找到更多的在网络连接和探索帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!