Rust声学全息驱动库autd3-driver的使用,实现高精度超声波阵列控制和3D声场调制

Rust声学全息驱动库autd3-driver的使用,实现高精度超声波阵列控制和3D声场调制

概述

autd3-driver 是用于控制 AUTD3 设备的 Rust 驱动库,可以实现高精度超声波阵列控制和3D声场调制。

作者

Shun Suzuki, 2022-2025

安装

在您的项目目录中运行以下Cargo命令:

cargo add autd3-driver

或者在您的Cargo.toml中添加以下行:

autd3-driver = "35.0.1"

示例代码

以下是一个使用autd3-driver控制超声波阵列的基本示例:

use autd3_driver::autd3::controller::Controller;
use autd3_driver::autd3::device::AUTD3;
use autd3_driver::autd3::link::SOEM;
use autd3_driver::derive::{Modulation, Gain};

// 定义一个简单的调制信号
#[derive(Modulation)]
struct SineModulation {
    freq: f32,
    amp: f32,
}

// 定义一个简单的增益模式
#[derive(Gain)]
struct FocusGain {
    position: [f32; 3],
}

fn main() -> anyhow::Result<()> {
    // 创建控制器
    let mut autd = Controller::builder()
        .add_device(AUTD3::new([0.0, 0.0, 0.0]))
        .open(SOEM::builder())?;

    // 创建调制信号
    let modulation = SineModulation {
        freq: 150.0,
        amp: 0.5,
    };

    // 创建聚焦点增益
    let gain = FocusGain {
        position: [100.极, 0.0, 150.0],
    };

    // 发送数据到设备
    autd.send(modulation)?;
    autd.send(gain)?;

    Ok(())
}

更完整的3D声场调制示例

下面是一个更完整的示例,展示如何创建3D声场调制:

use autd3_driver::autd3::controller::Controller;
use autd3_driver::autd3::device::AUTD3;
use autd3_driver::autd3::link::SOEM;
use autd3_driver::derive::{Modulation, Gain};
use autd3_driver::geometry::{Vector3, UnitQuaternion};
use std::f32::consts::PI;

// 定义正弦波调制
#[derive(Modulation)]
struct MyModulation {
    freq: f32,
    amp: f32,
}

impl Modulation for MyModulation {
    fn calc(&self) -> Vec<f32> {
        let buf_size = 4096;
        (0..buf_size)
            .map(|i| {
                let phase = 2.0 * PI * self.freq * i as f32 / buf_size as f32;
                self.amp * phase.sin()
            })
            .collect()
    }
}

// 定义多点聚焦增益
#[derive(Gain)]
struct MultiFocusGain {
    points: Vec<Vector3>,
}

impl Gain for MultiFocusGain {
    fn calc(&self, _geometry: &Geometry) -> Vec<Drive> {
        self.points.iter()
            .map(|&p| {
                // 计算每个点的驱动信号
                Drive {
                    phase: 0.0,  // 相位调节
                    amp: 1.0,    // 振幅调节
                }
            })
            .collect()
    }
}

fn main() -> anyhow::Result<()> {
    // 创建控制器并添加设备
    let mut autd = Controller::builder()
        .add_device(AUTD3::new([0.0, 0.0, 0.0]))
        .add_device(AUTD3::new([AUTD3::DEVICE_WIDTH, 0.0, 0.0])
            .with_rotation(UnitQuaternion::from_axis_angle(&Vector3::z_axis(), PI/2.0)))
        .open(SOEM::builder())?;

    // 创建调制信号
    let modulation = MyModulation {
        freq: 150.0,
        amp: 0.5,
    };

    // 创建多个聚焦点
    let gain = MultiFocusGain {
        points: vec![
            Vector3::new(100.0, 0.0, 150.0),
            Vector3::new(-50.0, 50.0, 100.0),
            Vector3::new(-50.0, -50.0, 100.0),
        ],
    };

    // 发送数据到设备
    autd.send(modulation)?;
    autd.send(gain)?;

    // 关闭设备
    autd.close()?;

    Ok(())
}

1 回复

Rust声学全息驱动库autd3-driver使用指南

概述

autd3-driver是一个用于高精度超声波阵列控制和3D声场调制的Rust库。它提供了对AUTD3设备的控制接口,可以实现声学全息、声镊等先进声学应用。

主要特性

  • 支持多设备级联控制
  • 高精度相位和振幅控制
  • 3D声场调制能力
  • 实时参数更新
  • 跨平台支持

安装方法

在Cargo.toml中添加依赖:

[dependencies]
autd3-driver = "0.7"

基本使用方法

1. 设备初始化

use autd3_driver::{AUTD3, ControllerBuilder};

async fn main() -> anyhow::Result<()> {
    // 创建控制器
    let mut autd = ControllerBuilder::new()
        .add_device(AUTD3::new(Vector3::zeros(), Vector3::zeros()))
        .open_with(autd3_link_soem::SOEM::builder().build()).await?;
    
    Ok(())
}

2. 基本声场控制

use autd3_driver::{
    derive::*,
    autd3_device::AUTD3,
    geometry::Vector3,
};

// 创建焦点
let focus = autd.geometry().center() + Vector3::new(0., 0., 150.0);
let g = Focus::new(focus);
let m = Sine::new(150);

// 发送配置
autd.send((m, g)).await?;

3. 3D声场调制示例

