Dzhanibekov效应的建模
此示例将显示Dzhanibekov效应的模拟,即刚体围绕平均惯性轴的不稳定旋转。 该模型演示了围绕中间轴旋转过程中的小扰动如何导致空间中物体的周期性"翻转"。
当不对称刚体围绕具有中间惯性矩的轴旋转时,Dzhanibekov效应表现出来。 根据中间轴定理,这种旋转是不稳定的-最轻微的扰动导致物体的周期性"翻转"。
发生条件:i₁<i₂<i₃,其中i₂为相对于中轴的转动惯量。
初始扰动: .
模型图:
为了实现本例中的旋转模型,使用了Engee函数块,其中使用代码实现了自由旋转的欧拉方程。:
本节还描述了四元数的运动学。:
状态提供给块的输入 在块中计算的四元数和角速度的导数的积分积分与以下装置:
使用总线块,对信号进行编译以备将来使用。 从总线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]:
运行模拟
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]:
定义一个函数来创建身体运动的动画:
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="Dzhanibekov效应(t=$(@sprintf("%.2f",time_[i]))c)",
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]:
创建和可视化身体运动动画:
In [ ]:
anim = create_djanibekov_animation_plots(R_hist, time_)
Out[0]:
In [ ]:
w1 = collect(simout["dzhanibekov_effect/集成。w₁"])
w2 = collect(simout["dzhanibekov_effect/集成。w₂"])
w3 = collect(simout["dzhanibekov_effect/集成。w₃"]);
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效应的模型。 该模型可以修改并用于各种领域,用于指导任务,目标跟踪和机械手方向控制。
