Pypot - не создается объект в сцене V-REP
Проблема
Имеется код:
from pypot.vrep import *
close_all_connections()
print('Closed')
floor = VrepIO(scene='simple_scene.ttt')
print('Opened')
floor.start_simulation()
print('Started')
print('position - ', floor.get_object_position('Sphere'))
floor.set_object_position('Sphere', [0, 0.5, 0.3])
floor.add_cube('myCube', [0,0,0.3], [0.1,0.1,0.1], 10)
floor.change_object_name("myCube", "myCube1")
print('Name changed')
floor.stop_simulation()
print('Stopped')
Что ожидается
В сцене simple_scene уже имеется несколько объектов, включая Sphere.
Код должен по порядку:
- Вывести позицию сферы
- Переместить сферу
- Создать куб
- Переименовать куб
Что в итоге
На строке floor.change_object_name происходит ошибка - RemoteError: невозможно найти куб 'myCube'.
Просмотрев вывод программы и запустившуюся симуляцию в V-REP, видно что позиция сферы вывелась корректно, затем в сцене сфера переместилась. А функция floor.add_cube ничего не сделала. Никаких ошибок по этому поводу нигде нигде не отобразилось.
Локализация
Поразобравшись в коде модуля pypot.vrep.io, мы увидели что большинство команд (как set_object_position в коде выше) выполняется с помощью метода call_remote_api(func_name: str, arg1, arg2, ...). Но некоторые (add_cube -> _create_pure_shape) команды выполняются не напрямую через call_remote_api, а через внутреннюю функцию _inject_lua_code.
Мы выяснили, почему это так. Дело в том, что внутри call_remote_api есть объект api_binding, у которого есть методы с названиями, которые передаются первым аргументом в call_remote_api. Но некоторых функций там нет. Мы попытались напрямую вызвать call_remote_api('simCreatePureShape', args) - выкинулась ошибка об отсутствующем методе. Стало ясно, что для подобных функций тут предусмотрен обход через _inject_lua_code, который должен отправлять команду на выполнение кода lua в консоли V-REP. Для создания куба это будет simCreatePureShape(0, ...). Мы попробовали выполнить эту функцию прямо в консоли V-REP - выполнено успешно, куб создан.
Исходя из этих фактов, стало ясно что проблема именно в нерабочем _inject_lua_code. Мы проверили другие команды, которые также выполняются через этот метод - все не работают, втихую ничего не делают.
Что мы пробовали
Мы переопределили метод _inject_lua_code и предположили, что кодировка строки с lua кодом (lua_code) срабатывает не так, как надо именно в нашей ОС. На скрин мы видим, что там сначала берется массив байтов lua_code.encode(), затем преобразовывается в немного другой формат байтов (не совсем понял, как именно, и зачем). Мы попробовали следующие манипуляции:
- Отправка строки
lua_code"как есть", в виде строки. - Отправка в виде массива байтов
lua_code.encode()без последующих преобразований .encode('UTF-8'),'UTF-16','ASCII'
Какую помощь ожидаем
Если у вас после прочтения появились какие-нибудь мысли, что мы еще можем попробовать, пожалуйста поделитесь ими.
Для теста у себя - установите CoppeliaSim, pypot
Также, мы пробовали поискать логи V-REP, в надежде увидеть там ошибки API - логи не нашли. Если вы знаете, где могут находиться логи - скажите.
Спецификации
- ОС: Ubuntu 20.04.3 LTS
- V-REP: CoppeliaSim Edu 4.3.0, Edu 4.2.0 (пробовали обе версии)