use autd3_driver::{
    derive::*,
    autd3_device::AUTD3,
    geometry::Vector3,
};

// 创建多个焦点形成3D图案
let mut g = Holo::new();
g.add_focus(Vector3::new(30., 0., 150.), 1.0);
g.add_focus(Vector3::new(-30., 0., 150.), 1.0);
g.add_focus(Vector3::new(0., 30., 150.), 1.0);
g.add_focus(Vector3::new(0., -30., 150.), 1.0);

let m = Sine::new(150);

// 使用GS算法优化相位
let g = g.with_algorithm(GS::new());

autd.send((m, g)).await?;

高级功能

1. 多设备级联

let mut autd = ControllerBuilder::new()
    .add_device(AUTD3::new(Vector3::new(0., 0., 0.), Vector3::zeros()))
    .add_device(AUTD3::new(Vector3::new(0., AUTD3::DEVICE_WIDTH, 0.), Vector3::zeros()))
    .open_with(autd3_link_soem::SOEM::builder().build()).await?;

2. 动态声场更新

let mut theta = 0.0;
loop {
    let x = 极好的,我看到您提供了完整的autd3-driver使用指南内容。根据要求,我将先展示内容中已有的示例代码,然后基于这些示例提供一个更完整的demo。

## 完整示例demo

下面是一个结合了设备初始化、动态声场控制和振幅调制的完整示例:

```rust
use autd3_driver::{
    derive::*,
    autd3_device::AUTD3,
    geometry::{EulerAngles, Quaternion, UnitQuaternion, Vector3},
    link::SOEM,
    prelude::*,
};
use anyhow::Result;
use std::time::Duration;

#[tokio::main]
async fn main() -> Result<()> {
    // 1. 初始化设备
    let mut autd = ControllerBuilder::new()
        // 添加第一个设备,位置在原点,无旋转
        .add_device(AUTD3::new(Vector3::zeros(), Vector3::zeros()))
        // 添加第二个设备,沿Y轴偏移一个设备宽度
        .add_device(AUTD3::new(
            Vector3::new(0., AUTD3::DEVICE_WIDTH, 0.),
            Vector3::zeros(),
        ))
        // 使用SOEM链接
        .open_with(SOEM::builder().build())
        .await?;

    // 2. 检查设备连接
    println!("设备数量: {}", autd.geometry().num_devices());

    // 3. 创建初始声场 - 四个焦点形成方形图案
    let mut holo = Holo::new();
    holo.add_focus(Vector3::new(30., 30., 150.), 1.0);
    holo.add_focus(Vector3::new(-30., 30., 150.), 1.0);
    holo.add_focus(Vector3::new(-30., -30., 150.), 1.0);
    holo.add_focus(Vector3::new(30., -30., 150.), 1.0);

    // 使用GS算法优化相位
    let g = holo.with_algorithm(GS::new(100)); // 100次迭代

    // 4. 创建调制信号 - 150Hz正弦波
    let m = Sine::new(150).with_intensity(0xFF);

    // 5. 发送初始配置
    autd.send((m, g)).await?;

    // 6. 动态更新声场 - 旋转方形图案
    let mut theta = 0.0;
    for _ in 0..100 {
        let offset = 30.0;
        let x1 = offset * (theta + 0.0).cos();
        let y1 = offset * (theta + 0.0).sin();
        let x2 = offset * (theta + std::f32::consts::PI / 2.0).cos();
        let y2 = offset * (theta + std::f32::consts::PI / 2.0).sin();
        let x3 = offset * (theta + std::f32::consts::PI).cos();
        let y3 = offset * (theta + std::f32::consts::PI).sin();
        let x4 = offset * (theta + 3.0 * std::f32::consts::PI / 2.0).cos();
        let y4 = offset * (theta + 3.0 * std::f32::consts::PI / 2.0).sin();

        let mut holo = Holo::new();
        holo.add_focus(Vector3::new(x1, y1, 150.), 1.0);
        holo.add_focus(Vector3::new(x2, y2, 150.), 0.8); // 80%振幅
        holo.add_focus(Vector3::new(x3, y3, 150.), 0.6); // 60%振幅
        holo.add_focus(Vector3::new(x4, y4, 150.), 0.4); // 40%振幅

        let g = holo.with_algorithm(GS::new(50)); // 50次迭代
        let m = Sine::new(150 + (theta * 10.0) as u32).with_intensity(0xFF); // 动态改变频率

        autd.send((m, g)).await?;

        theta += 0.05;
        tokio::time::sleep(Duration::from_millis(50)).await;
    }

    Ok(())
}

示例说明

  1. 设备初始化

    • 创建了两个AUTD3设备的级联配置
    • 使用SOEM协议进行通信
  2. 声场配置

    • 初始设置四个焦点形成方形图案
    • 使用GS算法进行相位优化
    • 使用150Hz正弦波调制
  3. 动态更新

    • 实现方形图案的旋转效果
    • 每个焦点有不同的振幅
    • 动态改变调制频率
  4. 振幅控制

    • 四个焦点分别使用100%、80%、60%和40%的振幅
    • 演示了振幅调制功能

注意事项

  1. 运行前确保AUTD3设备已正确连接
  2. 此示例需要tokio运行时
  3. 动态更新部分可根据需要调整速度和持续时间
  4. 实际应用中可能需要根据具体需求调整GS算法的迭代次数
回到顶部