Пример программы

Рассмотрим взаимодействие участника с программами SSL-Vision, GrSim и Game Controller. Для удобства, будем рассматривать уже готовый пример, созданный бразильской командой RobôCIn специально для новых команд в лиге. Ниже будет разбираться актуальный (на момент декабря 2024) код в данном репозитории. Вы можете самостоятельно собрать проект по инструкции из описания репозитория и убедиться в том, что всё работает.

В файле src/main.cpp реализована основная программа, она:

  • получает от SSL-Vision/GrSim координаты мяча и роботов, а также геометрические размеры поля
  • выводит их пользователю
  • отправляет команды управления на синих роботов.

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

Также вы можете ознакомиться с нашей реализацией - программой LARCmaCS.

Получение данных от SSL-Vision

В данном репозитории за получение данных отвечает класс RoboCupSSLClient, функционал которого описан в файле .../robocup_ssl_client.cpp.

Формат получаемых данных

packet (инициализируется на строке 31) - пакет, содержащий информацию о поле, полученный от SSL-Vision/GrSim. Далее программа проверяет, есть ли в этом пакете данные о захваченном с поля (detection, проверяется на строке 42) или геометрические размеры поля (строки 101-143). В первом случае, программа выводит информацию о работе SSL-Vision (строки 47-59), обрабатывает данные о мяче (строки 64-79) и о роботах (строки 81-99).

Все передаваемые параметры detection можно найти в файле .../messages_robocup_ssl_detection.proto

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
syntax = "proto2";

message SSL_DetectionBall {
  required float  confidence = 1;
  optional uint32 area       = 2;
  required float  x          = 3;
  required float  y          = 4;
  optional float  z          = 5;
  required float  pixel_x    = 6;
  required float  pixel_y    = 7;
}

message SSL_DetectionRobot {
  required float  confidence  =  1;
  optional uint32 robot_id    =  2;
  required float  x           =  3;
  required float  y           =  4;
  optional float  orientation =  5;
  required float  pixel_x     =  6;
  required float  pixel_y     =  7;
  optional float  height      =  8;
}

message SSL_DetectionFrame {
  required uint32             frame_number  = 1;
  required double             t_capture     = 2;
  required double             t_sent        = 3;
  required uint32             camera_id     = 4;
  repeated SSL_DetectionBall  balls         = 5;
  repeated SSL_DetectionRobot robots_yellow = 6;
  repeated SSL_DetectionRobot robots_blue   = 7;
}

В директории include/ssl-client/protobuf-files/pb/proto/ можно найти аналогичные списки параметров для всех стандартных пакетов. Тоже самое находится на официальном сайте лиги.

Управление роботом в симуляторе

Тут же (строки 86-90) посылаются команды на синих роботов, чтобы показать, что зрение работает:

1
2
3
4
5
if (robot.x() <= 0) {
    grSim_client.sendCommand(1.0, i);
} else {
    grSim_client.sendCommand(-1.0, i);
}

sendCommand(velX, id) - простая функция, которая отправляет на робота с индексом id, скорость движения вперед:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
void GrSim_Client_Example::sendCommand(double velX, int id) {
    double zero = 0.0;
    grSim_Packet packet;  //пакет, который будет передан grSim через протокол Google Protobuf
    bool yellow = false;
    packet.mutable_commands()->set_isteamyellow(yellow);
    packet.mutable_commands()->set_timestamp(0.0);
    grSim_Robot_Command* command =
        packet.mutable_commands()->add_robot_commands();  //список команд на роботов
    command->set_id(id);

    command->set_wheelsspeed(!true);  //возможность управления колесами по отдельности
    command->set_wheel1(zero);
    command->set_wheel2(zero);
    command->set_wheel3(zero);
    command->set_wheel4(zero);
    command->set_veltangent(velX);  //скорость движения
    command->set_velnormal(zero);
    command->set_velangular(zero);

    command->set_kickspeedx(zero);  //удар прямо
    command->set_kickspeedz(zero);  //удар навесом
    command->set_spinner(false);  //дрибблер

    QByteArray dgram;
    dgram.resize(packet.ByteSize());
    packet.SerializeToArray(dgram.data(), dgram.size());  //создание массива для отправки
    if (socket->writeDatagram(dgram, this->_addr, this->_port) > -1) {  //отправка
        qDebug("send data");
    }
}

Видно, что функция забивает нулями все неиспользуемые параметры, передаваемые на робота.

Получение команд от Game Controller

Получение команд от судей не показано в файле main.cpp, но реализовано в файле .../referee_ssl_client.cpp. Работает аналогично с получением пакетов от SSL Vision

Для того чтобы подробнее узнать о коммуникации внутри сети в лиге RoboCup SSL, изучите исходный код описанного репозитория. Если остались вопросы, не стесняйтесь связываться любым удобным способом с нами и спрашивать лично, будем рады помочь!

Спасибо за проявленный интерес к лиге!