これは開発版のドキュメントである. 内容は次のリリースまでに変更される可能性がある. 最新のリリース版は 0.9.x を参照.
WritePatternBuffer
WritePatternBuffer は, 指定したバンク・インデックスへ Pattern (各振動子の位相と振幅) を書き込む低レベルコマンド.
通信上は位相列・振幅列の順で送られ, デバイスの CPU が FPGA のメモリへ振動子毎に並べ直して書き込む.
WritePatternBuffer::new(bank, index, phases, intensities);WritePatternBuffer( bank=bank, index=index, phases=phases, intensities=intensities,)new WritePatternBuffer( bank: bank, index: index, phases: phases, intensities: intensities);| フィールド | 型 | 説明 |
|---|---|---|
bank |
PatternBank |
書き込み先バンク |
index |
u16 |
バンク内の書き込み先インデックス |
phases |
&[Vec<Phase>] |
デバイスごとの位相 |
intensities |
PatternIntensity |
振幅 (Intensity の一様値, または &[Vec<Intensity>] のデバイスごとのバッファ) |
Example
Section titled “Example”複数の低レベルコマンドは 1 つの datagram にまとめて送る. 以下は WritePatternBuffer → ConfigPattern → ChangePatternBank で 1 つの Pattern を再生する例 (高レベルの Pattern と等価).
use core::num::NonZeroU16;
use autd3_rs::commands::{ChangePatternBank, ConfigPattern, WritePatternBuffer};use autd3_rs::geometry::{Autd3, Geometry, offset};use autd3_rs::units::{m, mm, s};use autd3_rs::value::{Intensity, LoopBehavior, PatternBank, SamplingConfig, TransitionMode};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 bank = PatternBank::B0;
let mut builder = client.datagram_builder();builder.push(WritePatternBuffer::new(bank, 0, &phases, Intensity::MAX));builder.push(ConfigPattern { bank, config: SamplingConfig::new(NonZeroU16::MAX), size: 1, loop_behavior: LoopBehavior::Infinite,});builder.push(ChangePatternBank { bank, transition_mode: TransitionMode::Immediate,});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 ChangePatternBank, ConfigPattern, WritePatternBufferfrom autd3.geometry import Autd3, Geometryfrom autd3.units import m, sfrom autd3.value import Intensity, LoopBehavior, PatternBank, SamplingConfig, TransitionModefrom 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, )
bank = PatternBank.B0
builder = client.datagram_builder() builder.push( WritePatternBuffer( bank=bank, index=0, phases=phases, intensities=Intensity.MAX, ) ) builder.push( ConfigPattern( bank=bank, config=SamplingConfig(0xFFFF), size=1, loop_behavior=LoopBehavior.Infinite, ) ) builder.push( ChangePatternBank( bank=bank, transition_mode=TransitionMode.Immediate, ) ) 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 bank = PatternBank.B0;
var builder = client.DatagramBuilder();builder.Push(new WritePatternBuffer( bank: bank, index: 0, phases: phases, intensities: Intensity.Max));builder.Push(new ConfigPattern( bank: bank, config: new SamplingConfig(ushort.MaxValue), size: 1, loopBehavior: LoopBehavior.Infinite));builder.Push(new ChangePatternBank( bank: bank, transitionMode: TransitionMode.Immediate));var frames = builder.Build();foreach (var frame in frames){ await client.SendCheckedAsync(frame);}