ROS2 Foxy TypeError when using custom service

asked 2022-04-05 13:50:50 -0500

tzcast gravatar image

Here is the traceback:

root@navigator-desktop:/workspaces/NavigatorV2_ws# ros2 run navigator service
Traceback (most recent call last):
  File "/workspaces/NavigatorV2_ws/install/navigator/lib/navigator/service", line 11, in <module>
    load_entry_point('navigator==0.0.0', 'console_scripts', 'service')()
  File "/workspaces/NavigatorV2_ws/install/navigator/lib/python3.8/site-packages/navigator/dronekit_server.py", line 22, in main
    rclpy.spin(dronekit_service)
  File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/__init__.py", line 191, in spin
    executor.spin_once()
  File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/executors.py", line 714, in spin_once
    raise handler.exception()
  File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/task.py", line 239, in __call__
    self._handler.send(None)
  File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/executors.py", line 429, in handler
    await call_coroutine(entity, arg)
  File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/executors.py", line 384, in _execute_service
    srv.send_response(response, header)
  File "/opt/ros/foxy/lib/python3.8/site-packages/rclpy/service.py", line 72, in send_response
    raise TypeError()
TypeError

' Here is my .srv file, named VehicleLocation.srv

int8 a
---
float64 lon
float64 lat
float32 spd
float32 alt

' Here is my service node: '

from dronekit import connect
from navigator_interfaces.srv import VehicleLocation
import rclpy
from rclpy.node import Node


class DronekitService(Node):

        def __init__(self, vehicle):
                super().__init__('dronekit_service')
                self.srv = self.create_service(VehicleLocation, 'vehicle_location', self.vehicle_location_callback)
                self.vehicle = vehicle
        def vehicle_location_callback(self,request, response):
                #print(type(self.vehicle.location.global_frame.lon))
                #print(self.vehicle.location.global_frame.lon)
                response.lon = float(0)#float(self.vehicle.location.global_frame.lon)
                response.lat = float(0)#float(self.vehicle.location.global_frame.lat)
                response.spd = float(0)#float(self.vehicle.location.global_frame.alt)
                response.alt = float(0)#float(self.vehicle.groundspeed)
                self.get_logger().info('Outgoing Data\nlat: %f lon: %f' %(response.lat,response.lon))
                return response

def main(args=None):
        vehicle = connect('/dev/ttyUSB0', wait_ready=True, baud=56700)
        print(type(vehicle.location.global_frame.lon))
        print(vehicle.location.global_frame.lon)
        rclpy.init(args=args)
        dronekit_service = DronekitService(vehicle)
        try:
                rclpy.spin(dronekit_service)
        except Exception as e:
                dronekit_service.get_logger().info('Service Return Failed %r' %(e,))
        rclpy.shutdown()

if __name__ == '__main__':
        main()

-- I changed the values of the response to make sure that the issue was not dronekit returning an unexpected type of information, but I still get the same error. Any help is greatly appreciated.

edit retag flag offensive close merge delete