Deviceの自作

Rust版のライブラリではAUTD3以外のDeviceを使用することができる.

NOTE: C++, C#, Python版のライブラリでは, この機能は提供されていない.

NOTE: 実際にはAUTD3以外のデバイスは存在しないので, Emulatorくらいでしか使用することはできない. (Simulatorは未対応.)

ここでは, 振動子の間隔を変えられるCustomDeviceを実際に定義してみることにする.

use autd3::driver::geometry::{Device, Transducer};
use autd3::prelude::*;
use autd3_emulator::Emulator;

struct CustomDevice {
    pitch: f32,
    num_x: usize,
    num_y: usize,
}

impl From<CustomDevice> for Device {
    fn from(dev: CustomDevice) -> Self {
        assert!(0 < dev.num_x * dev.num_y && dev.num_x * dev.num_y <= 256);
        Device::new(
            UnitQuaternion::identity(),
            itertools::iproduct!(0..dev.num_x, 0..dev.num_y)
                .map(|(x, y)| {
                    let x = x as f32 * dev.pitch;
                    let y = y as f32 * dev.pitch;
                    Transducer::new(Point3::new(x, y, 0.))
                })
                .collect(),
        )
    }
}

fn main() {
Emulator::new(
    [CustomDevice {
        pitch: 2.,
        num_x: 16,
        num_y: 16,
    }],
);
}

Deviceは以下の制約を満たす必要がある.

  • 振動子の数は最大で256個
  • 振動子はすべて同一方向を向いている (Device::newの第1引数がすべての振動子の回転を表す)