Effacer les filtres
Effacer les filtres

How to store ROS callback data in class properties?

3 vues (au cours des 30 derniers jours)
Alexandre Teixeira
Alexandre Teixeira le 3 Août 2015
Commenté : AYKUT SIRMA le 26 Août 2022
Hello folks,
I am trying to store a callback data from ROS's topic called /scan in a properties (laser) of class that I created.
I got an error like this:
"No public field laser exists for class robotics.ros.Subscriber.
Error in MobileRobot/Callback_Laser (line 14) obj.laser = [message.Ranges];
Error in @(varargin)robot.Callback_Laser(varargin{:})
Error in robotics.ros.internal.onNewMessageCallback (line 44) feval(callbackFcn, source, message, userData{:});
Warning: Error occurred while evaluating listener callback."
Where is my mistake e how can I store a the callback data in a properties class?
Next the code class.
classdef MobileRobot < handle
properties(Access = public)
odom=[];
laser = [];
end
methods(Access = public)
function obj = MobileRobot() % Constructor
end
function Callback_Laser(~, obj, message)
% global laser
% laser = [message.Ranges];
obj.laser = [message.Ranges];
end
end
end
and the main code
clear all;close all;clc;
rosinit
global rosMasterIp;
rosMasterIp = 'http://192.168.0.113:11311';
global localhostIp;
localhostIp = '192.168.0.113';
global robot;
robot = MobileRobot();
set_pose = robotics.ros.Node('getLaser',rosMasterIp,'NodeHost' , localhostIp);
subs = rossubscriber('/scan',@robot.Callback_Laser);
Thank you!

Réponse acceptée

Sebastian Castro
Sebastian Castro le 3 Août 2015
The issue here seems to be that the callback tied to rossubscriber is required to have 2 inputs "src" and "msg", where "src" is the subscriber itself and "msg" is the message received.
Notice that the way you have defined your Callback_laser method, "obj" isn't the instance of the class, but rather a reference to the subscriber... which, as the error message suggests, does not have a "laser" property.
Does it work if you change your method to be the following?
function Callback_Laser(obj, src, message)
obj.laser = [message.Ranges];
end
- Sebastian
  2 commentaires
Alexandre Teixeira
Alexandre Teixeira le 4 Août 2015
It worked perfectly. I didn't see rossubscriber definition. Thank you.
AYKUT SIRMA
AYKUT SIRMA le 26 Août 2022
To receive only the Axes and Buttons data readings from 'sensor_msgs/Joy' message, what do I need to do? I try to write a callback function to get these 'sensor_msgs/Joy' to access Axes and Buttons information and put them into an array to use. I will be very glad if you would guide me, thank you very much.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Services and Actions dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by