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.

Функция 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 (пробовали обе версии)

Ответы (0 шт):