- Обзор
- Аккаунты
- Аутентификация
- Типы данных
- Визуализация
- Триггеры
- Калибровка
- Перемещения
- Команды
- Помощь в разработке
- Ссылки
- Последние изменения
Библиотека для управления и администрирования промышленных роботизированных систем с использованием URSystem API. Содержит в себе элементы для построения траекторий с использованием синтаксиса похожего на Kuka Robotics Language
-
Библиотека предоставляет доступ к 3 ролям в системе:
-
User может работать только с роботами и инструментами:
system = Auth(server_token="15244dfbf0c9bd8378127e990c48e5a68b8c5a5786f34704bc528c9d91dbc84a", ip="ursystem.local", port=5000).user("user","12345").system(host="ursystem.local", port=5000) system.ptp(robot, pos)
-
Administrator уже предоставлены права для работы напрямую с системой, но они не являются максимальными:
system = Auth(server_token="15244dfbf0c9bd8378127e990c48e5a68b8c5a5786f34704bc528c9d91dbc84a", ip="ursystem.local", port=5000).admin("Admin","12345").system(host="ursystem.local", port=5000) system.delete_robot(robot_name="First")
-
SuperAdmin имеет все права для работы в системе. Он может удалять как пользователей, так и администраторов, изменять пароли и т.д.:
system = Auth(server_token="15244dfbf0c9bd8378127e990c48e5a68b8c5a5786f34704bc528c9d91dbc84a", ip="ursystem.local", port=5000).SuperAdmin("SuperAdmin","12345").system(host="ursystem.local", port=5000) system.delete_user(name="Jon")
Каждая роль более высокого уровня может использовать команды ролей более низкого уровня. То есть администратор может быть также пользователем, а супер администратор может быть как администратором, так и пользователем соответственно.
-
-
Симуляция авторизации может понадобиться в тех случаях когда отправка комманд на оборудование не обязательна, например просмотр результата функции постоения траекторий перемещения роботов.
-
import auth from utils.config import Config from data_types import StaticData cfg = Config() cfg.verify = False cfg.trajectory_send = False cfg.login_simulation = True cfg.simulation_role = StaticData.Roles.ADMIN cfg.simulation_token = "h21ksau" system = auth.Auth("ursystem.local", 5000, "15244dfbf0c9bd8378127e990c48e5a68b8c5a5786f34704bc528c9d91dbc84a")\ .admin("SuperAdmin", "12345").system("ursystem.local", 5000)
cfg.verify- позволяет включить или отключить проверку сертификата безопасности. Проверка происходит при отправке запроса на сервер, в данном примере он ничего не делает, так как запросы не отправляются.cfg.trajectory_send = False- отключение отправки данных на сервер в модуле__robotcfg.login_simulation = True- параметр для получения роли и токена (когда значениеTrue, при авторизации вместо запроса на сервер вы сразу получаете роль и токен).cfg.simulation_role = StaticData.Roles.ADMIN- позволяет настроить роль получаемую при симуляции авторизации, в примере мы устанавливаем"administrator", по стандартуSuperAdmincfg.simulation_token = ""- позволяет настроить токен получаемый при симуляции авторизации, в примере мы устанавливаем"h21ksau", по стандарту""
-
-
Для отправки запросов необходимо установить SSL-сертификат, выданный вашей компанией, или стандартный сертификат URSystem в
доверенные корневые центры сертификации (Windows).
Сначала вы получаете свою роль и токен с сервера:
import auth
accounts_server = auth.Auth(server_token="15244dfbf0c9bd8378127e990c48e5a68b8c5a5786f34704bc528c9d91dbc84a",
ip="ursystem.local", port=5000)server_token — это набор символов, подтверждающий вашу принадлежность к определённой компании. Если вы использовали правильный токен, сервер обработает ваш запрос и проверит логин и пароль (в момент инициализации класса Auth никаких проверок не происходит, только сохранение данных).
Теперь, мы можем получить токен и роль с помощью следующей команды:
account = accounts_server.user(name="user", password="12345")Теперь, имея учётную запись, мы можем подключиться к системе:
system = account.system(host="ursystem.local", port=5000)А затем, будучи подключённым к системе, можно использовать команды для работы. Вот пример кода:
system.ptp(robot, pos)-
Позиция в декартовой системе координат
from data_types import XYZPos XYZPos().from_list([201,150,100])
-
Позиция робота указанная в углах для каждой оси
from data_types import AnglePos AnglePos().from_list([200,40,0,150]) # 4 Axis
-
Траетория строящаяся по 1 из 2 выбранных алгоритмов
- Сплайн Катмулл-Рома
- Кубический сплайн (
Scypy version)
Стандарстным способом можно использовать только кубический сплайн
from data_types import XYZPos, Spline spl = Spline(robot_data=robot, system=system, num_points=10) p0 = XYZPos().from_list([201,150,100]) p1 = XYZPos().from_list([200,-50,100]) p2 = XYZPos().from_list([-200,310,100]) p3 = XYZPos().from_list([400,50,100]) spl.add_point(p0, p1, p2, p3) spl.start_move()
-
Дата класс использующийся для хранения данных о роботе
from data_types import RobotData robot = RobotData(name="First", code="654123")
-
Дата класс использующийся для стандартизации вывода использования функций
lin1 = system.lin(robot, p1, start=p0) # lin1 is instance ReturnData() class
Визуализация траекторий происходит при помощи библиотеке matplotlib и plotly и работает только с XYZpos точками. Особенность использования matplotlib в том что он останавливает выполение кода пока окно с визуализацией не будет закрыто. Чтобы этого избежать можно использовать библиотеку plotly.
from data_types import XYZPos, Spline
from utils.vizualizer import Vizualization
spl = Spline(robot_data=robot, system=system, num_points=10)
p0 = XYZPos().from_list([201,150,100])
p1 = XYZPos().from_list([200,-50,100])
p2 = XYZPos().from_list([-200,310,100])
p3 = XYZPos().from_list([400,50,100])
spl.add_point(p0, p1, p2, p3)
return_data = spl.start_move()
Vizualization(trajectory=return_data.trjectory).show_mathplotlib_trajectory_plot()
# or
Vizualization(trajectory=return_data.trjectory).show_plotly_trajectory_plot()Триггеры используются для запуска событий во время трохождения роботом многоточечной траектории. Для этого в библиотеке реализован класс TriggerHandler. Также для создания тригера вам нужно передать словарь в функцию перемещения (lin,circ,Spline). Вы можете устанавливать расстояние срабатывания триггера от начала отрезка траектории. Концом траектории будет последняя точка перемещения, если вы использовали сглаживание то все сглаженные перемещения становяться одним и последняя точка такого перемещения являетьсчя концом траектории. Точность расстояния срабатывания триггера зависит от количества точек в траектории, так как триггер привязываеться к большей точке между двумя точками, например от начала траектории до 1 точки 20 мм, а до 2 точки 20.5 мм. То при триггере находяшимся на расстоянии 20.1, он будет исполнен на 2 точке 20.5.
Также TriggerHandler принимает параметр refresh_timer, он определяет время запроса тригера с сервера. Функция вызываемая при срабатывании триггера может сработать несколько раз, потому что триггеры не сбрасываются, толко если вы перезаписываете его другим триггером. Для этого воспользуйтесь функцией set_position_id.
from data_types import XYZPos
from utils.vizualizer import Vizualization
from utils.triggers import TriggerHandler
# Функция вызываемая при обработке триггера
def hello_trigger_handler():
print("Hello")
system.set_position_id(robot, "")
# Создание обработчика триггеров для указанного робота
TH = TriggerHandler(robot_data=robot, system=system)
# Добавление триггера (Примязка функции к ключевому слову)
TH.add_trigger("hello", hello_trigger_handler)
# Создание словаря триггеров которые робот передаст в систему как параметр PositionID (Ключевое слово : Расстояние от начала отрезка траектории)
triggers = {
"hello" : 5,
"test" : 150
}
p1 = XYZPos().from_list([50, 100, 67.117])
p2 = XYZPos().from_list([150, 0, 67.117, 180, 0, 0])
p3 = XYZPos().from_list([50, -100, 67.117, 0, 90, 0])
# Запуск обработки тригеров
TH.start_handling()
Vizualization(system.circ(robot, [p1,p2,p3], 50, arc_angle=300, speed_multiplier=0.3, triggers=triggers).trjectory).show_mathplotlib_trajectory_plot()
# Обязаттельное завершение обработки триггеров, так как иначе программа продолжит проверять триггеры, даже если основная программа завершилась
TH.end_handling()-
Калибровка инструмента производится методом 4 точек. Итоговый результат каллибровки это смещение конечной точки инструмента относительно фланца робота. Каллибровка осуществляеться при помощи функции
calibrate_toolиз модуляutils.calibration.from utils.calibration import calibrate_tool from data_types import XYZPos p1 = XYZPos().from_list([0.0, 200.0, 200.0, 0.0, 0.0, -90.0]) p2 = XYZPos().from_list([10.0, 190.0, 200.0, 0.0, 90.0, 0.0]) p3 = XYZPos().from_list([0.0, 180.0, 200.0, 0.0, 0.0, 90.0]) p4 = XYZPos().from_list([-10.0, 190.0, 200.0, 0.0, -90.0, 0.0]) Vizualization([p1,p2,p3,p4]).show_plotly_trajectory_plot() print(calibration_tool([p1,p2,p3,p4]))
-
Калибровка Базы производится методом 3 точек. Итоговый результат каллибровки это точка (её позиция и вращение относительно глобальной системы координат). Каллибровка осуществляеться при помощи функции
calibrate_baseиз модуляutils.calibration.from utils.calibration import calibrate_base from data_types import XYZPos positions_list = [ XYZPos().from_list([0.0, 0.0, 0.0]), XYZPos().from_list([-10.0, 10.0, 0.0]), XYZPos().from_list([-10.0, -10.0, 0.0]) ] base_data = calibration_base(positions_list)
p2 = XYZPos().from_list([200, 0, 67.117])
p2.smooth_endPoint = p3
p2.smooth_distance = 50
system.lin(robot, p2, 20)Сглаживание точки происходит благодяря указанию следующей точки в параметр smooth_endPoint, дистанция сглаживания измеряеться от точки сглаживаемого угла.
p3 = XYZPos().from_list([200, 0, 67.117])
p3.smooth_endPoint = p4
p3.smooth_distance = 50
system.circ(robot, [p1,p2,p3], 300) Сглаживание точки происходит благодяря указанию следующей точки в параметр smooth_endPoint 3 точки дуги , дистанция сглаживания измеряеться от точки сглаживаемого угла.
Многократное сглаживаемое линейное перемещение с итоговым сглаживанием в дугу по градусам p7.circ_angle = 300
p1.smooth_endPoint = p2; p1.smooth_distance = 30
p2.smooth_endPoint = p3; p2.smooth_distance = 30
p3.smooth_endPoint = p4; p3.smooth_distance = 30
p7.circ_angle = 300
p4.smooth_endPoint = [p5, p6, p7] Перемещение по сплайновой траектории. Построение траектории в данном примере происходит при вызове spl.start_move()
spl = Spline(robot_data=robot, system=system)
p0 = XYZPos().from_list([0,150,100])
p1 = XYZPos().from_list([200,-50,-100])
p2 = XYZPos().from_list([-200,310,0])
p3 = XYZPos().from_list([400,50,50])
spl.add_point(p0, p1, p2, p3)
trajectory = spl.start_move()Дуговое перемещение с указанием угла со сглаживанием в линейное перемещение. Минимальный угол 18°
p1 = XYZPos().from_list([100, -100, 67.117])
p2 = XYZPos().from_list([200, 0, 67.117])
p3 = XYZPos().from_list([100, 100, 67.117])
p4 = XYZPos().from_list([200, 100, 0])
p3.smooth_endPoint = p4
p3.smooth_distance = 30
trajectory = system.circ(robot, [p1,p2,p3], 300, arc_angle=3600).trjectoryСглаживание точки происходит благодяря указанию следующей точки в параметр smooth_endPoint, дистанция сглаживания измеряеться от точки сглаживаемого угла.
На основе модулей __robot, __tools и __bases строится модуль __user
-
-
get_base- Получение базы по идентификационному имениdef get_base(self, base_name:str) -> dict:
-
set_robot_base- Множитель скорости для списка скоростей осейdef set_robot_base(self, robot_data:RobotData, tool_id:str) -> dict:
-
-
-
_speed_multiplier- Множитель скорости для списка скоростей осейdef _speed_multiplier(self, speed_list:list, multiplier:float):
-
get_angles_count- Получение количества осей роботаdef get_angles_count(self, robot_data:RobotData) -> int:
-
check_emergency- Получение состояния аварийного останова роботаdef check_emergency(self, robot_data:RobotData) -> bool:
-
set_robot_position- Установка позиции робота (для пользовательских траекторий)def set_robot_position(self, robot_data:RobotData, angles:Union[AnglePos, list[AnglePos]], is_multi_point:bool=False, last_point_position:Union[XYZPos, None]=None) -> dict:
-
set_robot_speed- Установка скорости робота (для пользовательских траекторий). При multi_point позиции каждая скорость по индексу присваиваеться целевой точке с тем же индексом.def set_robot_speed(self, robot_data:RobotData, angles_speed:Union[AnglePos, list[AnglePos]], is_multi_point:bool=False) -> dict:
-
move_xyz- PTP перемещение по координатамdef move_xyz(self, robot_data:RobotData, position:XYZPos) -> dict:
-
xyz_to_angle- Перевод координат в углыdef xyz_to_angle(self, robot_data:RobotData, positions:list[XYZPos], is_multi_point:bool=False) -> Union[AnglePos, list[AnglePos]]:
-
angle_to_xyz- Перевод углов в координатыdef angle_to_xyz(self, robot_data:RobotData, angles:list[AnglePos], is_multi_point:bool=False) -> dict:
-
calculate_speed- Высчитывает скорость для PTP перемещения@staticmethod def calculate_speed(start_angles:AnglePos, end_angles:AnglePos, steps:int) -> list:
-
ptp- Point to point перемещение (определяеться такой скоростью осей, чтобы при приезде в конечную точку все оси остановились одновременно)def ptp(self, robot_data:RobotData, angles:AnglePos, step_count:int=100) -> ReturnData:
-
generate_line_points- Создаёт линию из множества точекmultipoint_position, тем самым не давая роботу сойти с траектории. При движении робот прроезжает множество коротких PTP траекторий.@staticmethod def generate_line_points(start:XYZPos, end:XYZPos, num_points:int):
-
lin- Линейное перемещение (Количество точек на линии регулируется параметромnum_points)def lin(self, robot_data:RobotData, end_point:XYZPos, num_points:int=25, lin_step_count:int=25, speed_multiplier:int=1, start:XYZPos=None) -> ReturnData:
-
circ- Перемещение по дуге из 3 точекdef circ(self, robot_data:RobotData, points_xyz:list[XYZPos], count_points:int, arc_angle:float=None, speed_multiplier:float=1, lin_step_count:int=10) -> ReturnData:
-
get_robot_log- Получение логов роботаdef get_robot_log(self, robot_data:RobotData, timestamp:int=None) -> dict:
-
get_last_log- Получение посленего лога роботаdef get_last_log(self, robot_data:RobotData, timestamp:int=None) -> dict:
-
debug- Добавление в лог робота DEBUG сообщенияdef debug(self, robot_data:RobotData, text:str) -> dict:
-
set_program- Установка програмы автоматики (Тип отправляемой программыhex строка)def set_program(self, robot_data:RobotData, program:str) -> dict:
-
delete_program- Удаление программы (Приводит к её завершению)def delete_program(self, robot_data:RobotData) -> dict:
-
get_position_id- Получение идентификационного имени активного триггераdef get_position_id(self, robot_data:RobotData) -> dict:
-
set_position_id- Установка идентификационного имени активного триггераdef set_position_id(self, robot_data:RobotData, position_id: int) -> dict:
-
-
-
get_tool_info- Получение данных инструментаdef get_tool_info(self, id:str) -> dict:
-
set_tool_info- Установка данных инструментаdef set_tool_info(self, id:str, config:Any) -> dict:
-
set_robot_tool- Привязка инструмента к роботуdef set_robot_tool(self, robot_data:RobotData, tool_id:str) -> dict:
-
-
-
SetEmergency- Установить значение виртуального аварийного останова роботаdef set_emergency(self, robot_data:RobotData, state:bool) -> dict:
-
-
-
add_kinematics- Загрузка файлов кинематики на серверdef add_kinematics(self, path:str, file_name:str) -> dict:
-
bind_kinematics- Привязка кинематики к роботуdef bind_kinematics(self, robot_data:RobotData, folder_name:str) -> dict:
-
add_tool- Добавление инструментаdef add_tool(self, id:str) -> dict:
-
add_robot- Добавление роботаdef add_robot(self, robot_data:RobotData, password:str, angle_count:int, kinematics:str="None") -> dict:
-
set_robot_home- Установить значение домашней позиции роботаdef set_robot_home(self, robot_data:RobotData, angles:list) -> dict:
-
delete_tool- Удалить инструментdef delete_tool(self, id) -> dict:
-
delete_robot- Удалить роботаdef delete_robot(self, robot_data:RobotData) -> dict:
-
add_user- Добавить пользователя (только с ролью user)def add_user(self, name:str, password:str) -> dict:
-
get_robots- Получение конфигурации всех роботов (параметрProgramTokenне передаётся)def get_robots(self) -> dict:
-
get_robot- Получение конфигурации робота (параметрProgramTokenне передаётся)def get_robot(self, robot_data:RobotData) -> dict:
-
get_system_log- Получение системного логаdef get_system_log(self) -> dict:
-
set_calibrated_data- Установка данных о калибровке инструментаdef set_calibrated_data(self, tool_id:str, data:dict) -> dict:
-
create_base- Создание базыdef create_base(self, base_name:str) -> dict:
-
get_bases- получение всех базdef get_bases(self) -> dict:
-
set_base_data- Установка данных о калибровке базыdef set_base_data(self, base_name:str, base_data:dict) -> dict:
-
delete_base- Удаление базыdef delete_base(self, base_name:str) -> dict:
-
-
-
delete_user- Удалить пользователяdef delete_user(self, name:str) -> dict:
-
add_user- Добавить пользователя (с любой ролью, кромеSystem)def add_user(self, name:str, password:str, role:str) -> dict:
-
get_user_accounts- Получение информации об аккаунте (аккаунты с ролямиSystemиSuperAdminне передаются)def get_user_accounts(self) -> str:
-
change_password- Изменить пароль аккаунтаdef change_password(self, name:str, password:str) -> dict:
-
get_account_token- Получение токена аккаунтаdef get_account_token(self, name:str, password:str) -> dict:
-
change_token- Изменение токена аккаунтаdef change_token(self, name:str, password:str) -> dict:
-
export_cache- Экспорт конфигурации сервера (Роботов, инструментов и фреймов)def export_cache(self) -> dict:
-
import_cache- Импорт конфигурации сервераdef import_cache(self, robots:dict, tools:dict, frames:dict) -> dict:
-
Если вы заметили не работающий функционал или какие либо другие ошибки, пожалуйста создайте Issues на github с описанием проблемы. Вы очень сильно поможете с продвижением в разработке.
Также вы можете учавствовать в разработке библиотеки и самой системы.
URSystem - система управления роботами
URModel - симуляциz первого робота работающего на системе управления URSystem






