これは開発版のドキュメントである. 内容は次のリリースまでに変更される可能性がある. 最新のリリース版は 0.9.x を参照.
Pattern
Pattern は, 各振動子の位相と振幅をデバイスへ送るコマンド.
位相と振幅は別々のバッファで渡す.
Pattern::new(&phases, intensities);
Pattern::with_bank(bank, &phases, intensities);
Pattern { bank, phases: &phases, intensities: intensities.into(), transition_mode,};Pattern::new は書き込み先バンクを PatternBank::B0 とする.
別バンクへ書く場合は Pattern::with_bank(bank, phases, intensities) を使う.
Pattern(phases, intensities)
Pattern(phases, intensities, bank=bank)
Pattern( phases, intensities, bank=bank, transition_mode=transition_mode,)Pattern は書き込み先バンクをデフォルトで PatternBank.B0 とする.
別バンクへ書く場合は Pattern(phases, intensities, bank=bank) を使う.
new Pattern(phases, intensities);
new Pattern(bank, phases, intensities);
new Pattern( bank: bank, phases: phases, intensities: intensities, transitionMode: transitionMode);new Pattern(phases, intensities) は書き込み先バンクを PatternBank.B0 とする.
別バンクへ書く場合は new Pattern(bank, phases, intensities) を使う.
| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
bank |
PatternBank |
PatternBank::B0 |
書き込み先・再生対象のバンク |
phases |
&[Vec<Phase>] |
— | デバイスごとの位相 |
intensities |
PatternIntensity |
— | 振幅 (Intensity の一様値, または &[Vec<Intensity>] のデバイスごとのバッファ) |
transition_mode |
TransitionMode |
TransitionMode::Immediate |
バンク切替時の遷移挙動 |
patternの計算には幾つかのヘルパ関数が用意されている.
等価な低レベルコマンド
Section titled “等価な低レベルコマンド”Pattern は WritePatternBuffer + ConfigPattern + ChangePatternBank の 3 つと等価であり, これらは 1 フレームに融合して送られる.
以下は Pattern { bank, phases, intensities } と等価な組み合わせである.
transition_mode に TransitionMode::Later を指定した場合は融合せず, WritePatternBuffer + ConfigPattern の 2 フレームに分解して送る (ChangePatternBank を送らない).
詳細は ChangePatternBank の TransitionMode を参照.
WritePatternBuffer::new(bank, 0, phases, intensities);ConfigPattern { bank, config: SamplingConfig::new(NonZeroU16::MAX), size: 1, loop_behavior: LoopBehavior::Infinite,};ChangePatternBank { bank, transition_mode,};WritePatternBuffer( bank=bank, index=0, phases=phases, intensities=intensities,)ConfigPattern( bank=bank, config=SamplingConfig(0xFFFF), size=1, loop_behavior=LoopBehavior.Infinite,)ChangePatternBank( bank=bank, transition_mode=transition_mode,)new WritePatternBuffer( bank: bank, index: 0, phases: phases, intensities: intensities);new ConfigPattern( bank: bank, config: new SamplingConfig(ushort.MaxValue), size: 1, loopBehavior: LoopBehavior.Infinite);new ChangePatternBank( bank: bank, transitionMode: transitionMode);Example
Section titled “Example”use autd3_rs::commands::Pattern;use autd3_rs::geometry::{Autd3, Geometry, offset};use autd3_rs::units::{m, mm, s};use autd3_rs::value::Intensity;use autd3_rs::{Client, ClientConfig};use autd3_rs_link_nop::Nop;use autd3_rs_pattern::{focus, wavelength};
let geometry = Geometry::new(vec![Autd3::default()]);let client = Client::open(&geometry, Nop, ClientConfig::default()).await?;
let mut phases = geometry.phase_buffer();focus( &geometry, geometry.center() + offset(0.0 * mm, 0.0 * mm, 150.0 * mm), wavelength(340.0 * m / s), &mut phases,);
let mut builder = client.datagram_builder();builder.push(Pattern::new(&phases, Intensity::MAX));let frames = builder.build()?;for frame in &frames { client.send_checked(frame).await?;}
client.close().await?;import asyncio
import numpy as np
from autd3 import Client, ClientConfigfrom autd3.commands import Patternfrom autd3.geometry import Autd3, Geometryfrom autd3.units import m, sfrom autd3.value import Intensityfrom autd3_link_nop import Nopfrom autd3_pattern import focus, wavelength
async def main() -> None: geometry = Geometry([Autd3([0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0])]) async with await Client.open(geometry, Nop(), ClientConfig()) as client: phases = geometry.phase_buffer() focus( geometry, geometry.center() + np.array([0.0, 0.0, 150.0]), wavelength(340 * m / s), phases, )
builder = client.datagram_builder() builder.push(Pattern(phases, Intensity.MAX)) frames = builder.build() for frame in frames: await client.send_checked(frame)
asyncio.run(main())using System.Numerics;using System.Threading.Tasks;using AUTD3;using AUTD3.Link;using Nop = AUTD3.Link.Nop;using static AUTD3.Units;
var geometry = new Geometry(new[] { new Autd3(Vector3.Zero) });await using var client = await Client.OpenAsync(geometry, new Nop(), new ClientConfig());
var phases = geometry.PhaseBuffer();Pattern.Focus( geometry, geometry.Center + new Vector3(0.0f, 0.0f, 150.0f), Pattern.Wavelength(340.0f * m / s), phases);
var builder = client.DatagramBuilder();builder.Push(new Pattern(phases, Intensity.Max));var frames = builder.Build();foreach (var frame in frames){ await client.SendCheckedAsync(frame);}