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Мы предполагаем, что нет трения, поверхность идеально ровная. В реальности трение замедляет робота и влияет на повороты.
В нашей модели скорость мгновенно меняется с изменением мощности. В реальности есть инерция - робот не может мгновенно разогнаться или остановиться.
Мы используем линейную зависимость скорости от мощности. В реальности зависимость может быть более сложной, особенно на высоких скоростях.
Для более реалистичной симуляции можно добавить:
Наша модель - хорошее начало для понимания основных принципов.