Engee 文档
Notebook

Dzhanibekov效应的建模

此示例将显示Dzhanibekov效应的模拟,即刚体围绕平均惯性轴的不稳定旋转。 该模型演示了围绕中间轴旋转过程中的小扰动如何导致空间中物体的周期性"翻转"。

![orig (1).gif](attachment:orig (1).gif)

当不对称刚体围绕具有中间惯性矩的轴旋转时,Dzhanibekov效应表现出来。 根据中间轴定理,这种旋转是不稳定的-最轻微的扰动导致物体的周期性"翻转"。

发生条件:i₁<i₂<i₃,其中i₂为相对于中轴的转动惯量。

初始扰动: .

模型图:

image.png

为了实现本例中的旋转模型,使用了Engee函数块,其中使用代码实现了自由旋转的欧拉方程。:

本节还描述了四元数的运动学。:

状态提供给块的输入 在块中计算的四元数和角速度的导数的积分积分与以下装置:

image.png

使用总线块,对信号进行编译以备将来使用。 从总线3,信号转到块,其中总线被转换成矢量,然后馈送到块的输入将四元数转换为旋转矩阵

定义加载和运行模型的函数:

In [ ]:
function start_model_engee()
    try
        engee.close("dzhanibekov_effect", force=true) # закрытие модели 
        catch err # в случае, если нет модели, которую нужно закрыть и engee.close() не выполняется, то будет выполнена её загрузка после catch
            m = engee.load("$(@__DIR__)/dzhanibekov_effect.engee") # загрузка модели
        end;

    try
        engee.run(m) # запуск модели
        catch err # в случае, если модель не загружена и engee.run() не выполняется, то будут выполнены две нижние строки после catch
            m = engee.load("$(@__DIR__)/dzhanibekov_effect.engee") # загрузка модели
            engee.run(m) # запуск модели
        end
end
Out[0]:
start_model_engee (generic function with 1 method)

运行模拟

In [ ]:
start_model_engee();

将数据输出到单独的变量:

In [ ]:
result = collect(simout["dzhanibekov_effect/Преобразование кватерниона
 в матрицу поворота.DCM"]);

将数据输出到单独的变量中进行分析和可视化:

In [ ]:
time_ = result[:,1]
R_hist = result[:,2];

定义函数以创建T形几何形状:

In [ ]:
function create_t_figure()
    vertical = [[0, 0], [-0.5, 0.5], [0, 0]]
    horizontal = [[-0.6, 0.6], [0.5, 0.5], [0, 0]]
    return (vertical, horizontal)
end
Out[0]:
create_t_figure (generic function with 1 method)

定义一个函数来创建身体运动的动画:

In [ ]:
using Printf
function create_djanibekov_animation_plots(R_hist, time_)
    gr()
    # Создаем T-образную фигуру
    t_figure = create_t_figure()
    vertical, horizontal = t_figure
    
    # Функция для преобразования точек с помощью матрицы вращения
    function rotate_points(points, R)
        x, y, z = points
        n = length(x)
        rotated = zeros(3, n)
        for i in 1:n
            rotated[:, i] = R * [x[i], y[i], z[i]]
        end
        return rotated[1, :], rotated[2, :], rotated[3, :]
    end
    
    # Создаем анимацию
    anim = @animate for i in 1:40:length(R_hist)
        R = R_hist[i]
        
        # Применяем вращение к фигуре
        v_rot = rotate_points(vertical, R)
        h_rot = rotate_points(horizontal, R)
        gr()
        # Создаем 3D график
        p = plot3d(
            v_rot..., 
            linewidth=3,
            linecolor=:red,
            label="",
            xlim=(-1, 1),
            ylim=(-1, 1),
            zlim=(-1, 1),
            title="Эффект Джанибекова (t = $(@sprintf("%.2f", time_[i])) с)",
            xlabel="X",
            ylabel="Y",
            zlabel="Z",
            aspect_ratio=:equal,
            camera=(30, 30)
        )
        
        plot3d!(
            h_rot...,
            linewidth=3,
            linecolor=:blue,
            label=""
        )
        
        # Добавляем сферу в центре
        scatter3d!([0], [0], [0], markersize=4, markercolor=:gray, label="")
    end
    
    # Сохраняем анимацию в GIF
    output_path = "djanibekov_effect_plots.gif"
    
    println("Анимация сохранена в файл: ", output_path)
    return gif(anim, output_path, fps=25)
end
Out[0]:
create_djanibekov_animation_plots (generic function with 1 method)

创建和可视化身体运动动画:

In [ ]:
anim = create_djanibekov_animation_plots(R_hist, time_)
Анимация сохранена в файл: djanibekov_effect_plots.gif
[ Info: Saved animation to /user/djanibekov_effect_plots.gif
Out[0]:
No description has been provided for this image
In [ ]:
w1 = collect(simout["dzhanibekov_effect/Интегрирование.ω₁"])
w2 = collect(simout["dzhanibekov_effect/Интегрирование.ω₂"])
w3 = collect(simout["dzhanibekov_effect/Интегрирование.ω₃"]);
In [ ]:
plotlyjs()
plot(w1[:, 1], w1[:, 2], label="Угловая скорость вокруг оси X", lw=2)
plot!(w2[:, 1], w2[:, 2], label="Угловая скорость вокруг оси Y", lw=2)
plot!(w3[:, 1], w3[:, 2], label="Угловая скорость вокруг оси Z", lw=2)
Out[0]:

翻转可以通过改变围绕Y轴的角速度的符号在图形上跟踪,这种情况每4秒发生一次。

结论:

在这个例子中,演示了Dzhanibekov效应的模型。 该模型可以修改并用于各种领域,用于指导任务,目标跟踪和机械手方向控制。