Skip to main content

27. «Взаимодействие роботов» -программирование

🎬 Открыть презентацию

Технологическая карта урока

ЦЕЛЕВОЙ БЛОК

Модуль: Проектная деятельность в робототехнике

Тема урока: 27. Выполнение учебного проекта «Взаимодействие роботов»: программирование

Цель урока: Сформировать практические навыки программирования взаимодействующих робототехнических систем для выполнения совместной задачи.

Планируемые результаты:

Предметные:

  • Знать принципы разработки программного обеспечения для взаимодействующих роботов
  • Уметь применять модульный подход к программированию робототехнических систем
  • Владеть навыками отладки и тестирования программ для роботов
  • Понимать принципы координации действий нескольких роботов

Метапредметные:

  • Регулятивные УУД: умение планировать последовательность программирования, тестировать и корректировать код
  • Познавательные УУД: применение алгоритмического мышления, использование математических моделей для решения задач координации
  • Коммуникативные УУД: эффективное взаимодействие при совместной разработке программного обеспечения

Личностные:

  • Формирование настойчивости и целеустремленности при решении программных задач
  • Развитие системного мышления и творческого подхода к программированию
  • Воспитание культуры совместной работы над программным проектом
  • Формирование ответственного отношения к процессу и результатам программирования

ИНСТРУМЕНТАЛЬНЫЙ БЛОК

Задачи урока:

  1. Обеспечить понимание принципов разработки программ для взаимодействующих роботов
  2. Сформировать навыки применения модульного программирования в робототехнике
  3. Развить умение программировать коммуникацию между робототехническими устройствами
  4. Научить применять математические алгоритмы для координации движения роботов
  5. Закрепить навыки отладки и тестирования программного кода для робототехнических систем

Тип урока: Практикум по программированию

Учебно-методическое и материально-техническое обеспечение:

  • Компьютеры с установленной средой программирования
  • Собранные роботы с предыдущего урока
  • Программные библиотеки для работы с робототехническими компонентами
  • Модули беспроводной связи (Bluetooth, Wi-Fi, инфракрасные передатчики)
  • Методические материалы по программированию роботов
  • Инструкции по отладке программ для роботов
  • Шаблоны алгоритмов взаимодействия роботов
  • Примеры программного кода для решения типовых задач
  • Схемы алгоритмов координации нескольких роботов

ОРГАНИЗАЦИОННО-ДЕЯТЕЛЬНОСТНЫЙ БЛОК

Образовательные технологии: Проектное обучение, практико-ориентированное обучение, работа в малых группах, программирование в парах

Межпредметные связи:

  • Информатика: модульное программирование, отладка кода, работа с данными, протоколы обмена информацией
  • Математика: реализация алгоритмов координации и оптимизации движения, векторные расчеты, координатные системы
  • Физика: учет физических ограничений при программировании движения роботов
  • Английский язык: использование технической терминологии в программировании
Этап урока Деятельность учителя Деятельность ученика Планируемые результаты предметные Планируемые результаты УУД
1. Организационный момент (3 мин) Приветствует учащихся, проверяет готовность к уроку. Организует распределение учащихся по проектным группам, сформированным ранее. Занимают места в проектных группах. Проверяют наличие необходимого оборудования и материалов. Регулятивные: самоорганизация, готовность к работе
2. Актуализация знаний и мотивация (7 мин) Напоминает о результатах предыдущих этапов проекта (обоснование и сборка).

Организует обсуждение:
- Какие задачи должны выполнять ваши роботы?
- Какие типы взаимодействия между роботами вы планируете реализовать?
- Какие алгоритмы потребуются для решения поставленных задач?

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

Отвечают на вопросы, обсуждают задачи, которые должны выполнять их роботы.

Анализируют типы взаимодействия и необходимые алгоритмы.

Просматривают видеоматериал, задают уточняющие вопросы.
Понимание задач программирования роботов. Актуализация знаний о функциональности создаваемых роботов. Познавательные: актуализация имеющихся знаний.

Коммуникативные: участие в диалоге.
3. Вводный инструктаж: принципы программирования взаимодействующих роботов (10 мин) Объясняет основные принципы программирования взаимодействующих роботов:

1. Модульный подход (межпредметная связь с информатикой):
- Разделение кода на функциональные модули
- Независимая разработка и тестирование модулей
- Интеграция модулей в единую систему

2. Программирование коммуникации между роботами:
- Протоколы обмена данными
- Форматы сообщений
- Обработка ошибок связи

3. Координация действий роботов (межпредметная связь с математикой):
- Алгоритмы согласования действий
- Синхронизация во времени
- Пространственная координация

