Rust声学全息控制库autd3-gain-holo的使用,实现高精度声场调制与波束成形

Rust声学全息控制库autd3-gain-holo的使用,实现高精度声场调制与波束成形

autd3-gain-holo简介

autd3-gain-holo是一个Rust库,提供Holo增益功能,可以生成多个聚焦点。该库由Shun Suzuki在2022-2025年间开发。

安装

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

cargo add autd3-gain-holo

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

autd3-gain-holo = "35.0.1"

使用示例

下面是一个使用autd3-gain-holo实现声场调制和波束成形的完整示例:

use autd3::prelude::*;
use autd3_gain_holo::*;

// 创建控制器
let mut autd = Controller::builder()
    .add_device(AUTD3::new(Vector3::zeros(), Vector3::zeros()))
    .open_with(autd3_link_twincat::TwinCAT::builder()).unwrap();

// 定义聚焦点位置和振幅
let focus = Vector3::new(0., 0., 150.0);
let amp = 1.0;

// 创建Holo增益
let g = GSPAT::new()
    .add_focus(focus, amp)
    .with_alpha(1.0)
    .with_repeat(100);

// 发送配置到设备
autd.send(g).unwrap();

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

完整示例代码

下面是一个更完整的示例,展示如何使用不同算法实现多点聚焦:

use autd3::prelude::*;
use autd3_gain_holo::*;
use nalgebra::Vector3;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建控制器并添加设备
    let mut autd = Controller::builder()
        .add_device(AUTD3::new(Vector3::zeros(), Vector3::zeros()))
        .open_with(autd3_link_twincat::TwinCAT::builder())?;

    // 定义多个聚焦点位置和振幅
    let foci = vec![
        (Vector3::new(30., 0., 150.), 1.0),  // 第一个聚焦点,x=30mm,z=150mm
        (Vector3::new(-30., 0., 150.), 0.8), // 第二个聚焦点,x=-30mm,z=150mm
        (Vector3::new(0., 30., 150.), 0.6),  // 第三个聚焦点,y=30mm,z=150mm
    ];

    // 使用GSPAT算法创建Holo增益
    let mut g = GSPAT::new();
    for (focus, amp) in foci {
        g = g.add_focus(focus, amp);
    }
    let g = g.with_alpha(1e-3).with_repeat(100);

    // 或者使用LM算法
    // let mut g = LM::new(1e-1);
    // for (focus, amp) in foci {
    //     g = g.add_focus(focus, amp);
    // }
    // let g = g.with_eps1(1e-3).with_eps2(1e-3).with_tau(1e-3).with_kmax(5);

    // 发送配置到设备
    autd.send(g)?;

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

    Ok(())
}

代码说明

  1. 创建控制器并添加设备:

    • 使用Controller::builder()创建控制器
    • 添加AUTD3设备
    • 使用TwinCAT连接打开控制器
  2. 定义多个聚焦点:

    • 设置三个不同位置的聚焦点
    • 每个聚焦点有不同的振幅
  3. 创建Holo增益:

    • 示例展示了GSPAT和LM两种算法的使用
    • 可以添加多个聚焦点
    • 可以调整算法参数(alpha、eps1、eps2等)
  4. 发送配置并关闭设备

更多功能

该库支持的主要算法及其特点:

  1. GSPAT算法:

    • 通过.with_alpha()设置正则化参数
    • 通过.with_repeat()设置迭代次数
    • 适合大多数标准场景
  2. LM算法:

    • 通过.with_eps1().with_eps2()设置收敛阈值
    • 通过.with_tau()设置阻尼参数
    • 通过.with_kmax()设置最大迭代次数
    • 适合需要更精确控制的场景
  3. Naive算法:

    • 最简单的实现
    • 计算速度快但精度较低
    • 适合快速原型开发
  4. SDP算法:

    • 使用半正定规划
    • 计算量大但精度高
    • 适合对精度要求极高的场景

1 回复

Rust声学全息控制库autd3-gain-holo使用指南

根据您提供的内容,我将整理出完整的示例demo。以下是内容中提供的完整示例:

use autd3::prelude::*;
use autd3_gain_holo::{GSPAT, NalgebraBackend, Pa};
use nalgebra::Vector3;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 创建AUTD3设备
    let mut autd = Controller::builder()
        .add_device(AUTD3::new(Vector3::zeros()))
        .open_with(autd3::link::Nop::builder())?;

    // 创建全息增益
    let backend = NalgebraBackend::new();
    let g = GSPAT::new(backend)
        .add_focus(Vector3::new(0., 0., 150. * mm), Pa::new(1.))
        .add_focus(Vector3::new(20. * mm, 0., 150. * mm), Pa::new(0.5)));

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

    Ok(())
}

以下是一个更完整的示例demo,包含了设备初始化、多焦点配置和不同算法的使用:

use autd3::prelude::*;
use autd3_gain_holo::{GSPAT, LM, SDP, Naive, Pa, NalgebraBackend, EmissionConstraint};
use nalgebra::Vector3;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 1. 初始化AUTD3设备
    let mut autd = Controller::builder()
        .add_device(AUTD3::new(Vector3::new(0., 0., 0.)))
        .add_device(AUTD3::new(Vector3::new(0., 0., AUTD3::DEVICE_WIDTH)))
        .open_with(autd3::link::Nop::builder())?;

    // 2. 创建后端
    let backend = NalgebraBackend::new();

    // 3. 使用GSPAT算法创建多个焦点
    let points = vec![
        Vector3::new(0., 0., 150. * mm),
        Vector3::new(20. * mm, 0., 150. * mm),
        Vector3::new(0., 20. * mm, 150. * mm),
    ];
    let amps = vec![1.0, 0.8, 0.6];
    
    let g = GSPAT::new(backend)
        .with_foci(points.clone())
        .with_amps(amps.clone())
        .with_constraint(EmissionConstraint::Uniform(0xFFFF))
        .with_repeat(50);  // 迭代50次优化

    // 4. 发送配置
    autd.send(g)?;

    // 5. 使用不同算法比较效果
    let g_lm = LM::new(NalgebraBackend::new())
        .with_foci(points.clone())
        .with_amps(amps.clone())
        .with_repeat(10);
    
    let g_sdp = SDP::new(NalgebraBackend::new())
        .with_foci(points.clone())
        .with_amps(amps.clone());
    
    let g_naive = Naive::new(NalgebraBackend::new())
        .with_foci(points)
        .with_amps(amps);

    // 可以分别发送这些配置进行比较
    // autd.send(g_lm)?;
    // autd.send(g_sdp)?;
    // autd.send(g_naive)?;

    Ok(())
}

这个完整示例演示了:

  1. 初始化多个AUTD3设备
  2. 创建Nalgebra后端
  3. 使用GSPAT算法配置多个焦点和不同振幅
  4. 设置发射约束和迭代优化次数
  5. 展示了如何使用其他算法(LM、SDP、Naive)进行同样的配置

您可以根据实际需求调整焦点位置、振幅大小和算法参数。

回到顶部