9 个版本 (4 个主要版本)

4.0.0 2024 年 3 月 13 日
3.0.1 2024 年 2 月 1 日
3.0.0 2023 年 9 月 15 日
2.0.0 2023 年 8 月 28 日
0.1.1 2023 年 2 月 3 日

#9 in #gmt

Download history 13/week @ 2024-05-20 9/week @ 2024-06-03 13/week @ 2024-06-10 5/week @ 2024-06-17 10/week @ 2024-06-24 10/week @ 2024-07-01 9/week @ 2024-07-15 36/week @ 2024-07-22

57 每月下载
用于 4 crates

MIT 许可证

755KB
10K SLoC

gmt_dos-clients_mount

Crates.io Documentation

GMT 安装控制系统客户端

有一些安装控制器和驱动模型可供选择。模型选择通过 MOUNT_MODEL 环境变量设置。可能的 MOUNT_MODEL 值有

  • MOUNT_FDR_1kHz: 控制器和驱动程序的 FDR 版本,采样频率为 1kHz
  • MOUNT_PDR_8kHz: 控制器和驱动程序的 PDR 版本,采样频率为 8kHz
  • MOUNT_FDR_1kHz-az17Hz: 控制器和驱动程序的 PDR 版本,采样频率为 8kHz,控制器中有一个 17Hz 的陷波滤波器

lib.rs:

GMT 安装控制模型

GMT 安装控制系统的 gmt_dos-actors 客户端。

示例

将安装的仰角轴命令到 1 弧秒偏移。

// Dependencies:
//  * tokio
//  * gmt_dos_actors
//  * gmt_dos_clients
//  * gmt_dos_clients_io
//  * gmt_dos_clients_arrow
//  * gmt_dos_clients_fem
//  * gmt-fem
//  * gmt_dos_clients_mount
//  * gmt-lom
//  * skyangle
// Environment variables:
//  * FEM_REPO
//  * LOM

use gmt_dos_actors::actorscript;
use gmt_dos_clients::{Signal, Signals};
use gmt_dos_clients_fem::{fem_io::actors_outputs::*, DiscreteModalSolver, ExponentialMatrix};
use gmt_dos_clients_io::{
gmt_m1::M1RigidBodyMotions,
gmt_m2::M2RigidBodyMotions,
mount::{MountEncoders, MountSetPoint, MountTorques},
};
use gmt_dos_clients_mount::Mount;
use gmt_fem::FEM;
use gmt_lom::{OpticalMetrics, LOM};
use skyangle::Conversion;
use serde::{Deserialize, Serialize};
use gmt_mount_ctrl_controller::MountController;
use gmt_mount_ctrl_driver::MountDriver;

let sim_sampling_frequency = 1000; // Hz
let sim_duration = 20_usize; // second
let n_step = sim_sampling_frequency * sim_duration;
// FEM MODEL
let state_space = {
let fem = FEM::from_env()?;
println!("{fem}");
DiscreteModalSolver::<ExponentialMatrix>::from_fem(fem)
.sampling(sim_sampling_frequency as f64)
.proportional_damping(2. / 100.)
.including_mount()
.outs::<OSSM1Lcl>()
.outs::<MCM2Lcl6D>()
.use_static_gain_compensation()
.build()?
};
println!("{state_space}");
// SET POINT
let setpoint = Signals::new(3, n_step).channel(1, Signal::Constant(1f64.from_arcsec()));
// MOUNT CONTROL
let mount = Mount::new();
actorscript! {
#[model(state = completed)]
1: setpoint[MountSetPoint]
-> mount[MountTorques]
-> state_space[MountEncoders]!
-> mount
1: state_space[M1RigidBodyMotions]$
1: state_space[M2RigidBodyMotions]$
}
// Linear optical sensitivities to derive segment tip and tilt
let lom = LOM::builder()
.rigid_body_motions_record(
(*logging_1.lock().await).record()?,
Some("M1RigidBodyMotions"),
Some("M2RigidBodyMotions"),
)?
.build()?;
let segment_tiptilt = lom.segment_tiptilt();
let stt = segment_tiptilt.items().last().unwrap();
println!("Segment TT: {:.3?}mas", stt.to_mas());

依赖项

~66MB
~1M SLoC