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

RI_SDK_exec_RServoDrive_RotateWithRelativeSpeedOverTime

Информация

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

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

RI_SDK_exec_RServoDrive_RotateWithRelativeSpeedOverTime(descriptor, direction, speed, timeout, async, errorText):errorCode

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

Вращение в заданном направлении с заданной относительной скоростью. Вращение выполняется до тех пор, пока не сработает заданный таймаут или не будет вызвана команда остановки.

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

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

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

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

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

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

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

Примеры

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

В данном примере осуществляется вращение сервопривода по часовой стрелке с 1 процентом от скорости, соответствующее управляющему импульсу в 1410 микросекунд. Выбран асинхронный режим работы. После команды вращения остановим выполнение программы на 3 секунды, а затем выполним команду остановки. Таким образом мы прервем вращение до истечения пяти секундного таймаута.

# Вращение сервопривода по часовой стрелке в асинхронном режиме
errCode = lib.RI_SDK_exec_RServoDrive_RotateWithRelativeSpeedOverTime(rservo, 0, 1, 5000, True, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

# Остановим выполнение программы на 3 секунды чтобы увидеть вращение
time.sleep(3)

# Продолжим выполнение программы и вызовем функцию остановки
errCode = lib.RI_SDK_exec_RServoDrive_Stop(rservo, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)
Полный текст примера

from ctypes.util import find_library
import platform
import sys
import time
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_LinkRServodriveToController.argtypes = [c_int, c_int, c_int, c_char_p]
lib.RI_SDK_DestroySDK.argtypes = [c_bool, c_char_p]
lib.RI_SDK_exec_RServoDrive_RotateWithRelativeSpeedOverTime.argtypes = [c_int, c_int, c_int, c_int, c_bool, c_char_p]
lib.RI_SDK_exec_RServoDrive_Stop.argtypes = [c_int, c_char_p]

def main():
errTextC = create_string_buffer(1000) # Текст ошибки. C type: char*
i2c = c_int()
pwm = c_int()
rservo = 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)

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

print("servodrive rotate: ", rservo.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_LinkRServodriveToController(rservo, pwm, 0, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

# Вращение сервопривода по часовой стрелке в асинхронном режиме
errCode = lib.RI_SDK_exec_RServoDrive_RotateWithRelativeSpeedOverTime(rservo, 0, 1, 5000, True, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

# Остановим выполнение программы на 3 секунды чтобы увидеть вращение
time.sleep(3)

# Продолжим выполнение программы и выполним функцию остановки
errCode = lib.RI_SDK_exec_RServoDrive_Stop(rservo, 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()