cbor can't serialize <class 'method'>

Report crashes, strange behaviour, or apparent bugs
Post Reply
zorro
Posts: 27
Joined: 06 Nov 2023, 09:31

cbor can't serialize <class 'method'>

Post by zorro »

Hello! I'm using ZMQ remote API in a Python client, trying to wrap my code in a Class, it seems that the callback function can't be serialied by cbor when it's a method of a Class.
my code:

Code: Select all

config = self.simIK.findConfig(self.ikEnv, self.ikGroup, self.ikJointHandles, 0.65, 0.1, [1, 1, 1, 0.1], self.configuration_validation_callback)
the callback function:

Code: Select all

    def configuration_validation_callback(self, config):
        print('!!!!!!!!!!!')
        tmp = self.get_config(self.simJointHandles)
        self.set_config(self.simJointHandles, config, 0)
        # res = sim.checkCollision(roboCollection, sim.handle_all)
        res = self.sim.checkCollision(self.roboCollection, self.collisionCollection)
        self.set_config(self.simJointHandles, tmp, 0)
        print(res)
        return res[0] == 0
The code worked fine before I wrapped it in a Class or when I remove self.configuration_validation_callback.

Will this problem be fixed? Or should I try another way to realize it?

The error:

Code: Select all

Traceback (most recent call last):
  File "D:\Users\zzm\anaconda3\envs\robotic_grasp\lib\site-packages\coppeliasim_zmqremoteapi_client\__init__.py", line 70, in _send
    rawReq = cbor.dumps(req)
  File "D:\Users\zzm\anaconda3\envs\robotic_grasp\lib\site-packages\cbor\cbor.py", line 221, in dumps
    return dumps_dict(ob, sort_keys=sort_keys)
  File "D:\Users\zzm\anaconda3\envs\robotic_grasp\lib\site-packages\cbor\cbor.py", line 170, in dumps_dict
    parts.append(dumps(v, sort_keys=sort_keys))
  File "D:\Users\zzm\anaconda3\envs\robotic_grasp\lib\site-packages\cbor\cbor.py", line 218, in dumps
    return dumps_array(ob, sort_keys=sort_keys)
  File "D:\Users\zzm\anaconda3\envs\robotic_grasp\lib\site-packages\cbor\cbor.py", line 154, in dumps_array
    parts = [dumps(x, sort_keys=sort_keys) for x in arr]
  File "D:\Users\zzm\anaconda3\envs\robotic_grasp\lib\site-packages\cbor\cbor.py", line 154, in <listcomp>
    parts = [dumps(x, sort_keys=sort_keys) for x in arr]
  File "D:\Users\zzm\anaconda3\envs\robotic_grasp\lib\site-packages\cbor\cbor.py", line 228, in dumps
    raise Exception("don't know how to cbor serialize object of type %s", type(ob))
Exception: ("don't know how to cbor serialize object of type %s", <class 'method'>)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:\RL\Climb_project\function_module.py", line 206, in <module>
    test_climb.climb2it([targets[0]])
  File "D:\RL\Climb_project\function_module.py", line 150, in climb2it
    config = self.simIK.findConfig(self.ikEnv, self.ikGroup, self.ikJointHandles, 0.65, 0.1, [1, 1, 1, 0.1],
  File "D:\Users\zzm\anaconda3\envs\robotic_grasp\lib\site-packages\coppeliasim_zmqremoteapi_client\__init__.py", line 127, in <lambda>
    setattr(ret, k, lambda *a, func=f'{name}.{k}': self.call(func, a))
  File "D:\Users\zzm\anaconda3\envs\robotic_grasp\lib\site-packages\coppeliasim_zmqremoteapi_client\__init__.py", line 95, in call
    self._send({'func': func, 'args': args})
  File "D:\Users\zzm\anaconda3\envs\robotic_grasp\lib\site-packages\coppeliasim_zmqremoteapi_client\__init__.py", line 72, in _send
    raise Exception("illegal argument " + str(err)) #__EXCEPTION__
Exception: illegal argument ("don't know how to cbor serialize object of type %s", <class 'method'>)

coppelia
Site Admin
Posts: 10375
Joined: 14 Dec 2012, 00:25

Re: cbor can't serialize <class 'method'>

Post by coppelia »

Hello,

you are right, there is something fishy...

Can you do following?

a) replace

Code: Select all

#this:
from coppeliasim_zmqremoteapi_client import RemoteAPIClient 

#with that:
from zmqRemoteApi import RemoteAPIClient
b) replace the few lines around line 69 of file zmqRemoteApi/clients/python/src/coppeliasim_zmqremoteapi_client/__init__.py with following:

Code: Select all

                if callable(arg):
                    funcStr = str(arg)
                    m = re.search(r"<function (.+) at 0x([0-9a-fA-F]+)(.*)", funcStr)
                    if m:
                        funcStr = m.group(1) + '_' + m.group(2)
                    else:
                        m = re.search(r"<(.*)method (.+) of (.+) at 0x([0-9a-fA-F]+)(.*)", funcStr)
                        if m:
                            funcStr = m.group(2) + '_' + m.group(4)
                        else:
                            funcStr = None
                    if funcStr:
                        self.callbackFuncs[funcStr] = arg
                        req['args'][i] = funcStr + "@func"
This should be fixed in CoppeliaSim V4.6 rev10, out next week.

Cheers

Post Reply