4. Стратегии отладки программ:
- Пошаговая проверка функциональности
- Тестирование в упрощенных условиях
- Изоляция и устранение ошибок
Воспринимают информацию о принципах программирования взаимодействующих роботов.

Фиксируют ключевые понятия в тетрадях.

Задают уточняющие вопросы по модульному программированию и протоколам коммуникации.

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

Понимание модульного подхода к разработке программного обеспечения.

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

Регулятивные: понимание последовательности программирования.
4. Практическая работа: планирование структуры программы (10 мин) Организует работу групп по планированию структуры программы:

Предлагает схему планирования:
1. Определение основных функциональных модулей
2. Распределение ответственности между модулями
3. Определение интерфейсов между модулями
4. Планирование алгоритма коммуникации

Раздает шаблоны для планирования структуры программы.

Консультирует группы, помогает структурировать программу, подсказывает оптимальные решения.
В группах планируют структуру программы:
- Определяют основные функциональные модули для каждого робота
- Составляют схему взаимодействия модулей
- Определяют формат данных для обмена между роботами
- Фиксируют результаты в шаблоне
- Обсуждают и согласовывают структуру программы

Участники группы вносят свои предложения и совместно принимают решения.
Умение планировать структуру программы для робототехнических систем.

Навык разделения кода на функциональные модули.

Понимание интерфейсов между модулями программы.
Регулятивные: планирование работы, разбиение задачи на подзадачи.

Познавательные: структурирование информации, построение моделей.

Коммуникативные: обсуждение и согласование технических решений.
5. Практическая работа: программирование базовых функций роботов (15 мин) Объясняет задачу этапа: “Необходимо запрограммировать базовые функции для каждого робота: движение, работа с сенсорами, управление исполнительными механизмами”.

Напоминает о принципах модульного программирования.

Консультирует группы в процессе программирования:
- Помогает с выбором оптимальных алгоритмов
- Подсказывает решения типовых проблем
- Объясняет работу с библиотеками

Акцентирует внимание на необходимости тестирования каждого модуля.
Работают над программированием базовых функций роботов:
- Разрабатывают модули для управления движением
- Создают модули для работы с датчиками
- Программируют управление исполнительными механизмами
- Тестируют работу отдельных модулей
- Комментируют код для облегчения дальнейшей работы

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

Навыки модульного программирования в робототехнике.

Понимание принципов работы с сенсорами и исполнительными механизмами.
Познавательные: алгоритмическое мышление, реализация алгоритмов в программном коде.

Регулятивные: контроль и коррекция программного кода.

Коммуникативные: распределение задач в группе.
6. Физкультминутка (2 мин) Проводит короткую физкультминутку для снятия напряжения и усталости. Выполняют физические упражнения. Регулятивные: саморегуляция.
7. Практическая работа: программирование коммуникации между роботами (15 мин) Объясняет особенности программирования систем связи между роботами:
- Принципы работы с модулями беспроводной связи
- Структура сообщений для обмена данными
- Обработка получаемых сообщений
- Алгоритмы подтверждения приема

Демонстрирует примеры кода для организации коммуникации.

Консультирует группы по вопросам настройки и программирования систем связи.
Программируют коммуникацию между роботами:
- Настраивают модули беспроводной связи
- Разрабатывают протокол обмена данными
- Создают функции для отправки и приема сообщений
- Реализуют обработку полученных данных
- Тестируют передачу данных между роботами

При необходимости модифицируют базовые функции роботов для интеграции с системой коммуникации.
Умение программировать системы коммуникации между роботами.

Навыки работы с протоколами обмена данными.

Понимание принципов обработки сообщений.
Познавательные: применение знаний в области информационных технологий.

Регулятивные: отладка и проверка работоспособности коммуникации.

Личностные: настойчивость при решении сложных технических задач.
8. Практическая работа: программирование алгоритмов координации (15 мин) Объясняет принципы программирования координации действий роботов:
- Алгоритмы распределения задач между роботами
- Синхронизация действий во времени
- Оптимизация совместного движения

Межпредметная связь с математикой: рассказывает о применении математических алгоритмов для координации движения.

Демонстрирует примеры реализации типовых алгоритмов координации.

Консультирует группы по вопросам оптимизации взаимодействия.
Разрабатывают алгоритмы координации действий роботов:
- Применяют математические модели для расчета оптимальных траекторий
- Создают алгоритмы синхронизации действий
- Программируют совместное решение задач
- Реализуют обработку конфликтных ситуаций
- Интегрируют модули координации с базовыми функциями и коммуникацией

Применяют знания из области математики для оптимизации движения и взаимодействия.
Умение программировать алгоритмы координации нескольких роботов.

Навыки применения математических моделей в робототехнических проектах.

Понимание принципов синхронизации действий.
Познавательные: применение математических знаний для решения инженерных задач.

Регулятивные: оптимизация алгоритмов.

Коммуникативные: согласование технических решений.
9. Практическая работа: интеграция и отладка программного обеспечения (15 мин) Объясняет принципы интеграции и отладки программного обеспечения роботов:
- Пошаговое тестирование модулей
- Выявление и устранение ошибок
- Оптимизация программного кода
- Обеспечение надежности работы

Межпредметная связь с информатикой: обсуждает методы отладки кода и поиска ошибок.

Консультирует группы в процессе отладки, помогает выявлять и устранять проблемы.
Выполняют интеграцию и отладку программного обеспечения:
- Объединяют разработанные модули в единую систему
- Тестируют взаимодействие между модулями
- Выявляют и устраняют ошибки
- Оптимизируют программный код
- Проверяют стабильность работы системы
- Документируют выявленные проблемы и способы их решения
Умение интегрировать модули программы в единую систему.

Навыки отладки программного кода.

Понимание методов обеспечения надежности программного обеспечения.
Регулятивные: выявление и исправление ошибок, контроль качества.

Познавательные: анализ проблем и поиск решений.

Личностные: настойчивость при устранении ошибок.
10. Практическая работа: тестирование взаимодействия роботов (10 мин) Организует комплексное тестирование взаимодействия роботов:
- Предлагает группам проверить выполнение поставленных задач
- Создает различные сценарии для тестирования
- Наблюдает за работой роботов
- Помогает выявлять проблемы

Обращает внимание на качество взаимодействия роботов и выполнение проектных задач.
Проводят тестирование взаимодействия роботов:
- Запускают программы на роботах
- Наблюдают за их совместной работой
- Фиксируют проблемы и недостатки
- При необходимости вносят корректировки в программы
- Проверяют выполнение поставленных задач

Анализируют эффективность взаимодействия роботов.
Умение проводить комплексное тестирование робототехнических систем.

Навыки анализа работы программного обеспечения в реальных условиях.

Понимание критериев успешного выполнения задач.
Регулятивные: оценка результатов работы.

Познавательные: анализ функционирования системы.

Коммуникативные: совместная оценка результатов.
11. Демонстрация и обсуждение результатов (10 мин) Организует демонстрацию результатов работы групп:
- Предлагает каждой группе продемонстрировать взаимодействие роботов
- Задает вопросы о реализованных алгоритмах
- Просит пояснить выбор технических решений
- Стимулирует обсуждение сильных и слабых сторон

Организует взаимную оценку группами работ друг друга.
Представляют результаты работы:
- Демонстрируют взаимодействие роботов
- Объясняют особенности реализованных алгоритмов
- Рассказывают о трудностях и способах их преодоления
- Отвечают на вопросы
- Оценивают работы других групп

Участвуют в обсуждении результатов.
Умение представлять и объяснять программные решения.

Навыки анализа эффективности алгоритмов.

Понимание сильных и слабых сторон реализованных решений.
Коммуникативные: представление результатов, участие в обсуждении.

Познавательные: анализ различных технических решений.

Личностные: восприятие критики, объективная оценка.
12. Рефлексия и обсуждение следующих шагов (5 мин) Организует рефлексию с использованием метода “Программный отчет”:
- Что получилось реализовать в программном обеспечении?
- Какие проблемы остались нерешенными?
- Какие улучшения можно внести в программы?

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

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

Познавательные: анализ достижений и проблем.

Личностные: ответственность за результат.
13. Домашнее задание и сохранение работы (3 мин) Объясняет домашнее задание:
1. Проанализировать работу программного обеспечения и составить список возможных улучшений
2. Подготовиться к итоговому тестированию и презентации проекта
3. Документировать программный код (добавить комментарии, описать алгоритмы)

Организует сохранение программного кода и проектов.
Записывают домашнее задание.

Сохраняют программный код и проекты.

Организуют безопасное отключение и хранение роботов.
Регулятивные: организация дальнейшей работы.

Дополнительные материалы:

Структура программного обеспечения для взаимодействующих роботов:

 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    │   └── Назначение задач роботам
33    ├── Синхронизация действий
34    │   ├── Временная синхронизация
35    │   ├── Координация в пространстве
36    │   └── Обработка критических ситуаций
37    └── Оптимизация совместной работы
38        ├── Минимизация затрачиваемых ресурсов
39        ├── Повышение эффективности выполнения задач
40        └── Адаптация к изменениям среды

Пример кода для организации коммуникации между роботами (Arduino):

  1// Пример кода для организации простой коммуникации между роботами с использованием Bluetooth
  2// Данный код является учебным примером и требует адаптации под конкретное оборудование
  3
  4#include <SoftwareSerial.h>
  5
  6// Пины для Bluetooth модуля
  7#define BT_RX 10
  8#define BT_TX 11
  9
 10// Создаем объект для работы с Bluetooth
 11SoftwareSerial bluetoothSerial(BT_RX, BT_TX);
 12
 13// Константы для типов сообщений
 14#define MSG_COMMAND 'C'  // Команда
 15#define MSG_DATA 'D'     // Данные
 16#define MSG_ACK 'A'      // Подтверждение
 17#define MSG_ERROR 'E'    // Ошибка
 18
 19// Буфер для приема сообщений
 20char messageBuffer[64];
 21int bufferIndex = 0;
 22
 23// Структура для хранения команд и данных
 24struct RobotMessage {
 25  char type;
 26  int commandId;
 27  int parameter1;
 28  int parameter2;
 29  bool needAck;
 30};
 31
 32// Функция инициализации коммуникации
 33void initCommunication() {
 34  bluetoothSerial.begin(9600);
 35  Serial.println("Communication initialized");
 36}
 37
 38// Функция отправки сообщения
 39void sendMessage(char type, int commandId, int param1, int param2, bool needAck) {
 40  // Форматируем сообщение: тип,commandId,param1,param2,needAck
 41  String message = String(type) + "," + String(commandId) + "," + 
 42                   String(param1) + "," + String(param2) + "," + 
 43                   (needAck ? "1" : "0") + "\n";
 44                   
 45  bluetoothSerial.print(message);
 46  
 47  Serial.print("Sent: ");
 48  Serial.print(message);
 49}
 50
 51// Функция отправки команды
 52void sendCommand(int commandId, int param1, int param2, bool needAck) {
 53  sendMessage(MSG_COMMAND, commandId, param1, param2, needAck);
 54}
 55
 56// Функция отправки данных
 57void sendData(int dataId, int value1, int value2, bool needAck) {
 58  sendMessage(MSG_DATA, dataId, value1, value2, needAck);
 59}
 60
 61// Функция отправки подтверждения
 62void sendAcknowledgement(int commandId) {
 63  sendMessage(MSG_ACK, commandId, 0, 0, false);
 64}
 65
 66// Функция отправки сообщения об ошибке
 67void sendError(int errorCode, int commandId) {
 68  sendMessage(MSG_ERROR, commandId, errorCode, 0, false);
 69}
 70
 71// Функция обработки входящего сообщения
 72void processMessage(const String& message) {
 73  // Парсинг сообщения
 74  int commaPos1 = message.indexOf(',');
 75  int commaPos2 = message.indexOf(',', commaPos1 + 1);
 76  int commaPos3 = message.indexOf(',', commaPos2 + 1);
 77  int commaPos4 = message.indexOf(',', commaPos3 + 1);
 78  
 79  if (commaPos1 < 0 || commaPos2 < 0 || commaPos3 < 0 || commaPos4 < 0) {
 80    Serial.println("Error parsing message: invalid format");
 81    return;
 82  }
 83  
 84  // Извлекаем части сообщения
 85  char type = message.charAt(0);
 86  int commandId = message.substring(commaPos1 + 1, commaPos2).toInt();
 87  int param1 = message.substring(commaPos2 + 1, commaPos3).toInt();
 88  int param2 = message.substring(commaPos3 + 1, commaPos4).toInt();
 89  bool needAck = (message.substring(commaPos4 + 1).toInt() == 1);
 90  
 91  // Создаем структуру сообщения
 92  RobotMessage msg = {type, commandId, param1, param2, needAck};
 93  
 94  // Обрабатываем сообщение в зависимости от типа
 95  switch (type) {
 96    case MSG_COMMAND:
 97      processCommand(msg);
 98      break;
 99    case MSG_DATA:
100      processData(msg);
101      break;
102    case MSG_ACK:
103      processAcknowledgement(msg);
104      break;
105    case MSG_ERROR:
106      processError(msg);
107      break;
108    default:
109      Serial.println("Unknown message type");
110  }
111  
112  // Отправляем подтверждение, если оно требуется
113  if (needAck) {
114    sendAcknowledgement(commandId);
115  }
116}
117
118// Функция обработки входящей команды
119void processCommand(const RobotMessage& msg) {
120  Serial.print("Command received: ID=");
121  Serial.print(msg.commandId);
122  Serial.print(", Param1=");
123  Serial.print(msg.parameter1);
124  Serial.print(", Param2=");
125  Serial.println(msg.parameter2);
126  
127  // Здесь код для выполнения команды в зависимости от commandId
128  // Например:
129  switch (msg.commandId) {
130    case 1: // Движение
131      moveRobot(msg.parameter1, msg.parameter2);
132      break;
133    case 2: // Взаимодействие с объектом
134      interactWithObject(msg.parameter1);
135      break;
136    // Другие команды...
137    default:
138      Serial.println("Unknown command ID");
139  }
140}
141
142// Обработка данных
143void processData(const RobotMessage& msg) {
144  Serial.print("Data received: ID=");
145  Serial.print(msg.commandId);
146  Serial.print(", Value1=");
147  Serial.print(msg.parameter1);
148  Serial.print(", Value2=");
149  Serial.println(msg.parameter2);
150  
151  // Здесь код для обработки полученных данных
152}
153
154// Обработка подтверждения
155void processAcknowledgement(const RobotMessage& msg) {
156  Serial.print("Acknowledgement for command ID=");
157  Serial.println(msg.commandId);
158  
159  // Здесь код для обработки подтверждения
160}
161
162// Обработка ошибки
163void processError(const RobotMessage& msg) {
164  Serial.print("Error for command ID=");
165  Serial.print(msg.commandId);
166  Serial.print(", Error code=");
167  Serial.println(msg.parameter1);
168  
169  // Здесь код для обработки ошибки
170}
171
172// Проверка входящих сообщений
173void checkIncomingMessages() {
174  while (bluetoothSerial.available()) {
175    char c = bluetoothSerial.read();
176    
177    // Если конец строки, обрабатываем сообщение
178    if (c == '\n') {
179      messageBuffer[bufferIndex] = '\0'; // Добавляем конец строки
180      processMessage(String(messageBuffer));
181      bufferIndex = 0; // Сбрасываем индекс буфера
182    } else if (bufferIndex < 63) { // Проверка переполнения буфера
183      messageBuffer[bufferIndex++] = c;
184    }
185  }
186}
187
188// Примеры функций управления роботом (должны быть реализованы в зависимости от конкретной платформы)
189void moveRobot(int direction, int speed) {
190  // Код для управления движением робота
191  Serial.print("Moving robot: Direction=");
192  Serial.print(direction);
193  Serial.print(", Speed=");
194  Serial.println(speed);
195}
196
197void interactWithObject(int actionType) {
198  // Код для взаимодействия с объектами
199  Serial.print("Interacting with object: Action=");
200  Serial.println(actionType);
201}
202
203void setup() {
204  Serial.begin(9600);
205  initCommunication();
206  
207  // Другие инициализации...
208}
209
210void loop() {
211  // Проверяем входящие сообщения
212  checkIncomingMessages();
213  
214  // Другие задачи робота...
215  
216  delay(10); // Небольшая задержка для стабильности
217}

Пример алгоритма координации движения роботов:

  1# Пример кода на Python для координации движения нескольких роботов
  2# Данный код является учебным примером и должен быть адаптирован к конкретной платформе
  3
  4import math
  5import time
  6
  7# Класс для представления положения робота
  8class Position:
  9    def __init__(self, x=0, y=0, angle=0):
 10        self.x = x
 11        self.y = y
 12        self.angle = angle
 13    
 14    def distance_to(self, other_position):
 15        """Рассчитывает расстояние до другой позиции"""
 16        return math.sqrt((self.x - other_position.x)**2 + (self.y - other_position.y)**2)
 17    
 18    def angle_to(self, other_position):
 19        """Рассчитывает угол до другой позиции"""
 20        return math.degrees(math.atan2(other_position.y - self.y, other_position.x - self.x))
 21
 22# Класс для представления робота
 23class Robot:
 24    def __init__(self, robot_id, initial_position=Position()):
 25        self.id = robot_id
 26        self.position = initial_position
 27        self.target_position = None
 28        self.speed = 0
 29        self.state = "idle"  # idle, moving, working
 30        self.task = None
 31    
 32    def set_target(self, target_position):
 33        """Устанавливает целевую позицию для робота"""
 34        self.target_position = target_position
 35        self.state = "moving"
 36        
 37    def update_position(self, new_position):
 38        """Обновляет текущую позицию робота"""
 39        self.position = new_position
 40        
 41        # Проверяем, достиг ли робот целевой позиции
 42        if (self.target_position and 
 43            self.position.distance_to(self.target_position) < 0.1):
 44            self.state = "idle"
 45            self.target_position = None
 46            return True
 47        return False
 48    
 49    def assign_task(self, task):
 50        """Назначает задачу роботу"""
 51        self.task = task
 52        self.state = "working"
 53    
 54    def complete_task(self):
 55        """Отмечает задачу как выполненную"""
 56        self.task = None
 57        self.state = "idle"
 58
 59# Класс для координации группы роботов
 60class RobotCoordinator:
 61    def __init__(self):
 62        self.robots = {}
 63        self.tasks = []
 64    
 65    def add_robot(self, robot):
 66        """Добавляет робота в систему координации"""
 67        self.robots[robot.id] = robot
 68    
 69    def add_task(self, task):
 70        """Добавляет задачу в очередь"""
 71        self.tasks.append(task)
 72    
 73    def get_idle_robots(self):
 74        """Возвращает список свободных роботов"""
 75        return [robot for robot in self.robots.values() if robot.state == "idle"]
 76    
 77    def assign_tasks(self):
 78        """Распределяет задачи между свободными роботами"""
 79        idle_robots = self.get_idle_robots()
 80        
 81        while idle_robots and self.tasks:
 82            task = self.tasks.pop(0)  # Берем первую задачу из очереди
 83            
 84            # Находим ближайшего робота к месту выполнения задачи
 85            nearest_robot = None
 86            min_distance = float('inf')
 87            
 88            for robot in idle_robots:
 89                distance = robot.position.distance_to(task.position)
 90                if distance < min_distance:
 91                    min_distance = distance
 92                    nearest_robot = robot
 93            
 94            if nearest_robot:
 95                nearest_robot.set_target(task.position)
 96                nearest_robot.assign_task(task)
 97                idle_robots.remove(nearest_robot)
 98                print(f"Робот {nearest_robot.id} назначен на задачу {task.id} в позиции ({task.position.x}, {task.position.y})")
 99    
100    def coordinate_movement(self):
101        """Координирует движение роботов для избежания столкновений"""
102        moving_robots = [robot for robot in self.robots.values() if robot.state == "moving"]
103        
104        # Проверяем каждую пару движущихся роботов
105        for i in range(len(moving_robots)):
106            for j in range(i + 1, len(moving_robots)):
107                robot1 = moving_robots[i]
108                robot2 = moving_robots[j]
109                
110                # Если роботы находятся слишком близко друг к другу
111                if robot1.position.distance_to(robot2.position) < 2.0:
112                    # Вычисляем векторы направления движения
113                    vector1 = (robot1.target_position.x - robot1.position.x, 
114                              robot1.target_position.y - robot1.position.y)
115                    vector2 = (robot2.target_position.x - robot2.position.x, 
116                              robot2.target_position.y - robot2.position.y)
117                    
118                    # Если роботы движутся навстречу друг другу
119                    dot_product = vector1[0]*vector2[0] + vector1[1]*vector2[1]
120                    if dot_product < 0:
121                        # Определяем, какой робот должен уступить дорогу
122                        # Например, по приоритету задачи или ID робота
123                        if robot1.id > robot2.id:
124                            self.adjust_path(robot1, robot2)
125                        else:
126                            self.adjust_path(robot2, robot1)
127    
128    def adjust_path(self, robot, obstacle_robot):
129        """Корректирует путь робота для избежания столкновения"""
130        # Временно изменяем целевую точку, чтобы обойти препятствие
131        # Это упрощенный пример, в реальности нужен более сложный алгоритм планирования пути
132        
133        # Вычисляем вектор от препятствия к роботу
134        dx = robot.position.x - obstacle_robot.position.x
135        dy = robot.position.y - obstacle_robot.position.y
136        
137        # Нормализуем вектор и создаем смещение
138        length = math.sqrt(dx*dx + dy*dy)
139        if length > 0:
140            dx = dx / length * 3.0  # Смещение на 3 единицы
141            dy = dy / length * 3.0
142        
143        # Создаем промежуточную точку в стороне от препятствия
144        intermediate_position = Position(
145            obstacle_robot.position.x + dx,
146            obstacle_robot.position.y + dy
147        )
148        
149        # Временно устанавливаем эту точку как целевую
150        original_target = robot.target_position
151        robot.set_target(intermediate_position)
152        
153        # Запоминаем оригинальную точку, чтобы вернуться к ней позже
154        # В реальной системе нужно сохранять весь маршрут
155        print(f"Робот {robot.id} корректирует путь для избежания столкновения с роботом {obstacle_robot.id}")
156
157# Класс для представления задачи
158class Task:
159    def __init__(self, task_id, position, priority=0):
160        self.id = task_id
161        self.position = position
162        self.priority = priority
163        self.status = "pending"  # pending, assigned, completed
164
165# Пример использования
166if __name__ == "__main__":
167    # Создаем координатора
168    coordinator = RobotCoordinator()
169    
170    # Создаем роботов
171    robot1 = Robot(1, Position(0, 0))
172    robot2 = Robot(2, Position(10, 0))
173    
174    # Добавляем роботов в систему координации
175    coordinator.add_robot(robot1)
176    coordinator.add_robot(robot2)
177    
178    # Создаем задачи
179    task1 = Task(1, Position(5, 5))
180    task2 = Task(2, Position(8, 8))
181    
182    # Добавляем задачи в очередь
183    coordinator.add_task(task1)
184    coordinator.add_task(task2)
185    
186    # Распределяем задачи
187    coordinator.assign_tasks()
188    
189    # Имитация движения и координации (в реальности это было бы в цикле)
190    for i in range(5):
191        print(f"\nИтерация {i+1}:")
192        
193        # Обновляем позиции роботов (в реальности это было бы фактическое движение)
194        if robot1.state == "moving":
195            robot1.update_position(Position(
196                robot1.position.x + (robot1.target_position.x - robot1.position.x) * 0.2,
197                robot1.position.y + (robot1.target_position.y - robot1.position.y) * 0.2
198            ))
199            print(f"Робот 1: позиция ({robot1.position.x:.1f}, {robot1.position.y:.1f})")
200        
201        if robot2.state == "moving":
202            robot2.update_position(Position(
203                robot2.position.x + (robot2.target_position.x - robot2.position.x) * 0.2,
204                robot2.position.y + (robot2.target_position.y - robot2.position.y) * 0.2
205            ))
206            print(f"Робот 2: позиция ({robot2.position.x:.1f}, {robot2.position.y:.1f})")
207        
208        # Координируем движение для избежания столкновений
209        coordinator.coordinate_movement()
210        
211        # Имитация завершения задач
212        for robot in [robot1, robot2]:
213            if (robot.task and robot.state == "working" and 
214                robot.position.distance_to(robot.task.position) < 0.5):
215                print(f"Робот {robot.id} выполнил задачу {robot.task.id}")
216                robot.complete_task()
217        
218        # Назначаем новые задачи, если они есть
219        coordinator.assign_tasks()
220        
221        # Задержка для наглядности
222        time.sleep(1)

Шаблон для планирования структуры программы:

 1ПЛАНИРОВАНИЕ СТРУКТУРЫ ПРОГРАММЫ
 2"ВЗАИМОДЕЙСТВИЕ РОБОТОВ"
 3
 4Группа: _______   Участники: _____________________________
 5
 61. МОДУЛИ РОБОТА 1 (название робота): _________________
 7
 8   1.1. Базовые функции:
 9   
10   | Название функции | Описание | Входные параметры | Выходные параметры |
11   |-----------------|----------|------------------|-------------------|
12   |                 |          |                  |                   |
13   |                 |          |                  |                   |
14   
15   1.2. Коммуникационные функции:
16   
17   | Название функции | Описание | Входные параметры | Выходные параметры |
18   |-----------------|----------|------------------|-------------------|
19   |                 |          |                  |                   |
20   |                 |          |                  |                   |
21   
22   1.3. Функции координации:
23   
24   | Название функции | Описание | Входные параметры | Выходные параметры |
25   |-----------------|----------|------------------|-------------------|
26   |                 |          |                  |                   |
27   |                 |          |                  |                   |
28
292. МОДУЛИ РОБОТА 2 (название робота): _________________
30
31   2.1. Базовые функции:
32   
33   | Название функции | Описание | Входные параметры | Выходные параметры |
34   |-----------------|----------|------------------|-------------------|
35   |                 |          |                  |                   |
36   |                 |          |                  |                   |
37   
38   2.2. Коммуникационные функции:
39   
40   | Название функции | Описание | Входные параметры | Выходные параметры |
41   |-----------------|----------|------------------|-------------------|
42   |                 |          |                  |                   |
43   |                 |          |                  |                   |
44   
45   2.3. Функции координации:
46   
47   | Название функции | Описание | Входные параметры | Выходные параметры |
48   |-----------------|----------|------------------|-------------------|
49   |                 |          |                  |                   |
50   |                 |          |                  |                   |
51
523. ПРОТОКОЛ КОММУНИКАЦИИ:
53
54   3.1. Формат сообщений:
55   _________________________________________________
56   _________________________________________________
57   
58   3.2. Типы сообщений:
59   
60   | Тип сообщения | Код | Формат данных | Описание |
61   |--------------|-----|--------------|----------|
62   |              |     |              |          |
63   |              |     |              |          |
64   
65   3.3. Обработка ошибок:
66   _________________________________________________
67   _________________________________________________
68
694. АЛГОРИТМЫ КООРДИНАЦИИ:
70
71   4.1. Распределение задач:
72   _________________________________________________
73   _________________________________________________
74   
75   4.2. Синхронизация действий:
76   _________________________________________________
77   _________________________________________________
78   
79   4.3. Разрешение конфликтов:
80   _________________________________________________
81   _________________________________________________
82
835. ЗАВИСИМОСТИ МЕЖДУ МОДУЛЯМИ:
84
85   [Место для диаграммы зависимостей модулей]
86
876. ПОРЯДОК РАЗРАБОТКИ И ТЕСТИРОВАНИЯ:
88
89   | Этап | Описание | Ответственный | Критерии готовности |
90   |------|----------|--------------|-------------------|
91   |      |          |              |                   |
92   |      |          |              |                   |
93   |      |          |              |                   |

