これは開発版のドキュメントである. 内容は次のリリースまでに変更される可能性がある. 最新のリリース版は 0.14.x を参照.
ConfigFociStm
ConfigFociStm は, Foci STM バンクの再生パラメータを設定する低レベルコマンド.
設定は書き込まれるだけで, 有効化には ActivatePatternBank を送る.
ConfigFociStm { bank, config, size, num_foci, sound_speed, loop_behavior,};ConfigFociStm( bank=bank, config=config, size=size, num_foci=num_foci, sound_speed=sound_speed, loop_behavior=loop_behavior,)new ConfigFociStm( bank: bank, config: config, size: size, numFoci: numFoci, soundSpeed: soundSpeed, loopBehavior: loopBehavior);| フィールド | 型 | 説明 |
|---|---|---|
bank |
PatternBank |
対象バンク |
config |
SamplingConfig |
再生サンプリング周波数 |
size |
usize |
STM サンプル数 |
num_foci |
u8 |
1 サンプルあたりの焦点数 (ControlPoints の points の長さ) |
sound_speed |
Velocity |
焦点計算に使う音速 |
loop_behavior |
LoopBehavior |
再生ループ回数 (Infinite / Finite) |
size の下限は 2.
Example
Section titled “Example”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));