これは開発版のドキュメントである. 内容は次のリリースまでに変更される可能性がある. 最新のリリース版は 0.14.x を参照.
WriteFociBuffer
WriteFociBuffer は, Foci STM 用の焦点列をバンクへ書き込む低レベルコマンド.
WriteFociBuffer { bank, start_index, points,};WriteFociBuffer( bank=bank, start_index=start_index, points=points,)new WriteFociBuffer( bank: bank, startIndex: startIndex, points: points);| フィールド | 型 | 説明 |
|---|---|---|
bank |
PatternBank |
書き込み先バンク |
start_index |
usize |
バンク内の書き込み開始インデックス |
points |
&[ControlPoints] |
焦点サンプルの列 |
ControlPoints は焦点 (ControlPoint) の列と振幅を持つ 1 サンプル. 焦点数は全サンプルで揃える.
詳細は FociStm を参照.
WriteFociBuffer は1 フレームに収まる分しか書けない.
上限 (ControlPoints の数) は焦点数で変わり, WriteFociBuffer::max_len(num_foci)で, 超えると送信時にエラーになる.
Example
Section titled “Example”WriteFociBuffer → ConfigFociStm → ActivatePatternBank で焦点列を Foci STM として再生する例 (高レベルの FociStm と等価). 200 点は 1 フレームに収まらないので分割して書き込む.
use std::f32::consts::PI;
use autd3_rs::commands::{ ActivatePatternBank, Clear, ConfigFociStm, Synchronize, WriteFociBuffer,};use autd3_rs::geometry::{Autd3, Geometry, offset};use autd3_rs::units::{Hz, m, mm, s};use autd3_rs::value::{ControlPoints, LoopBehavior, PatternBank, SamplingConfig, TransitionMode};use autd3_rs::Client;use autd3_rs::udp::TransportOption;
let geometry = Geometry::new(vec![Autd3::default()]);let option = TransportOption::default();let mut client = Client::open(&geometry, &option).await?;client.send(Clear).await?;client.send(Synchronize).await?;
let center = geometry.center() + offset(0.0 * mm, 0.0 * mm, 150.0 * mm);let points: Vec<ControlPoints> = (0..200) .map(|i| { let theta = 2.0 * PI * i as f32 / 200.0; ControlPoints::from(center + offset(30.0 * mm * theta.cos(), 30.0 * mm * theta.sin(), 0.0 * mm)) }) .collect();
let bank = PatternBank::B0;
let max_len = WriteFociBuffer::max_len(1);for (i, chunk) in points.chunks(max_len).enumerate() { client.send(WriteFociBuffer { bank, start_index: i * max_len, points: chunk, }).await?;}client.send(ConfigFociStm { bank, config: SamplingConfig::from_freq(1.0 * Hz * points.len() as f32)?, size: points.len(), num_foci: 1, sound_speed: 340.0 * m / s, loop_behavior: LoopBehavior::Infinite,}).await?;client.send(ActivatePatternBank { bank, transition_mode: TransitionMode::Immediate,}).await?;import asyncioimport math
from autd3 import Client, TransportOptionfrom autd3.commands import ActivatePatternBank, Clear, ConfigFociStm, Synchronize, WriteFociBufferfrom autd3.geometry import Autd3, Geometry, offsetfrom autd3.units import Hz, m, mm, sfrom autd3.value import ControlPoints, LoopBehavior, PatternBank, SamplingConfig, TransitionMode
async def main() -> None: geometry = Geometry([Autd3()]) with await Client.open(geometry, TransportOption()) as client: await client.send(Clear()) await client.send(Synchronize())
center = geometry.center() + offset(0.0 * mm, 0.0 * mm, 150.0 * mm) points = [] for i in range(200): theta = 2.0 * math.pi * i / 200 p = center + offset(30.0 * mm * math.cos(theta), 30.0 * mm * math.sin(theta), 0.0 * mm) points.append(ControlPoints(p))
bank = PatternBank.B0
max_len = WriteFociBuffer.max_len(1) for start_index in range(0, len(points), max_len): await client.send( WriteFociBuffer( bank=bank, start_index=start_index, points=points[start_index : start_index + max_len], ) ) await client.send( ConfigFociStm( bank=bank, config=SamplingConfig(1.0 * Hz * len(points)), size=len(points), num_foci=1, sound_speed=340.0 * m / s, loop_behavior=LoopBehavior.Infinite, ) ) await client.send( ActivatePatternBank( bank=bank, transition_mode=TransitionMode.Immediate, ) )
asyncio.run(main())using System;using System.Linq;using System.Threading.Tasks;using AUTD3;using static AUTD3.Units;
var geometry = new Geometry(new[] { new Autd3() });using var client = await Client.OpenAsync(geometry, new TransportOption());await client.SendAsync(new Clear());await client.SendAsync(new Synchronize());
var center = geometry.Center + Offset(0.0f * mm, 0.0f * mm, 150.0f * mm);var points = Enumerable.Range(0, 200) .Select(i => 2.0f * MathF.PI * i / 200) .Select(theta => (ControlPoints)(center + Offset(MathF.Cos(theta) * 30.0f * mm, MathF.Sin(theta) * 30.0f * mm, 0.0f * mm))) .ToArray();
var bank = PatternBank.B0;
var maxLen = WriteFociBuffer.MaxLen(1);for (var startIndex = 0; startIndex < points.Length; startIndex += maxLen){ await client.SendAsync(new WriteFociBuffer( bank: bank, startIndex: (uint)startIndex, points: points[startIndex..Math.Min(startIndex + maxLen, points.Length)] ));}await client.SendAsync(new ConfigFociStm( bank: bank, config: new SamplingConfig(1.0f * Hz * points.Length), size: (uint)points.Length, numFoci: 1, soundSpeed: 340.0f * m / s, loopBehavior: LoopBehavior.Infinite));await client.SendAsync(new ActivatePatternBank( bank: bank, transitionMode: TransitionMode.Immediate));