Перейти к основному содержимому

RI_SDK_exec_ServoDrive_RotateWithRelativeSpeed

Информация

RISDK - библиотека Robo Intellect Software Development Kit
exec - группа исполнителей
ServoDrive - подгруппа сервоприводов
RotateWithRelativeSpeed - название метода вращения сервопривода в заданном направлении с относительной скоростью

Сигнатура функции:

RI_SDK_exec_ServoDrive_RotateWithRelativeSpeed(descriptor, direction, speed, async, errorText):errorCode

Описание метода

Вращение в заданном направлении с заданной относительной скоростью.

Дает команду сервоприводу с дескриптором descriptor вращаться до тех пор, пока не будет достигнуто крайнее значение угла поворота (либо максимальный угол поворота либо минимальный, в зависимости от направления движения). Направление поворота задается параметром direction, а скорость поворота параметром speed. При этом скорость поворота задается в процентах от максимальной скорости Параметр async устанавливает режим выполнения команды - асинхронный или синхронный.

При синхронном режиме, программа, которая вызвала данную функцию, ожидает завершение выполнения команды. При асинхронном режиме этого ожидания не происходит, и выполнение команды осуществляется параллельно дальнейшей работе программы, вызвавшей данную функцию.

Направления движения:
0 - по часовой стрелке
1 - против часовой стрелки

*Изначально у серопривода положение 0 градусов. Поэтому первое движение он может совершить только на положительный угол.

Параметры и возвращаемые значения

ПараметрТип для Shared objectТип для Golang gRPCОписание
descriptorint (тип C)int64Дескриптор компонента сервопривода
directionint (тип C)int64Направление движения
speedint (тип C)int64Угловая скорость поворота (процент от максимальной скорости)
asyncbool (тип C)boolПризнак асинхронного выполнения команды
errorTextchar[1000] (тип C)stringТекст ошибки (передается как параметр, если происходит ошибка метод записывает в этот параметр текст ошибки)
errorCodeint (тип C)int64Код ошибки

Примеры

Пример №1 - Вращение сервопривода по часовой стрелке с относительной скоростью

В данном примере осуществляется вращение сервопривода по часовой стрелке до достижения крайнего значения угла поворота. Скорость движения устанавливается в 50% от максимальной скорости.

# Вращение сервопривода по часовой стрелке 
# Скорость движения - 50% от максимальной скорости (400 градусов в секунду * 50% = 200 градусов в секунду)
errCode = lib.RI_SDK_exec_ServoDrive_RotateWithRelativeSpeed(servo, 0, 50, False, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

Полный текст примера


from ctypes.util import find_library
import platform
import sys
from ctypes import *

# Подключаем внешнюю библиотеку для работы с SDK
platform = platform.system()
if platform == "Windows":
libName = "librisdk.dll"
if platform == "Linux":
libName = "librisdk.so"

pathLib = find_library(libName)
lib = cdll.LoadLibrary(pathLib)


# Указываем типы аргументов для функций библиотеки RI_SDK
lib.RI_SDK_InitSDK.argtypes = [c_int, c_char_p]
lib.RI_SDK_CreateModelComponent.argtypes = [c_char_p, c_char_p, c_char_p, POINTER(c_int), c_char_p]
lib.RI_SDK_LinkPWMToController.argtypes = [c_int, c_int, c_uint8, c_char_p]
lib.RI_SDK_LinkServodriveToController.argtypes = [c_int, c_int, c_int, c_char_p]
lib.RI_SDK_DestroySDK.argtypes = [c_bool, c_char_p]
lib.RI_SDK_exec_ServoDrive_RotateWithRelativeSpeed.argtypes = [c_int, c_int, c_int, c_bool, c_char_p]

def main():
errTextC = create_string_buffer(1000) # Текст ошибки. C type: char*
i2c = c_int()
pwm = c_int()
servo = c_int()

# Инициализация библиотеки RI SDK с уровнем логирования 3
errCode = lib.RI_SDK_InitSDK(3, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

# Создание компонента i2c адаптера модели ch341
errCode = lib.RI_SDK_CreateModelComponent("connector".encode(), "i2c_adapter".encode(), "ch341".encode(), i2c, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

print("i2c: ", i2c.value)

# Создание компонента ШИМ модели pca9685
errCode = lib.RI_SDK_CreateModelComponent("connector".encode(), "pwm".encode(), "pca9685".encode(), pwm, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

print("pwm: ", pwm.value)

# Создание компонента сервопривода модели mg90s
errCode = lib.RI_SDK_CreateModelComponent("executor".encode(), "servodrive".encode(), "mg90s".encode(), servo, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

print("servo: ", servo.value)

# Связывание i2c с ШИМ
errCode = lib.RI_SDK_LinkPWMToController(pwm, i2c, 0x40, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

# Связывание ШИМ с сервоприводом
errCode = lib.RI_SDK_LinkServodriveToController(servo, pwm, 0, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

# Вращение сервопривода по часовой стрелке
# Скорость движения - 50% от максимальной скорости (400 градусов в секунду * 50% = 200 градусов в секунду)
errCode = lib.RI_SDK_exec_ServoDrive_RotateWithRelativeSpeed(servo, 0, 50, False, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

# Удаление библиотеки со всеми компонентами
errCode = lib.RI_SDK_DestroySDK(True, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

print("Success")

main()