Skip to content

MrBrain-YT/URLanguage

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

29 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Содержание

Обзор

Библиотека для управления и администрирования промышленных роботизированных систем с использованием URSystem API. Содержит в себе элементы для построения траекторий с использованием синтаксиса похожего на Kuka Robotics Language

Аккаунты

  • Роли

    Библиотека предоставляет доступ к 3 ролям в системе:

    • User

      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

      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

      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 - отключение отправки данных на сервер в модуле __robot
      • cfg.login_simulation = True - параметр для получения роли и токена (когда значение True, при авторизации вместо запроса на сервер вы сразу получаете роль и токен).
      • cfg.simulation_role = StaticData.Roles.ADMIN - позволяет настроить роль получаемую при симуляции авторизации, в примере мы устанавливаем "administrator", по стандарту SuperAdmin
      • cfg.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)

Типы данных

  • XYZPos

    Позиция в декартовой системе координат

    from data_types import XYZPos
    
    XYZPos().from_list([201,150,100])
  • AnglePos

    Позиция робота указанная в углах для каждой оси

    from data_types import AnglePos
    
    AnglePos().from_list([200,40,0,150]) # 4 Axis
  • Spline

    Траетория строящаяся по 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()
  • RobotData

    Дата класс использующийся для хранения данных о роботе

    from data_types import RobotData
    
    robot = RobotData(name="First", code="654123")
  • ReturnData

    Дата класс использующийся для стандартизации вывода использования функций

    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)

Перемещения

LIN => LIN

Линейное перемещение со сглаживанием в другое линейное перемещение
p2 = XYZPos().from_list([200, 0, 67.117])
p2.smooth_endPoint = p3
p2.smooth_distance = 50

system.lin(robot, p2, 20)

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

  CIRC => LIN

  Дуговое перемещение со сглаживанием в линейное перемещение
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 точки дуги , дистанция сглаживания измеряеться от точки сглаживаемого угла.

LIN => LIN => LIN => LIN => CIRC

Многократное сглаживаемое линейное перемещение с итоговым сглаживанием в дугу по градусам 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]


 SPLINE

 Перемещение по сплайновой траектории. Построение траектории в данном примере происходит при вызове 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()

CIRC (arc) => LIN

Дуговое перемещение с указанием угла со сглаживанием в линейное перемещение. Минимальный угол 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

  • __bases

    • 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:
  • __robot

    • _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:
  • __tools

    • 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:
  • User

    • SetEmergency - Установить значение виртуального аварийного останова робота

      def set_emergency(self, robot_data:RobotData, state:bool) -> dict:
  • Admin

    • 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:
  • SuperAdmin

    • 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

About

Python library for automate administaration United Robotics System

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages