Engee — это российская инженерная платформа для разработки сложных технических систем с применением методологии модельно-ориентированного проектирования. Это единственная российская мультиязычная среда IDE для разработки инженерных скриптов, программ и приложений.
Ключевые возможности платформы:
Задача: Ознакомиться с веб-интерфейсом платформы Engee и ее основными возможностями
Цель: Понять структуру платформы, основные инструменты и принцип работы
Инструкция:
// Вычисление площади круга
radius = 5;
area = 3.14 * radius^2;
disp("Площадь круга: " + area); Цель задания: Получить практический доступ к платформе, изучить базовый функционал и создать первый проект
Engee — это российский аналог с облачной архитектурой, не требующий установки. Поддерживает мультиязычность (Julia, Python, MATLAB-синтаксис, Fortran, C/C++), имеет богатую библиотеку российских компонентов и интеграцию с отечественными процессорами (Байкал, Эльбрус).
Нет, Engee — это облачная платформа, которая работает прямо в браузере. Достаточно иметь доступ в интернет и зарегистрированный аккаунт.
Engee поддерживает современные браузеры: Chrome, Firefox, Edge, Safari. Рекомендуется использовать последние версии.
На этом уроке вы будете выполнять задания из документа "01 - Окно команд.pdf":
3*5m и присвойте ей результат: m = 3*5m = m + 1y = m/2k = 8 - 2;A = -2 (обратите внимание на регистр)meanAa = (a+A)/2Теперь перейдите к выполнению заданий из документа "02 - Редактор скриптов.pdf":
r = 3x = pi*r^2r = 0.5 и пересчитайте площадьy = 2*pi*r\alpha и нажмите Tabsin(pi/4)sqrt(-9+0im)Цель задания: Закрепить навыки работы с переменными, операторами и редактором скриптов
a = 12, b = 7, c = 3.5(a + b) * c / 2sqrt(a)abs(a - 15)Команда x = 5+1 покажет результат 6. Команда x = 5+1; выполнит вычисление, но не покажет результат.
В Julia a и A — разные переменные. Следите за регистром при создании и использовании переменных.
Если вы изменили переменную m, то y = m/2 не обновится автоматически. Нужно выполнить команду заново.
Сегодня изучаем блок "03 - Векторы и матрицы.pdf". Массивы - это коллекции чисел, которые позволяют работать с несколькими значениями одновременно. В моделировании робота массивы будут хранить:
x со значением 4: x = 4y с двумя элементами 7 и 9: y = [7 9]z с элементами 7 и 9 через точку с запятой: z = [7; 9]a с тремя числами: a = [3, 10, 5]b = [3 4 5; 6 7 8]c = [5 6 7; 8 9 10]Используем массивы для создания "цифрового двойника" - набора данных, описывающих поведение робота:
time_steps = [0, 1, 2, 3, 4, 5]speed = [0.0, 0.5, 1.0, 1.0, 0.5, 0.0]step_numbers = [1:6;]display()Оператор : создает диапазон чисел. Для преобразования в вектор нужно добавить точку с запятой внутри квадратных скобок.
1:10[1:10;]1:0.5:5[1:0.5:5;][3:2:13;]Цель: Научиться создавать и использовать массивы для хранения данных о роботе.
wheel_left из 6 элементов: [30, 35, 40, 40, 35, 30]wheel_right с такими же значениямиstep_numbers от 1 до 6 с помощью оператора :size()[1:5] создает массив из одного элемента - диапазона. [1:5;] создает вектор из 5 чисел. Точка с запятой внутри скобок "раскрывает" диапазон.
В Julia пробелы создают вектор-строку (матрицу 1×n), запятые или точки с запятой создают вектор-столбец. Для начала обучения это не критично, но важно знать.
В отличие от многих языков программирования, в Julia индексы массивов начинаются с 1, а не с 0. arr[1] - первый элемент.
Сегодня мы создали основу для модели робота:
time_steps - моменты времени симуляцииspeed - скорость робота в каждый моментwheel_left/right - мощность моторовНа следующих уроках мы научимся изменять эти массивы, анализировать их и визуализировать данные.
Изучаем блок "04 - Индексы и модификация массивов.pdf". Индексация - это механизм доступа к элементам массива по их положению (индексу). В Julia индексы начинаются с 1 (не с 0 как в некоторых языках).
Используем массив data из PDF (представлен ниже):
data[6, 3]data[end, 3]data[end-1, 3]data[:, 2]data[:, 3:4] или data[:, end-1:end]density = data[:, 2]density[6]density[2:5]density[[1, 3, 6]]Используем массивы из прошлого урока и учимся их изменять:
wheel_left[2] = wheel_left[2] + 5speed[end] = 0.2wheel_right[4] = 45first_three_speed = speed[1:3]even_steps = speed[2:2:end]wheel_left[end-1]speed[end-2:end]wheel_right[2:end]robot_data[1, 3] = 10robot_data[2, :] = [10, 20, 30]robot_data[:, 3] .= 100robot_data[:, 1] = robot_data[:, 2]robot_copy = copy(robot_data)Цель: Научиться извлекать и изменять элементы массивов для настройки модели робота.
wheel_left, wheel_right, step_numberswheel_left:
first_three_steps, содержащий только первые три элемента из wheel_lefteven_power, содержащий только элементы на четных позициях (2,4,6) из wheel_rightodd_power, содержащий только элементы на нечетных позициях (1,3,5)wheel_leftwheel_rightЕсли массив имеет 6 элементов, а вы пытаетесь обратиться к arr[7], получите ошибку. Всегда проверяйте размер массива: size(arr) или length(arr).
Для получения всех элементов кроме первого нужно arr[2:end], а не arr[2:] (это вызовет ошибку).
Для матриц нужны два индекса: matrix[строка, столбец]. matrix[1] вернет первый элемент при линейной индексации (по столбцам).
Сегодня мы научились:
Это позволяет нам "настраивать" робота, изменяя его параметры в нужные моменты времени.
Изучаем блок "05 - Операции с массивами.pdf". В Julia есть два типа операций с массивами:
.+, .-, .*, ./ - применяются к каждому элементу* - матричное умножениеx .+ 2 или x .+ 2x + y (обычный + работает для сложения массивов одинакового размера)x * 3 или x .* 3y / 2 или y ./ 2x .* ymaximum(x)minimum(x)mean(x)sum(x)round.(x)Применяем операции к данным нашего робота:
diff_power = wheel_right .- wheel_leftmaximum(abs.(diff_power))total_power = wheel_left .+ wheel_rightmean(total_power)mean(speed)maximum(speed)sum(speed .> 0.7)on_black = sensor_data .== 1sum(on_black)findall(on_black)normalized_speed = speed ./ maximum(speed)Цель: Научиться анализировать данные робота с помощью статистических функций и поэлементных операций.
wheel_left, wheel_right, speeddiff_power = wheel_right .- wheel_lefttotal_power = wheel_left .+ wheel_righttotal_powermean(abs.(diff_power))using Statistics).* умножает соответствующие элементы: [1,2] .* [3,4] = [3,8]. * пытается выполнить матричное умножение: [1,2] * [3,4] вызовет ошибку, так как размеры не подходят.
Для сложения/вычитания массивов одинакового размера точка не обязательна: + и - работают как поэлементные операции. Для умножения/деления точка обязательна.
При операциях массива со скаляром точка не нужна: arr + 5 и arr .+ 5 дают одинаковый результат.
Сегодня мы научились анализировать данные робота:
Это позволяет нам оценивать эффективность работы робота и находить проблемы в управлении.
Изучаем блок "07 - Построение графиков.pdf". Графики позволяют визуально анализировать данные. Основные функции:
plot(x, y) - график линииscatter(x, y) - точечный графикbar(x, y) - столбчатая диаграммаtitle!("Заголовок") - добавление заголовкаxlabel!("Ось X"), ylabel!("Ось Y") - подписи осейplot(x, y)title!("График синуса")xlabel!("X"), ylabel!("sin(X)")plot(x, y, color=:red) или plot(x, y, c=:red)plot(x, y, linestyle=:dash)plot(x, y, marker=:circle) или plot(x, y, m=:o)plot(x, y, markersize=10)plot(x, y, linealpha=0, marker=:circle):circle, :square, :xcross, :diamondplot(x, [y y2])plot!: plot(x, y); plot!(x, y2)plot(x, [y y2], color=[:red :blue])plot(x, [y y2], label=["sin" "cos"])Строим графики для анализа поведения робота:
plot(step_numbers, speed)marker=:circlesavefig("robot_speed.png")plot(step_numbers, [wheel_left wheel_right])label=["Левый мотор" "Правый мотор"]color=[:blue :red]linestyle=[:solid :dash]plot(layout=(2,1))plot! для добавления графиков в нужные областиhistogram(speed)histogram(speed, color=:green)plot(..., size=(800, 400))plot(..., grid=true)plot(..., linewidth=3)savefig(..., dpi=300)Цель: Научиться создавать информативные графики для анализа поведения робота.
step_numbers, speed, wheel_left, wheel_right, total_power (из ДЗ 18)savefig("motor_power.png")using Plots)Убедитесь, что подключили библиотеку: using Plots. В Engee графики отображаются под ячейкой с кодом.
Для plot(x, y) массивы x и y должны быть одинаковой длины. Проверьте: length(x) == length(y).
Функция savefig() сохраняет последний построенный график. Убедитесь, что график построен перед вызовом savefig.
Визуализация позволяет:
Графики - мощный инструмент анализа данных робота.
Изучаем блок "06 - Вызов функций.pdf". Функции в Julia могут возвращать одно или несколько значений. Важные функции для анализа данных:
size(arr) - размеры массива (для матриц возвращает (строки, столбцы))length(arr) - общее количество элементовfindmax(arr) - максимальное значение и его индексfindmin(arr) - минимальное значение и его индексfindall(condition) - все индексы, где условие истинноargmax(arr) - индекс максимального элементаargmin(arr) - индекс минимального элементаsize(data_matrix)length(data_vector)(rows, cols) = size(data_matrix)dr (rows) и dc (cols) с размерамиmaximum(data_vector)(max_val, max_idx) = findmax(data_vector)findmin(data_vector)argmax(data_vector)argmin(data_vector)findall(temperatures .> 20)maximum(temperatures[temperatures .> 20])sum(temperatures .> 20)Применяем функции для глубокого анализа данных робота:
size(speed)(max_speed, speed_step) = findmax(speed)minimum(speed)~ для игнорирования ненужных возвращаемых значений(~, idx) = findmax(speed) - получаем только индексanalyze_robot(speed, power_left, power_right)Цель: Научиться использовать функции для комплексного анализа данных робота.
speed, wheel_left, wheel_right, diff_power, total_powersize()num_steps (количество шагов) и num_params (количество параметров)abs.(diff_power))findmax(speed) только индекс максимальной скорости (используйте ~ для игнорирования значения)(max_speed, min_speed, avg_speed) = (maximum(speed), minimum(speed), mean(speed))get_robot_stats(), которая возвращает словарь со статистикамиfindmax, findmin, argmax, argmin~ для игнорирования значенийmaximum(arr) возвращает только значение. findmax(arr) возвращает кортеж (значение, индекс). Для получения индекса используйте findmax.
Для вектора size(arr) вернет кортеж из одного элемента (n,). Для матрицы (rows, cols). Используйте length(arr) для общего количества элементов.
Если функция возвращает несколько значений, но вам нужно не все, используйте ~: (~, idx) = findmax(arr) - получаем только индекс.
Функции анализа позволяют:
Это основа для создания интеллектуальной системы анализа данных робота.
Изучаем блок "09 - Бинарные массивы.pdf". Бинарные массивы содержат только значения true (1) и false (0). Они создаются с помощью операторов сравнения:
hot_days = temperatures .> 20cold_days = temperatures .< 18comfortable = (temperatures .>= 18) .& (temperatures .<= 22)temperatures .== 22temperatures .!= 20temperatures[high_temp_mask]findall(high_temp_mask)sum(high_temp_mask)temperatures[high_temp_mask] .= 30(temperatures .> 20) .& (temperatures .< 25)(temperatures .< 18) .| (temperatures .> 22).(!(temperatures .> 20)) или temperatures .<= 20Создаем модель датчика следования за линией. В реальном роботе ИК-датчик возвращает 1, когда видит черную линию, и 0, когда видит белое поле.
on_black = sensor_readings .== 1findall(on_black)sum(on_black)speed[on_black]speed[.!on_black]mean(speed[on_black]) vs mean(speed[.!on_black])speed[problem_mask] .= 0.3Цель: Научиться работать с бинарными массивами для моделирования датчиков робота.
sensor из 10 элементов, моделирующий показания датчика линии:
[0, 0, 1, 1, 1, 0, 0, 1, 1, 0]on_black, которая равна true там, где датчик видит черную линиюon_white для белого поляon_black, определите на каких шагах робот был на черной линииspeed и проанализируйте скорость на черной и белой поверхности.==, .>, .<.& (И), .| (ИЛИ)sum() для подсчета true значенийfindall() для поиска индексовДля поэлементного сравнения массивов нужна точка: arr .> 5. Без точки arr > 5 попытается сравнить весь массив с числом, что не имеет смысла.
Бинарные массивы в Julia обычно имеют тип BitArray, который эффективно хранит true/false значения (1 бит на элемент вместо 8 байт).
arr[mask] возвращает элементы, где mask=true. arr[findall(mask)] делает то же самое, но через промежуточный шаг с индексами.
Бинарные массивы позволяют:
Это основа для создания алгоритмов управления роботом.
Изучаем первую часть блока "10 - Программирование.pdf". Условные операторы позволяют выполнять код только при определенных условиях. Структура:
if x == 5 println("x равно 5") endif y > x println("y больше x") endСоздаем простейший алгоритм следования за линией на основе показаний датчика:
turn_power (мощность поворота)turn_power = 10turn_power = -5Цель: Научиться создавать алгоритмы принятия решений для управления роботом.
sensor_value - текущее показание датчика (0 или 1)base_power = 30 - базовая мощность моторовcurrent_speed - текущая скорость роботаif-elseif-else для реализацииif внутри if)time_off_track и логику ее обработкиif, if-else, if-elseif-else= - оператор присваивания. == - оператор сравнения. В условиях нужно использовать ==: if x == 5.
Каждый if должен заканчиваться end. Если забыть end, Julia будет ждать продолжения и выдаст ошибку.
При комбинировании условий используйте скобки для ясности: (x > 5) && (y < 10) вместо x > 5 && y < 10.
Условные операторы - основа интеллекта робота:
Без условий робот был бы просто набором заранее заданных команд.
Изучаем вторую часть блока "10 - Программирование.pdf". Циклы позволяют выполнять один и тот же код много раз. В Julia основной цикл - for:
for i in 1:10 println(i) endfor x in 1:5 println(x^2) endfor i in 2:2:10 println(i) endfor i in 5:-1:1 println(i) endИспользуем циклы для моделирования движения робота шаг за шагом:
speed = mean_power / 100Цель: Научиться использовать циклы для автоматизации расчетов и создания симуляторов.
sensor = [0, 0, 1, 1, 0, 0]turn_history - история значений поворотаleft_history - история мощности левого мотораright_history - история мощности правого мотораfor, который проходит по всем элементам массива sensorturn_powerspeed_historyfor для итерации по массивуДля доступа к индексу и значению используйте: for (i, val) in enumerate(arr) или for i in 1:length(arr) и тогда arr[i].
Массивы можно изменять внутри цикла: arr[i] = новое_значение. Убедитесь, что индекс в допустимом диапазоне.
Для досрочного выхода из цикла используйте break. Для перехода к следующей итерации - continue.
Циклы позволяют:
Цикл - это "двигатель" симуляции, который заставляет время идти и робота двигаться.
Чтобы симуляция была реалистичной, нужно связать мощность моторов с движением робота. Используем упрощенную модель:
x_positions = zeros(time_steps)x = x + v * dtv = speeds[i]x_positions и y_positionsОбъединяем все компоненты: датчики, алгоритм управления, мощность моторов и физику движения:
sensor = sensor_data[i]left = base_power + turn_power, right = base_power - turn_powercurrent_speed = (left + right) / 200 (упрощенная формула)x = x + current_speed * dt (пока только по X)v_new = v_old + a * dt, где a - ускорениеЦель: Научиться рассчитывать траекторию движения робота на основе мощности моторов.
speed = (left_power[i] + right_power[i]) / 100x = 0.0dt = 1.0x = x + speed * dtx_positionsМы предполагаем, что нет трения, поверхность идеально ровная. В реальности трение замедляет робота и влияет на повороты.
В нашей модели скорость мгновенно меняется с изменением мощности. В реальности есть инерция - робот не может мгновенно разогнаться или остановиться.
Мы используем линейную зависимость скорости от мощности. В реальности зависимость может быть более сложной, особенно на высоких скоростях.
Для более реалистичной симуляции можно добавить:
Наша модель - хорошее начало для понимания основных принципов.
Исследуем: Как изменение базовой мощности (base_power) влияет на скорость, пройденное расстояние и устойчивость робота при следовании по линии.
Полный код симулятора для этого занятия. Запустите в Engee или любой среде Julia.
⬇️ Скачать скрипт (.jl)Файл: robot_simulation_lessonXX.jl
Цель: Самостоятельно провести эксперимент с более широким диапазоном параметров и найти оптимальное значение для конкретной трассы.
Из-за ограничений: при высокой скорости робот может "проскакивать" повороты и терять линию, что снижает эффективный путь.
Энергия пропорциональна сумме мощностей моторов за всё время. Чем выше мощность, тем быстрее разряжается батарея.
Исследуем: Как изменение силы поворота (turn_left и turn_right) влияет на способность робота удерживаться на линии и плавность движения.
Полный код симулятора для этого занятия. Запустите в Engee или любой среде Julia.
⬇️ Скачать скрипт (.jl)Файл: robot_simulation_lessonXX.jl
Цель: Проверить, насколько устойчив робот при разных настройках поворота, если добавить случайные помехи в показания датчика.
Это колебания робота относительно линии. При слишком сильном повороте робот постоянно "перелетает" линию и вынужден постоянно корректировать траекторию.
Можно добавить случайные ошибки датчика и посчитать, сколько симуляций робот доезжает до конца. Чем выше процент, тем устойчивее алгоритм.
Исследуем: Как совместно влияют базовая мощность и сила поворота на движение робота. Найдём глобально оптимальную комбинацию параметров для заданной трассы.
Полный код симулятора для этого занятия. Запустите в Engee или любой среде Julia.
⬇️ Скачать скрипт (.jl)Файл: robot_simulation_lessonXX.jl
Цель: Проверить, насколько универсальны найденные параметры, и подобрать параметры для других конфигураций трассы.
Это поиск компромисса между несколькими целями (максимизировать путь, минимизировать энергию, максимизировать плавность). В реальности часто нет одного "лучшего" решения.
Да! Можно использовать генетические алгоритмы, случайный поиск или байесовскую оптимизацию для больших пространств параметров.
Длительность: 40 минут
Формат: 5 задач с кодом на Julia в среде Engee
Темы: Массивы, индексация, операции, графики, функции, бинарные массивы, условия, циклы
Максимальный балл: 25 (по 5 баллов за задачу)
Техническая система: Чайник с водой. Нужно смоделировать, как меняется температура воды при нагревании.
Что здесь применяется из курса?
zeros(length(time_points))for для пошагового расчётаif-else для проверки достижения кипенияplot() и горизонтальной линии hline!()savefig()Техническая система: Мяч, падающий с высоты с учётом отскоков.
Что здесь применяется из курса?
for для симуляции во времениif для обнаружения столкновенияheight .< h0 .&& height .> 0findall() для поиска индексовmaximum() для нахождения максимумаplot()Закон охлаждения Ньютона: скорость охлаждения пропорциональна разнице температур. dT/dt = -k * (T - T_room)
k = 0.05 1/секНапряжение на конденсаторе при зарядке: U(t) = U_max * (1 - e^(-t/RC))
t = 0:0.1:10U(t)Цель: Применить навыки моделирования к новой технической системе.
θ'' = -(g/L) * sin(θ) (используйте приближение Эйлера)В каждой задаче нужно не только написать код, но и ответить на вопрос (текстом в комментарии или отдельной ячейкой):
Дан массив: data = [10, 20, 30, 40, 50, 60]
end?Два массива: a = [1, 2, 3, 4], b = [5, 6, 7, 8]
.* от *?Массив: values = [5, 12, 8, 15, 3, 20, 7]
values[mask]?Напишите цикл, который вычисляет сумму чисел от 1 до 100
forПостройте график функции y = sin(x) для x = 0:0.1:2π
Инструкция: Решите 5 задач. В каждой задаче напишите код и ответьте на вопрос по интерпретации. Используйте среду Engee.
Дан массив результатов измерений расстояния (в метрах) от датчика до препятствия:
Дан массив скоростей ветра (м/с) за 12 часов:
.*, а не просто *?Дан массив показаний датчика качества воздуха (0 - норма, 1 - превышение):
sum(air_quality .== 1)?Напишите симуляцию роста популяции бактерий. Каждый час популяция увеличивается на 20%.
Дан массив дневных температур за 30 дней. Выполните полный анализ:
plot, findmax, mean, sum, findallТемы: Массивы, индексация, операции, графики, функции, бинарные массивы, условия, циклы
Формат: 5 задач с кодом + вопросы на интерпретацию
Длительность: 40 минут
Место проведения: Среда Engee
ФИО: _______________________________ Группа: _____
Файл: test_template.jl — откройте в Engee и заполните пропуски
Дан массив результатов измерения температуры (°C) каждый час в течение 12 часов:
Дан массив расстояний (в метрах), пройденных роботом за каждую секунду:
Дан массив показаний датчика движения (1 - движение, 0 - покой):
Смоделируйте заполнение бассейна водой. Каждую минуту уровень воды поднимается на 2 см. Начальный уровень: 0 см. Время симуляции: 30 минут.
Дан массив ежедневных продаж (в тысячах рублей) за 14 дней:
📌 Указание: Скопируйте код из скачанного файла в Engee, заполните все пропуски (________) и выполните ячейки.
После выполнения запустите ячейку с проверкой для автоматического подсчёта баллов.