単一デバイス
ここでは, 一つのデバイスを駆動する方法について説明する.
依存プログラムのインストール
Section titled “依存プログラムのインストール”本チュートリアルではechocatを利用する. Windowsを使用する場合, Npcapを「WinPcap API-compatible Mode」でインストールしておくこと.
以下は, 1台のAUTD3デバイスでアレイの中心から150 mm直上に焦点を生成し, 200 Hzの正弦波AMかける例である.
まずは適当なプロジェクトを作成し, autd3-rsライブラリを依存関係に追加する.
焦点計算やAM変調のために, autd3-rs-patternとautd3-rs-modulationも依存関係に追加する.
また, デバイスとの通信を行うautd3-rs-link-echocatライブラリも依存関係に追加する.
非同期ランタイムも必要なので, tokioも追加する.
cargo new --bin autd3-sample && cd autd3-samplecargo add autd3-rscargo add autd3-rs-patterncargo add autd3-rs-modulationcargo add autd3-rs-link-echocatcargo add tokio --features full次に, src/main.rsファイルを編集し, 以下のようにする.
use autd3_rs::commands::{Modulation, Pattern, SetSilencer};use autd3_rs::geometry::{Autd3, Geometry, offset};use autd3_rs::units::{Hz, m, mm, s};use autd3_rs::value::SamplingConfig;use autd3_rs::{Client, ClientConfig};use autd3_rs_link_echocat::EchocatLinkOption;
#[tokio::main(flavor = "multi_thread")]async fn main() -> Result<(), Box<dyn std::error::Error>> { // Define a geometry consisting of a single AUTD3 device. let geometry = Geometry::new(vec![Autd3::default()]);
// Open the client over an echocat link. let client = Client::open( &geometry, EchocatLinkOption::default(), ClientConfig::default(), ) .await?;
// Generate a focus 150 mm above the array center. let target = geometry.center() + offset(0.0 * mm, 0.0 * mm, 150.0 * mm); let wavelength = autd3_rs_pattern::wavelength(340.0 * m / s); let mut patterns = geometry.pattern_buffer(); autd3_rs_pattern::focus( &geometry, target, wavelength, &autd3_rs_pattern::FocusOption::default(), &mut patterns, );
// Apply a 200 Hz sine-wave AM. let mut modulation = autd3_rs_modulation::modulation_buffer(); autd3_rs_modulation::sine( 200 * Hz, &autd3_rs_modulation::SineOption { sampling_config: SamplingConfig::FREQ_4K, ..Default::default() }, &mut modulation, )?;
let mut builder = client.datagram_builder(); builder .push(SetSilencer::default()) .push(Pattern::new(&patterns)) .push(Modulation::new(SamplingConfig::FREQ_4K, &modulation)); let frames = builder.build()?; for frame in &frames { client.send_checked(frame).await?; }
tokio::signal::ctrl_c().await?;
client.stop().await?; client.close().await?;
Ok(())}そして, これを実行する.
cargo run --releaseLinux, macOSでは, echocatを使用するのに管理者権限が必要になるかもしれない. その場合は,
cargo build --release && sudo ./target/release/autd3_sampleとすること.
まずは適当なディレクトリを作成し, 仮想環境を用意してautd3ライブラリを追加する. また, デバイスとの通信を行うautd3-link-echocat, 焦点計算のautd3-pattern, AM変調のautd3-modulationも併せて追加する.
mkdir autd3-sample && cd autd3-samplepython3 -m venv .venvsource .venv/bin/activatepip install autd3 autd3-pattern autd3-modulation autd3-link-echocat次に, main.pyファイルを以下のようにする.
import asyncio
import numpy as np
import autd3_link_echocat as echocatimport autd3_modulation as modulationimport autd3_pattern as patternfrom autd3 import Client, ClientConfigfrom autd3.commands import Modulation, Pattern, SetSilencerfrom autd3.geometry import Autd3, Geometryfrom autd3.units import Hz, m, sfrom autd3.value import SamplingConfig
async def main() -> None: # Define a geometry consisting of a single AUTD3 device. geometry = Geometry([Autd3([0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0])])
# Open the client over an echocat link. client = await Client.open( geometry, echocat.EchocatLinkOption(), ClientConfig(), )
# Generate a focus 150 mm above the array center. target = geometry.center() + np.array([0.0, 0.0, 150.0]) wavelength = pattern.wavelength(340 * m / s) patterns = geometry.pattern_buffer() pattern.focus( geometry, target, wavelength, pattern.FocusOption(), patterns, )
# Apply a 200 Hz sine-wave AM. mod_buf = modulation.modulation_buffer() modulation.sine( 200 * Hz, modulation.SineOption(sampling_config=SamplingConfig.FREQ_4K), mod_buf, )
builder = client.datagram_builder() builder.push(SetSilencer()) builder.push(Pattern(patterns)) builder.push(Modulation(SamplingConfig.FREQ_4K, mod_buf)) for frame in builder.build(): await client.send_checked(frame)
try: await asyncio.Event().wait() finally: await client.stop() await client.close()
if __name__ == "__main__": asyncio.run(main())そして, これを実行する.
python3 main.pyLinux, macOSでは, echocatを使用するのに管理者権限が必要になるかもしれない. その場合は,
sudo .venv/bin/python3 main.pyとすること.
まずは適当なディレクトリを作成し, autd3 ライブラリを追加する. また, デバイスとの通信を行う AUTD3.Link.Echocat, 焦点計算の AUTD3.Pattern, AM 変調の AUTD3.Modulation も併せて追加する.
dotnet new console -o autd3-sample && cd autd3-sampledotnet add package AUTD3dotnet add package AUTD3.Patterndotnet add package AUTD3.Modulationdotnet add package AUTD3.Link.Echocat次に, Program.csファイルを以下のようにする.
using System;using System.Numerics;using System.Threading;using System.Threading.Tasks;using AUTD3;using AUTD3.Link;using static AUTD3.Units;
// Define a geometry consisting of a single AUTD3 device.var geometry = new Geometry(new[] { new Autd3(Vector3.Zero) });
// Open the client over an echocat link.var client = await Client.OpenAsync( geometry, new EchocatLinkOption(), new ClientConfig());
// Generate a focus 150 mm above the array center.var target = geometry.Center + new Vector3(0.0f, 0.0f, 150.0f);var wavelength = Pattern.Wavelength(340.0f * m / s);var patterns = geometry.PatternBuffer();Pattern.Focus( geometry, target, wavelength, new FocusOption(), patterns);
// Apply a 200 Hz sine-wave AM.var modulation = Modulation.ModulationBuffer();Modulation.Sine( 200 * Hz, new SineOption(samplingConfig: SamplingConfig.Freq4k), modulation);
var builder = client.DatagramBuilder();builder.Push(new SetSilencer());builder.Push(new Pattern(patterns));builder.Push(new Modulation(SamplingConfig.Freq4k, modulation));var frames = builder.Build();foreach (var frame in frames){ await client.SendCheckedAsync(frame);}
using var cts = new CancellationTokenSource();Console.CancelKeyPress += (_, e) =>{ e.Cancel = true; cts.Cancel();};
try{ await Task.Delay(Timeout.InfiniteTimeSpan, cts.Token);}catch (OperationCanceledException){}finally{ await client.StopAsync(); await client.CloseAsync();}そして, これを実行する.
dotnet run -c ReleaseLinux, macOSでは, echocatを使用するのに管理者権限が必要になるかもしれない.