Советы по отладке программ для взаимодействующих роботов:

  1. Изоляция проблем:

    • Тестируйте каждый модуль по отдельности перед интеграцией
    • Используйте “заглушки” (stubs) для имитации работы других модулей
    • Начинайте с простейших сценариев взаимодействия
  2. Логирование:

    • Добавляйте подробные сообщения о действиях и состояниях роботов
    • Фиксируйте все отправляемые и получаемые сообщения
    • Используйте временные метки для анализа последовательности событий
  3. Визуализация:

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

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

    • Начинайте с простых сценариев координации
    • Постепенно усложняйте задачи и условия
    • Тестируйте реакцию на неожиданные ситуации
    • Проверяйте обработку конфликтов между роботами
  6. Типичные проблемы и решения:

    • Потеря связи: добавьте механизм повторной попытки соединения
    • Конфликты данных: реализуйте механизмы синхронизации
    • Зацикливание: добавьте таймауты и обработку исключительных ситуаций
    • Несогласованность действий: внедрите протокол подтверждения выполнения
  7. Инструменты для отладки:

    • Мониторинг состояния через последовательный порт
    • Анализаторы протоколов для беспроводной связи
    • Запись и воспроизведение последовательности команд
    • Симуляция поведения роботов перед тестированием на реальных устройствах

Критерии оценки программного обеспечения для взаимодействующих роботов:

Функциональность (0-5 баллов):

  • Выполнение всех требуемых функций отдельными роботами (0-2)
  • Успешная реализация взаимодействия между роботами (0-2)
  • Эффективность решения поставленной задачи (0-1)

Качество программного кода (0-5 баллов):

  • Модульность и структурированность кода (0-1)
  • Понятность и документированность (комментарии) (0-1)
  • Эффективность алгоритмов (0-1)
  • Обработка исключений и ошибок (0-1)
  • Оптимизация ресурсов (память, процессор) (0-1)

Коммуникация между роботами (0-5 баллов):

  • Надежность обмена данными (0-2)
  • Эффективность протокола коммуникации (0-1)
  • Обработка ошибок связи (0-1)
  • Синхронизация данных (0-1)

Алгоритмы координации (0-5 баллов):

  • Эффективность распределения задач между роботами (0-1)
  • Синхронизация действий во времени (0-1)
  • Пространственная координация (предотвращение столкновений) (0-1)
  • Оптимизация совместной работы (0-1)
  • Адаптация к изменяющимся условиям (0-1)

Тестирование и отладка (0-3 балла):

  • Полнота тестирования функций (0-1)
  • Выявление и устранение ошибок (0-1)
  • Стабильность работы системы (0-1)

Максимальная оценка: 23 балла Шкала перевода в оценку:

  • 20-23 балла - “5”
  • 16-19 баллов - “4”
  • 12-15 баллов - “3”
  • менее 12 баллов - “2”

Карта рефлексии “Программный отчет”:

 1Фамилия, имя: _________________________
 2Группа: _______
 3
 4Оценка программного обеспечения:
 5
 61. Что получилось реализовать в программном обеспечении?
 7_________________________________________________
 8_________________________________________________
 9_________________________________________________
10
112. Какие проблемы остались нерешенными?
12_________________________________________________
13_________________________________________________
14_________________________________________________
15
163. Какие улучшения можно внести в программы?
17_________________________________________________
18_________________________________________________
19_________________________________________________
20
214. Какие математические алгоритмы мы применили?
22_________________________________________________
23_________________________________________________
24_________________________________________________
25
265. Как мы реализовали коммуникацию между роботами?
27_________________________________________________
28_________________________________________________
29_________________________________________________
30
316. Мой личный вклад в программирование:
32_________________________________________________
33_________________________________________________
34_________________________________________________
35
36Самая сложная проблема, которую мне удалось решить:
37_________________________________________________
38_________________________________________________
39
40Степень моей удовлетворенности результатом (от 1 до 10): _______