Similar presentations:
Робототехническое манипулирование объектами
1.
НАУЧНЫЙ ЦЕНТР ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ И ИСКУССТВЕННОГО ИНТЕЛЛЕКТАРобототехническое манипулирование
объектами
Кульминский Данил Дмитриевич, доцент
Направление «Математическая робототехника»
02.02.2026-25.02.2026
1
2.
Робототехническое манипулирование объектамиРаздел 1. Манипулирование объектами с помощью низкоуровневого интерфейса управления «External Guided
Motion».
Application manual - Externally Guided Motion RW6. URL: https://library.abb.com/d/3HAC073319-001
2
3.
Робототехническое манипулирование объектамиРежимы работы EGM:
1) EGM Position Stream:
Текущее и планируемое положение механических узлов из задачи, написанной на RAPID,
отправляется на внешнее оборудование.
2)EGM Position Guidance:
Робот двигается не по запрограммированному в RAPID пути, а по пути, сгенерированному внешним
устройством.
3)EGM Path Correction:
Запрограммированная траектория робота модифицируется/корректируется с помощью измерений,
предоставляемых внешним устройством.
3
4.
Робототехническое манипулирование объектамиПолучение данных от сенсора до контроллера робота:
EGMSetupAI данные по аналоговым сигналам до EGM
EGMSetupAO данные по аналоговым сигналам от EGM
EGMSetupGI данные по групповым (цифр.) сигналам до EGM
EGMSetupUC данные по протоколу UdpUc до EGM
1) Запрос позиции от КД
2) EGM читает данные от КД
3) EGM отправляет данные ПК
4) EGM проверяет очередь от ПК.
Если есть сообщение, EGM
считывает следующее сообщение, и
5) записывает данные о положении
в КД. Если данные о положении не
были отправлены, КД продолжает
использовать последние данные о
положении, ранее записанные EGM
4
5.
Робототехническое манипулирование объектамиComputer
Robot
Структура данных EgmSensor (посылает сенсор ПК)
message EgmSensor{
optional EgmHeader header = 1;
optional EgmPlanned planned = 2;
optional EgmSpeedRef speedRef = 3;
}
Структура данных EgmRobot (посылает робот)
message EgmRobot {
optional EgmHeader header = 1;
optional EgmFeedBack feedBack = 2;
optional EgmPlanned planned = 3;
optional EgmMotorState motorState = 4;
optional EgmMCIState mciState = 5;
optional bool mciConvergenceMet = 6;
optional EgmTestSignals testSignals = 7;
optional EgmRapidCtrlExecState rapidExecState = 8;
optional EgmMeasuredForce measuredForce = 9;
optional double utilizationRate = 10;
}
5
Протокол Protocol Buffers от Google
6.
Робототехническое манипулирование объектамиmessage EgmHeader {
optional uint32 seqno = 1;
!! sequence number (to be able to find lost messages)
optional uint32 tm = 2;
!! time stamp in milliseconds
enum MessageType {
MSGTYPE_UNDEFINED = 0;
MSGTYPE_COMMAND = 1;
// for future use
MSGTYPE_DATA = 2;
// sent by robot controller
message EgmPlanned {
MSGTYPE_CORRECTION = 3;
// sent by sensor
optional EgmJoints joints = 1;
}
optional EgmPose cartesian = 2;
optional MessageType mtype = 3 [default = MSGTYPE_UNDEFINED];
optional EgmJoints externalJoints = 3;
}
optional EgmClock time = 4;
!! Speed reference values for robot (joint or cartesian) and additional axis (array of 6 values)
}
message EgmSpeedRef {
!! time - timestamp for when the Robot and
optional EgmJoints joints = 1;
external axes will be in the planned position.
optional EgmCartesianSpeed cartesians = 2;
optional EgmJoints externalJoints = 3;
!! Pose (i.e. cartesian position and Quaternion orientation) relative to
}
the correction frame defined by EGMActPose
!! Array of 6 speed reference values in mm/s
!!
Time
in
seconds
and
microseconds
message EgmPose {
message EgmCartesianSpeed {
message EgmClock {
optional EgmCartesian pos = 1;
repeated double value = 1;
required uint64 sec = 1;
optional EgmQuaternion orient = 2;
}
required uint64 usec = 2;
optional EgmEuler
euler = 3;
}
}
Структура данных EgmSensor (посылает сенсор ПК)
message EgmSensor{
optional EgmHeader header = 1;
optional EgmPlanned planned = 2;
optional EgmSpeedRef speedRef = 3;
}
!! Cartesian position in mm
message EgmCartesian {
required double x = 1;
required double y = 2;
required double z = 3;
}
!! Quaternion orientation
EgmQuaternion {
required double u0 = 1;
required double u1 = 2;
required double u2 = 3;
required double u3 = 4;
}
!! Euler angle orientation in degrees
message EgmEuler {
required double x = 1;
required double y = 2;
required double z = 3;
}
!! Array of 6 joint values in degrees/s
message EgmJoints {
repeated double joints = 1;
}
6
7.
Робототехническое манипулирование объектамиСтруктура данных EgmRobot (посылает робот)
message EgmHeader {
message EgmRobot {
optional uint32 seqno = 1;
!! sequence number (to be able to find lost messages)
optional EgmHeader header = 1;
optional uint32 tm = 2;
!! time stamp in milliseconds
optional EgmFeedBack feedBack = 2;
enum MessageType {
optional EgmPlanned planned = 3;
MSGTYPE_UNDEFINED = 0;
optional EgmMotorState motorState = 4;
MSGTYPE_COMMAND = 1;
!! for future use
optional EgmMCIState mciState = 5;
MSGTYPE_DATA = 2;
!! sent by robot controller
optional bool mciConvergenceMet = 6;
MSGTYPE_CORRECTION = 3;
!1 sent by sensor
optional EgmTestSignals testSignals = 7;
}
optional EgmRapidCtrlExecState rapidExecState = 8;
optional MessageType mtype = 3 [default = MSGTYPE_UNDEFINED];
optional EgmMeasuredForce measuredForce = 9;
}
optional double utilizationRate = 10;
}
message EgmFeedBack {
optional EgmJoints joints = 1;
optional EgmPose cartesian = 2;
optional EgmJoints external Joints = 3;
optional EgmClock time = 4; !! Timestamp for when the Robot and external axes was in the measured position.
// Time in seconds and microseconds
!!Array of 6 joint values in degrees
}
message EgmClock {
message EgmJoints {
Pose (i.e. cartesian position and Quaternion orientation) relative to
required uint64 sec = 1;
repeated double joints = 1;
the correction frame defined by EGMActPose
required uint64 usec = 2;
}
message EgmPose {
}
optional EgmCartesian pos = 1;
optional EgmQuaternion orient = 2;
If you have pose input, i.e. not joint input, you can choose to send orientation data as
optional EgmEuler
euler = 3;
quaternion or as Euler angles. If both are sent, Euler angles have higher priority.
}
// Quaternion orientation
// Euler angle orientation in degrees
message EgmQuaternion {
// Cartesian position in mm
message EgmEuler {
message EgmCartesian {
required double u0 = 1;
required double x = 1;
required double x = 1;
required double u1 = 2;
7
required double y = 2;
required double y = 2;
required double u2 = 3;
required double z = 3;
required double z = 3;
required double u3 = 4;
}
}
}
8.
Робототехническое манипулирование объектамиСтруктура данных EgmRobot (посылает робот)
message EgmRobot {
optional EgmHeader header = 1;
optional EgmFeedBack feedBack = 2;
optional EgmPlanned planned = 3;
optional EgmMotorState motorState = 4;
optional EgmMCIState mciState = 5;
optional bool mciConvergenceMet = 6;
optional EgmTestSignals testSignals = 7;
optional EgmRapidCtrlExecState rapidExecState = 8;
optional EgmMeasuredForce measuredForce = 9;
optional double utilizationRate = 10; }
!! Test signals
message EgmTestSignals {
repeated double signals = 1;
}
!! RAPID execution state
message EgmRapidCtrlExecState {
enum RapidCtrlExecStateType {
RAPID_UNDEFINED = 0;
RAPID_STOPPED = 1;
RAPID_RUNNING = 2;
};
required RapidCtrlExecStateType state = 1
}
!!Array of 6 force values for a robot
message EgmMeasuredForce {
repeated double force = 1;
}
!! Motor state
message EgmMotorState {
enum MotorStateType {
MOTORS_UNDEFINED = 0;
MOTORS_ON = 1;
MOTORS_OFF = 2;
}
required MotorStateType state = 1;
}
!! EGM state
message EgmMCIState
{
enum MCIStateType {
MCI_UNDEFINED = 0;
MCI_ERROR = 1;
MCI_STOPPED = 2;
MCI_RUNNING = 3;
}
required MCIStateType state = 1 [default = MCI_UNDEFINED];
}
[default = RAPID_UNDEFINED];
8
9.
Робототехническое манипулирование объектамиMODULE Module1
CONST jointtarget home := [[0, 0, 0, 0, 90, -90], [9E9, 9E9, 9E9, 9E9, 9E9, 9E9]];
VAR egmident egm_id;
VAR egm_minmax egm_condition := [-0.1, 0.1];
PROC main()
WHILE TRUE DO
MoveAbsJ home, v200, fine, tool0;
EGMGetId egm_id;
EGMSetupUC ROB_1, egm_id, "default", "ROB_1", \Joint;
EGMActJoint egm_id \J1:=egm_condition \J2:=egm_condition \J3:=egm_condition \J4:=egm_condition
\J5:=egm_condition \J6:=egm_condition \MaxSpeedDeviation:=100.0;
EGMRunJoint egm_id, EGM_STOP_HOLD, \J1 \J2 \J3 \J4 \J5 \J6 \CondTime:=0.1 \RampOutTime:=10;
EGMReset egm_id;
ENDWHILE
ERROR
IF ERRNO = ERR_UDPUC_COMM THEN
TPWrite "Communication timedout";
TRYNEXT;
ENDIF
ENDPROC
ENDMODULE
Application manual - Externally Guided Motion RW6. URL: https://library.abb.com/d/3HAC073319-001
9
10.
Робототехническое манипулирование объектамиEGMGetId EGMid
Инструкция, с помощью которой создается идентификатор работы с EGM, используется для резервирования идентификатора EGM. Этот
идентификатор затем используется во всех других инструкциях и функциях EGM RAPID для идентификации определенного процесса EGM,
связанного с задачей движения, из которой он используется. Переменная-идентификатор типа egmident определяется по имени, то есть второй
или третий вызов EGMGetId с тем же именем не зарезервирует новый процесс EGM и не изменит его содержимое. Чтобы освободить
переменную-идентификатор для использования другими процессами EGM, необходимо использовать инструкцию RAPID EGMReset.
Одновременно можно использовать максимум 4 различных идентификатора EGM.
EGMSetupUC MecUnit, EGMid, ExtConfigName, UCDevice [\Joint] |[\Pose] | [\PathCorr] [\APTR] | [\LATR]
[\CommTimeout]
Инструкция используется для настройки протокола UDP для конкретного процесса EGM в качестве источника данных, на основании которых
происходит управление робота (а также 6 доп. осей).
EGMActJoint EGMid [\StreamStart] [\Tool] [\WObj] [\TLoad] [\J1] [\J2] [\J3] [\J4] [\J5] [\J6] [\J7]
[\LpFilter] [\SampleRate][\MaxPosDeviation] [\MaxSpeedDeviation]
Инструкция используется для активации процесса EGM и использует данные от сенсора/ПК для достижения заданной позиции, заданной в
градусах
EGMRunJoint EGMid, Mode [\NoWaitCond] [\J1] [\J2] [\J3] [\J4] [\J5] [\J6] [\J7] [\CondTime] [\RampInTime]
[\RampOutTime] [\PosCorrGain]
Инструкция выполняет движение по заданным значениям в градусах для определенного процесса EGM
EGMReset EGMid
Инструкция сбрасывает конкретный процесс EGM по соответствующему имени, то есть резервирование отменяется.
Application manual - Externally Guided Motion RW6. URL: https://library.abb.com/d/3HAC073319-001
10
11.
Робототехническое манипулирование объектамиРаздел 1. Манипулирование объектами с помощью низкоуровневого интерфейса управления «External Guided
Motion».
Алгоритм устройства для внешнего управления:
CMakeLists.txt ->
cmake_minimum_required(VERSION 3.10)
project (one_joint_move CXX)
set(CMAKE_CXX_STANDARD 17)
set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) # .exe output folder
find_package(Protobuf REQUIRED)
include_directories(${Protobuf_INCLUDE_DIRS})
include_directories(${CMAKE_CURRENT_BINARY_DIR})
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS egm.proto)
file(GLOB_RECURSE sources ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
add_executable(
${PROJECT_NAME} ${sources}
${PROTO_SRCS} ${PROTO_HDRS}
)
target_link_libraries(${PROJECT_NAME} ${Protobuf_LIBRARIES})
target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR}/include)
if(WIN32)
target_link_libraries(${PROJECT_NAME} wsock32 ws2_32)
endif()
11
12.
Робототехническое манипулирование объектамиРаздел 1. Манипулирование объектами с помощью низкоуровневого интерфейса управления «External Guided
Motion».
Алгоритм устройства для внешнего управления:
Структура папки проекта:
Командная строка:
- bin
- *.exe
- build
- egm.pb.h
- egm.pb.cc
- include
- udp_server.h
- lib
- libwsock32.a
- src
- udp_server.cpp
- main.cpp
- egm.proto
cmake -G "MinGW Makefiles" ..
MinGW32-make или cmake –build .
Папку «build» следует предварительно очистить
12
13.
Робототехническое манипулирование объектамиАлгоритм устройства для внешнего управления:
int main(int argc, char *argv[])
{
// buffers for sending and receiving the messages
std::string writeBuffer;
char readBuffer[1400];
std::tuple<char*, int> receivedData; // stores received buffer from the Robot and number of bytes
// instantiate socket object
UdpServer udpSocket(portNumber);
// pointers to the EgmRobot data structure
EgmRobot *pRobotMessage = new EgmRobot();
EgmSensor *pSensorMessage = new EgmSensor();
// pointers to the EgmSensor data structure
int bytesReceived, bytesSent;
bool running; // to determing whether the planned trajectory has been completed
while(true)
{
. . . . на следующем слайде
}
// cleaning up resources
delete pRobotMessage;
delete pSensorMessage;
//getchar();
std::getchar();
return 0;
}
13
14.
Робототехническое манипулирование объектамиwhile(true)
{
//receiving messages
bytesReceived = udpSocket.read(readBuffer);
if (bytesReceived == -1)
{
std::cout << udpSocket.status() << std::endl;
continue;
}
receivedData = std::make_tuple(readBuffer,bytesReceived);
pRobotMessage->ParseFromArray(readBuffer, bytesReceived); // deserialization
qfeedback = pRobotMessage->feedback().joints().joints(0);
std::cout << "FeedBack: "<< qfeedback << std::endl;
// sending messages
running = CreateSensorMessage(pSensorMessage, qfeedback);
if (running == false)
{
std::cout<<"EGM task finished!"<<std::endl;
break;
}
pSensorMessage->SerializeToString(&writeBuffer);
bytesSent = udpSocket.write(writeBuffer);
if (bytesSent == -1)
{
std::cout << udpSocket.status() << std::endl;
break;
}
}
14
15.
Робототехническое манипулирование объектамиbool CreateSensorMessage(EgmSensor* pSensorMessage, double qfeedback) /*Creates data structure which will be sent to the robot
{
controller*/
if (globalTimeDiscret < timeDiscret )
{
// pos reference in degrees for the joints
EgmJoints* pJoints = new EgmJoints();
pJoints->add_joints(0);
pJoints->add_joints(0);
pJoints->add_joints(0);
pJoints->add_joints(0);
pJoints->add_joints(0);
pJoints->add_joints(0);
// speed reference in degrees for the joints
EgmJoints* pJointsSpeed = new EgmJoints();
pJointsSpeed->add_joints(0);
pJointsSpeed->add_joints(0);
pJointsSpeed->add_joints(0);
pJointsSpeed->add_joints(0);
pJointsSpeed->add_joints(0);
pJointsSpeed->add_joints(speedCurrent);
// setting reference degrees for the <planned> field of EGMSensor data structure;
EgmPlanned* pPlanned = new EgmPlanned();
pPlanned->set_allocated_joints(pJoints);
// setting reference speed degrees for the <speedref> field of EGMSensor data structure;
EgmSpeedRef* pSpeedRef = new EgmSpeedRef();
pSpeedRef->set_allocated_joints(pJointsSpeed);
pSensorMessage->set_allocated_planned(pPlanned);
pSensorMessage->set_allocated_speedref(pSpeedRef);
globalTimeDiscret++;
}
else . . . .
на следующем слайде
15
16.
Робототехническое манипулирование объектамиbool CreateSensorMessage(EgmSensor* pSensorMessage, double qfeedback) /*Creates data structure which will be sent to the robot
{
controller*/
else
{
return false;
}
// message Header in egm.proto file
EgmHeader* pHeader = new EgmHeader();
pHeader->set_mtype(EgmHeader_MessageType_MSGTYPE_CORRECTION);
pHeader->set_seqno(sequenceNumber++); // encreases for each message server sends
pHeader->set_tm(GetTickCount());// timestamp, e.g. for monitoring delays
// provides Header to the SensorMessage data structure
pSensorMessage->set_allocated_header(pHeader);
return true;
}
16
17.
Робототехническое манипулирование объектамиНекоторые методы классов EgmCartesian, EgmEuler и EgmCartesianSpeed.
EgmCartesian* pEgmCartesian = new EgmCartesian();
pEgmCartesian->set_x(x);
pEgmCartesian->set_y(y);
pEgmCartesian->set_z(z);
EgmEuler* pEgmEuler = new EgmEuler();
pEgmEuler->set_x(Rx);
pEgmEuler->set_y(Ry);
pEgmEuler->set_z(Rz);
EgmCartesianSpeed* pEgmCartesianSpeed = new EgmCartesianSpeed();
pEgmCartesianSpeed->add_value(dx);
pEgmCartesianSpeed->add_value(dy);
pEgmCartesianSpeed->add_value(dz);
pEgmCartesianSpeed->add_value(0);
pEgmCartesianSpeed->add_value(0);
pEgmCartesianSpeed->add_value(0);
#include "egm.pb.h" // generated by Google protoc.exe
protoc.exe создает файлы «egm.pb.cc» и «egm.pb.h».
17
18.
Робототехническое манипулирование объектамиФайл «egm.pb.h»:
EgmEuler* pEgmEuler = new EgmEuler();
pEgmEuler->set_x(Rx);
pEgmEuler->set_y(Ry);
pEgmEuler->set_z(Rz);
18
19.
Робототехническое манипулирование объектамиРаздел 1. Манипулирование объектами с помощью низкоуровневого интерфейса управления «External Guided
Motion».
Задание 1.1.
Разбор основных инструкций, выполнение практического задания-проекта с построением кинематической
модели манипулятора. Разработка алгоритма управления для типовых движений: движение по прямой, проход
инструмента робота по кругу.
Application manual - Externally Guided Motion RW6. URL: https://library.abb.com/d/3HAC073319-001
19
20.
Робототехническое манипулирование объектамиРаздел 1. Манипулирование объектами с помощью низкоуровневого интерфейса управления «External Guided
Motion».
Задание 1.2. Планировщик
MoveL
Известны начальная и конечная конфигурации робота, соответствующие точкам TCP (xs, ys, zs) и (xe, ye, ze).
Построить путь в рабочем пространстве:
(x, y, z) = (xs, ys, zs)(1 − p) + (xs, ys, zs)p, p ∈ [0, 1]
Для каждого значения p вычислить (x, y, z) и решить задачу обратной кинематики:
(x, y, z) → (θ1, θ2, θ3)
Полученные значения (θ1, θ2, θ3) использовать как опорные для системы управления.
20
Application manual - Externally Guided Motion RW6. URL: https://library.abb.com/d/3HAC073319-001
21.
Робототехническое манипулирование объектамиРаздел 1. Манипулирование объектами с помощью низкоуровневого интерфейса управления «External Guided
Motion».
Задание 1.3. Планировщик
MoveJ
Известны начальная и конечная конфигурации робота, соответствующие точкам TCP (xs, ys, zs) и (xe, ye, ze).
Решить задачу обратной кинематики для двух конфигураций:
(xs, ys, zs) → (θ s1, θ s2, θ s3) и (xe, ye, ze) → (θe1, θe2, θe3)
Построить путь в пространстве сочленений:
θ1(p) = θ s1(1 − p) + θe1 p,
θ2(p) = θ s2(1 − p) + θe2 p,
θ3(p) = θ s3(1 − p) + θe3 p, p ∈ [0, 1].
21
Application manual - Externally Guided Motion RW6. URL: https://library.abb.com/d/3HAC073319-001
informatics