Emad Deve
Emad Deve

Reputation: 85

why i got "rospy.ServiceException"?

i am working with ros about 3 month! I work on a robot controller. i got error in ui about this client:

import sys
import rospy
from database_helper.srv import get_moves, get_movesRequest, get_movesResponse, get_move

def get_data(name: str):
    """This function can extract model names from DB"""

    try:
        rospy.init_node("get_moves_client")
    except:
        pass

    rospy.wait_for_service('get_moves')


    try:
        moves = rospy.ServiceProxy('get_moves', get_moves)
    except rospy.ServiceException as e:
        print(31)
        print(e)
        return


    id = 0
    try:
        for i in (moves(True).moves):
            if i.name == name:
                id = i.id
                #print(id)
                break
    except:
        print(43)
        return
    rospy.wait_for_service('get_move')
    move = rospy.ServiceProxy('get_move', get_move)
    wps = move(id).waypoints
    list_of_data = []

    try:
        for i in range(len(wps)):
            print(i)
            data = {}
            data['x_traj'] = wps[i].x
            data['y_traj'] = wps[i].y
            data['z_traj'] = wps[i].z
            data['time_tarj'] = wps[i].displacement_time_to_next_waypoint
            data['order_traj'] = wps[i].order
            data['pitch_traj'] = wps[i].pitch
            data['roll_traj'] = wps[i].roll
            data['yaw_traj'] = wps[i].yaw
            data['focus_camer'] = wps[i].camera_focus
            data['iris_camera'] = wps[i].camera_iris
            data['rail_direction'] = wps[i].rail_direction
            data['rail_speed'] = wps[i].rail_speed
            data['zoom_camera'] = wps[i].camera_zoom
            data['rail_time'] = wps[i].rail_time
            data['rail_displacement'] = wps[i].rail_displacement
            list_of_data.append(data)
    except rospy.ServiceException:
        pass

    print(list_of_data)
    return list_of_data

this client can get data from DB and save with dict and save all dict in a list.

i most write "try/except" and i see 43 number! so i know my except is in for i in range(len(wps)):

the amazing point is, i can run this script and i get answer, but if call this script in my ui, after i using save waypoint and i try to load waypoint, i get ServiceException!

my "add_move.py" code:

from typing import List, Dict
import rospy
from database_helper.srv import add_move
from database_helper.msg import move, waypoint


def _add_move(name: str, wp: List[Dict]):
    """This Function can for send insert query for DB"""

    rospy.init_node('add_move_client', anonymous=True)

    rospy.wait_for_service('add_move')

    _move = move()
    _move.name = name


    for i in range(len(wp)):
        _waypoint = waypoint()
        _waypoint.x = wp[i]['x_traj']
        _waypoint.y = wp[i]['y_traj']
        _waypoint.z = wp[i]['z_traj']
        _waypoint.displacement_time_to_next_waypoint = wp[i]['time_tarj']
        _waypoint.pitch = wp[i]['pich_traj']
        _waypoint.roll = wp[i]['roul_traj']
        _waypoint.yaw = wp[i]['ya_traj']
        _waypoint.camera_focus = wp[i]['focus_camer']
        _waypoint.camera_iris = wp[i]['iris_camera']
        _waypoint.camera_zoom = wp[i]['zoom_camera']
        _waypoint.rail_speed = wp[i]['speed_rail']
        _waypoint.rail_displacement = wp[i]['disp_or_time_rail']
        _waypoint.rail_direction = wp[i]['direction_rail']
        _move.waypoints.append(_waypoint)

    add = rospy.ServiceProxy('add_move', add_move)
    return add(_move).id

if __name__ == "__main__":

    from random import randint
    data = {'x_traj': 12, 'y_traj': 12, 'z_traj': 33, 'time_tarj': 11,
            'pich_traj': 13, 'roul_traj': 43, 'ya_traj': 21,
            'focus_camer': 11, 'iris_camera': 55, 'zoom_camera': 32,
            'disp_or_time_rail': 21, 'speed_rail': 109, 'direction_rail':44,
            'joint1_slider': 12, 'joint2_slider': 666, 'joint3_slider': 567,
            'joint4_slider': 32, 'joint5_slider': 79, 'joint6_spin': 100
            }

    wp = []
    wp.append(data)

    print(_add_move("t1", wp))

my error in terminal without "try/except" is:

