Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

toio.py motor_3() example fails with more than 3 targets #7

Open
RobotJuices opened this issue Nov 4, 2024 · 1 comment
Open

toio.py motor_3() example fails with more than 3 targets #7

RobotJuices opened this issue Nov 4, 2024 · 1 comment

Comments

@RobotJuices
Copy link

Hello,

While using the TOIO python bindings, tutorial, and examples in Toio for Python, I encountered a possible bug.

I am running on Window 10 Home. Python 3.11.5 via command prompt access and IDLE and Pyton 3.12.7 within VSCode. Note: The crash/bug is the same via straight Python environment or within VSCode.

At the bottom I also list the package dependencies.

The Problem
When using the example for cube.api.motor.motor_control_multiple_targets with 3 or more targets defined, it crashes and a Traceback occurs (see below) and the Cube does not move.

cube.api.motor.motor_control_multiple_targets is supposed to be able to handle up to 29 targets according to

To recreate the error, see motor_3() at https://pypi.org/project/toio.py/ and add a 3rd target to the targets list.

Same code located at the github. See https://github.com/toio/toio.py/blob/main/examples/motor_control.py

Code Snipet with an added 3rd target

        targets = [
            TargetPosition(
                cube_location=CubeLocation(point=Point(x=250, y=250), angle=0),
                rotation_option=RotationOption.AbsoluteOptimal,
            ),
            TargetPosition(
                cube_location=CubeLocation(point=Point(x=120, y=170), angle=0),
                rotation_option=RotationOption.AbsoluteOptimal,
            ),
            TargetPosition(
                cube_location=CubeLocation(point=Point(x=170, y=100), angle=0),
                rotation_option=RotationOption.AbsoluteOptimal,
            ),

Run and Traceback
C:\Users\IdeaLINQ\Documents\Development\TOIO>python "test_motor3.py"
Traceback (most recent call last):
File "C:\Users\IdeaLINQ\Documents\Development\TOIO\test_motor3.py", line 30, in
asyncio.run(motor_3())
File "C:\Users\IdeaLINQ\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 190, in run
return runner.run(main)
^^^^^^^^^^^^^^^^
File "C:\Users\IdeaLINQ\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 118, in run
return self._loop.run_until_complete(task)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\IdeaLINQ\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 653, in run_until_complete
return future.result()
^^^^^^^^^^^^^^^
File "C:\Users\IdeaLINQ\Documents\Development\TOIO\test_motor3.py", line 18, in motor_3
await cube.api.motor.motor_control_multiple_targets(
File "C:\Users\IdeaLINQ\AppData\Local\Programs\Python\Python311\Lib\site-packages\toio\cube\api\motor.py", line 591, in motor_control_multiple_targets
await self._write_without_response(bytes(motor_target))
File "C:\Users\IdeaLINQ\AppData\Local\Programs\Python\Python311\Lib\site-packages\toio\cube\api\base_class.py", line 108, in write_without_response
return await self.interface.write(self.uuid, data, response=False)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\IdeaLINQ\AppData\Local\Programs\Python\Python311\Lib\site-packages\toio\device_interface\ble.py", line 106, in write
await self.device.write_gatt_char(char_uuid, data, response)
File "C:\Users\IdeaLINQ\AppData\Local\Programs\Python\Python311\Lib\site-packages\bleak_init
.py", line 786, in write_gatt_char
await self._backend.write_gatt_char(characteristic, data, response)
File "C:\Users\IdeaLINQ\AppData\Local\Programs\Python\Python311\Lib\site-packages\bleak\backends\winrt\client.py", line 906, in write_gatt_char
await characteristic.obj.write_value_with_result_async(buf, response),
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
OSError: [WinError -2147024809] The parameter is incorrect

For convenience, here is the full program that works with 2 targets but not 3 or more. Example code below has 3 targets and test_motor1 and test_motor2 have been removed (they work).

# -*- coding: utf-8 -*-
# ************************************************************
#
#     motor_control.py
#
#     Copyright 2022 Sony Interactive Entertainment Inc.
#
# ************************************************************

import asyncio

from toio import *


def notification_handler(payload: bytearray, info: NotificationHandlerInfo):
    motor_info = Motor.is_my_data(payload)
    print(info.get_notified_cube().name, type(motor_info), str(motor_info))

async def test_motor_3():
    """
    example ToioCoreCube.api.motor.motor_control_multiple_targets()
    """
    async with ToioCoreCube() as cube:
        await cube.api.motor.register_notification_handler(notification_handler)
        targets = [
            TargetPosition(
                cube_location=CubeLocation(point=Point(x=250, y=250), angle=0),
                rotation_option=RotationOption.AbsoluteOptimal,
            ),
            TargetPosition(
                cube_location=CubeLocation(point=Point(x=120, y=170), angle=0),
                rotation_option=RotationOption.AbsoluteOptimal,
            ),
            TargetPosition(
                cube_location=CubeLocation(point=Point(x=170, y=100), angle=0),
                rotation_option=RotationOption.AbsoluteOptimal,
            ),  
        ]
        await cube.api.motor.motor_control_multiple_targets(
            timeout=5,
            movement_type=MovementType.Linear,
            speed=Speed(
                max=100, speed_change_type=SpeedChangeType.AccelerationAndDeceleration
            ),
            mode=WriteMode.Overwrite,
            target_list=targets,
        )
        await asyncio.sleep(5)


async def main():
    print("3: motor_control_multiple_targets()")
    await test_motor_3()

Package Dependencies

Requirement already satisfied: setuptools in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (75.3.0)
Requirement already satisfied: typing-extensions in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (4.12.2)
Requirement already satisfied: bleak in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (0.22.3)
Requirement already satisfied: bleak-winrt<2.0.0,>=1.2.0 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from bleak) (1.2.0)
Requirement already satisfied: typing-extensions>=4.7.0 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from bleak) (4.12.2)
Requirement already satisfied: toio-py in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (1.1.0)
Requirement already satisfied: bleak>=0.22.1 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from toio-py) (0.22.3)
Collecting setuptools<70.0.0,>=69.5.1 (from toio-py)
Using cached setuptools-69.5.1-py3-none-any.whl.metadata (6.2 kB)
Requirement already satisfied: typing-extensions<5.0.0,>=4.10.0 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from toio-py) (4.12.2)
Requirement already satisfied: bleak-winrt<2.0.0,>=1.2.0 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from bleak>=0.22.1->toio-py) (1.2.0)
Using cached setuptools-69.5.1-py3-none-any.whl (894 kB)
Installing collected packages: setuptools
Attempting uninstall: setuptools
Found existing installation: setuptools 75.3.0
Uninstalling setuptools-75.3.0:
Successfully uninstalled setuptools-75.3.0
Successfully installed setuptools-69.5.1
Requirement already satisfied: ipykernel in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (6.29.5)
Requirement already satisfied: comm>=0.1.1 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipykernel) (0.2.2)
Requirement already satisfied: debugpy>=1.6.5 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipykernel) (1.8.7)
Requirement already satisfied: ipython>=7.23.1 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipykernel) (8.29.0)
Requirement already satisfied: jupyter-client>=6.1.12 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipykernel) (8.6.3)
Requirement already satisfied: jupyter-core!=5.0.,>=4.12 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipykernel) (5.7.2)
Requirement already satisfied: matplotlib-inline>=0.1 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipykernel) (0.1.7)
Requirement already satisfied: nest-asyncio in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipykernel) (1.6.0)
Requirement already satisfied: packaging in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipykernel) (24.1)
Requirement already satisfied: psutil in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipykernel) (6.1.0)
Requirement already satisfied: pyzmq>=24 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipykernel) (26.2.0)
Requirement already satisfied: tornado>=6.1 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipykernel) (6.4.1)
Requirement already satisfied: traitlets>=5.4.0 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipykernel) (5.14.3)
Requirement already satisfied: decorator in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipython>=7.23.1->ipykernel) (5.1.1)
Requirement already satisfied: jedi>=0.16 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipython>=7.23.1->ipykernel) (0.19.1)
Requirement already satisfied: prompt-toolkit<3.1.0,>=3.0.41 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipython>=7.23.1->ipykernel) (3.0.48)
Requirement already satisfied: pygments>=2.4.0 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipython>=7.23.1->ipykernel) (2.18.0)
Requirement already satisfied: stack-data in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipython>=7.23.1->ipykernel) (0.6.3)
Requirement already satisfied: typing-extensions>=4.6 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipython>=7.23.1->ipykernel) (4.12.2)
Requirement already satisfied: colorama in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from ipython>=7.23.1->ipykernel) (0.4.6)
Requirement already satisfied: python-dateutil>=2.8.2 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from jupyter-client>=6.1.12->ipykernel) (2.9.0.post0)
Requirement already satisfied: platformdirs>=2.5 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from jupyter-core!=5.0.
,>=4.12->ipykernel) (4.3.6)
Requirement already satisfied: pywin32>=300 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from jupyter-core!=5.0.*,>=4.12->ipykernel) (308)
Requirement already satisfied: parso<0.9.0,>=0.8.3 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from jedi>=0.16->ipython>=7.23.1->ipykernel) (0.8.4)
Requirement already satisfied: wcwidth in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from prompt-toolkit<3.1.0,>=3.0.41->ipython>=7.23.1->ipykernel) (0.2.13)
Requirement already satisfied: six>=1.5 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from python-dateutil>=2.8.2->jupyter-client>=6.1.12->ipykernel) (1.16.0)
Requirement already satisfied: executing>=1.2.0 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from stack-data->ipython>=7.23.1->ipykernel) (2.1.0)
Requirement already satisfied: asttokens>=2.1.0 in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from stack-data->ipython>=7.23.1->ipykernel) (2.4.1)
Requirement already satisfied: pure-eval in c:\users\idealinq\appdata\local\programs\python\python311\lib\site-packages (from stack-data->ipython>=7.23.1->ipykernel) (0.2.3)

@kaz399
Copy link

kaz399 commented Nov 24, 2024

Hello.

I think it is due to the MTU size limitation of BLE.
On Windows, the MTU size is 23Byte, of which 20Byte is available for GATT.

If the number of targets specified in cube.api.motor.motor_control_multiple_targets is 3, I think it will fail because the data size exceeds 20Byte.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants