Hola, les hago una pregunta ya que no puedo resolverla. Estoy en la parte 2 del ROS Basics Real Robot Project que es el de servicios, en el cual yo quiero almacenar las lecturas laser que va teniendo el robot para ponerlo en la función my_callback que entra cuando se llama al servicio. Pero no lo puedo hacer me suscribo al topico /scan pero como la funciones callback no devuelven nada nose como obtener constantemente las lecturas del sensor laser para luego compararlas en la función my_callback. Agradeceria su ayuda. Desde ya muchas gracias!
Hola Francisco,
tu pregunta es muy buena. Tienes razon, las funciones de callback, no pueden devolver ningun valor.
Lo que se hace en estos casos es (dos opciones):
- Solucion rapida y mala: Creas una variable global. Entonces, en el callback, pones los datos del laser en esa variable global que puede utilizar luego otras partes del programa. Hacer esto es mala idea porque cuando el programa crezca un poco vas a tener un monton de errores de interacciones entre diferentes partes del programa que usan esa variable, y no sabras por donde te vienen los errores.
- Creas una clase. La clase se suscribe al topico y tiene su callback como miembro de la clase. Ademas la clase tiene una variable de clase en la que debes almacenar los datos recibidos del laser. Asi, cualquier funcion miembro de la clase tiene acceso a esa variable de la clase. Ademas, otras partes del programa que tengan acceso a la instancia de la clase tambien pueden acceder a esos datos mediante funciones publicas de la clase.
Si esta solucion segunda te suena a chino, puedes ver como lo explicamos en la Unit 8 - Using Classes in Python: Learn Robotics from Zero - Robotics & ROS Online Courses
aah buenisimo!!!. Muchisimas gracias!!
Hola, te hago otra pregunta recien cree la clase pero tampoco me almacena los datos del sensor ahi te paso la clase para que veas lo que hice y donde puede estar el error:
class Scannerwall:
def init(self):
self.publicador = rospy.Publisher(’/cmd_vel’, Twist, queue_size=1)
self.suscriptor = rospy.Subscriber(’/scan’, LaserScan, self.callback)
self.servicio = rospy.Service(’/my_service’, FindWall, self.my_callback)
self.laserFrontal = None
self.rayo270 = None
self.move = Twist()
def publicando(self, x, z):
self.move.linear.x = x
self.move.linear.z = z
self.publicador.publish(self.move)
def callback(self, data):
self.laserFrontal = data.ranges[360]
self.rayo270 = data.ranges[270]
def my_callback(self, request):
if self.laserFrontal > 0.3:
self.publicando(0.2, 0)
else:
while self.rayo270 > 0.3:
self.publicando(0, 0.2)
respusta = FindWallResponse()
respusta.wallfound = True
return respusta
y cuando me suscribo y hago un print para mostrar el valor que tiene laserfrontal y rayo270, me dice None en el cual no me almacena ningun valor.
Agradeceria si me pudieran ayudar ya que nose como solucionarlo. Desde ya muchas gracias!!
This topic was automatically closed after 3 days. New replies are no longer allowed.