Traceback (most recent call last):
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/msg.py", line 223, in deserialize_messages
    msg_queue.append(data.deserialize(q))
  File "/home/ajax/Documents/iotive/devel/lib/python3/dist-packages/database_helper/srv/_get_moves.py", line 247, in deserialize
    val2 = database_helper.msg.waypoint()
  File "/home/ajax/Documents/iotive/devel/lib/python3/dist-packages/database_helper/msg/_waypoint.py", line 95, in __init__
    self.rail_displacement = 0
AttributeError: 'waypoint' object attribute 'rail_displacement' is read-only

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/impl/tcpros_base.py", line 735, in receive_once
    p.read_messages(b, msg_queue, sock) 
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/impl/tcpros_service.py", line 361, in read_messages
    rospy.msg.deserialize_messages(b, msg_queue, self.recv_data_class, queue_size=self.queue_size, max_msgs=1, start=1) #rospy.msg
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/msg.py", line 245, in deserialize_messages
    raise genpy.DeserializationError("cannot deserialize: %s"%str(e))
genpy.message.DeserializationError: cannot deserialize: 'waypoint' object attribute 'rail_displacement' is read-only

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/impl/tcpros_service.py", line 522, in call
    responses = transport.receive_once()
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/impl/tcpros_base.py", line 751, in receive_once
    raise TransportException("receive_once[%s]: DeserializationError %s"%(self.name, str(e)))
rospy.exceptions.TransportException: receive_once[/get_moves]: DeserializationError cannot deserialize: 'waypoint' object attribute 'rail_displacement' is read-only

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./benchmark_new_version_4_1.py", line 730, in get_data_query
    self.wp_saver = get_data(response)
  File "/home/ajax/Documents/iotive/src/gui/ui/scripts/get_moves_clinet.py", line 36, in get_data
    for i in (moves(True).moves):
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/impl/tcpros_service.py", line 442, in __call__
    return self.call(*args, **kwds)
  File "/opt/ros/noetic/lib/python3/dist-packages/rospy/impl/tcpros_service.py", line 532, in call
    raise ServiceException("transport error completing service call: %s"%(str(e)))
rospy.service.ServiceException: transport error completing service call: receive_once[/get_moves]: DeserializationError cannot deserialize: 'waypoint' object attribute 'rail_displacement' is read-only

what is my wrong?

srv/get_move:

int32 id
---
waypoint[] waypoints

srv/get_moves:

bool add_waypoints
---
move[] moves

msg/move:

int32 id
string name
waypoint[] waypoints

msg/waypoint:

int32 id
int32 order
float64 x
float64 y
float64 z
float64 roll
float64 pitch
float64 yaw
int32 camera_focus
int32 camera_iris
int32 camera_zoom
int32 rail_displacement
int32 rail_time
int32 rail_speed
bool rail_direction
int32 displacement_time_to_next_waypoint

Upvotes: 0

Views: 1601

Answers (1)

Emad Deve
Emad Deve

Reputation: 85

So we need to remove service variables when we do not have anything else.

like this:

    rospy.wait_for_service('get_moves')
    moves = rospy.ServiceProxy('get_moves', get_moves)

    id = 0
    for i in (moves(True).moves):
        if i.name == name:
            id = i.id
            #print(id)
            break
    rospy.wait_for_service('get_move')
    move = rospy.ServiceProxy('get_move', get_move)
    wps = move(id).waypoints
    list_of_data = []

    for i in range(len(wps)):
        print(i)
        data = {}
        data['order_traj'] = wps[i].order
        data['x_traj'] = wps[i].x
        data['y_traj'] = wps[i].y
        data['z_traj'] = wps[i].z
        data['time_tarj'] = wps[i].displacement_time_to_next_waypoint
        data['order_traj'] = wps[i].order
        data['pitch_traj'] = wps[i].pitch
        data['roll_traj'] = wps[i].roll
        data['yaw_traj'] = wps[i].yaw
        data['focus_camer'] = wps[i].camera_focus
        data['iris_camera'] = wps[i].camera_iris
        data['rail_direction'] = wps[i].rail_direction
        data['rail_speed'] = wps[i].rail_speed
        data['zoom_camera'] = wps[i].camera_zoom
        data['rail_time'] = wps[i].rail_time
        data['rail_displacement'] = wps[i].rail_displacement
        list_of_data.append(data)


    del move
    del moves
    print(list_of_data)
    return list_of_data

I discovered this last night!

Upvotes: 0

Related Questions