Segmentの使用
焦点の移動で説明したように, autd3において, Gain
等は送信するたびに上書きされ, この書き込みはバッファリングされたりはしない.
そのため, (特にGain
→FociSTM
への切替時などに) 意図しない中間データが出力されてしまうことがある.
これを防ぐために, AUTD3では, Gain/GainSTM/FociSTM
やModulation
は2つのメモリ領域 (Segment
と呼ぶ) を持っており手動でダブルバッファリングのような制御を行うことができる.
WithSegment
でデータを包むことで, 書き込むSegment
を変更することができる.
(デフォルトではSegment::S0
に書き込まれる.)
use autd3::prelude::*;
fn main() {
let x = 0.0;
let y = 0.0;
let z = 0.0;
let _ =
WithSegment {
inner: Focus {
pos: Point3::new(x, y, z),
option: FocusOption {
intensity: Intensity(0x80),
..Default::default()
},
},
segment: Segment::S1,
transition_mode: Some(TransitionMode::Immediate),
};
}
#include<autd3.hpp>
int main() {
const auto x = 0.0;
const auto y = 0.0;
const auto z = 0.0;
autd3::WithSegment{
autd3::Focus{autd3::Point3(x, y, z),
autd3::FocusOption{.intensity = autd3::Intensity(0x80)}},
autd3::Segment::S1, autd3::TransitionMode::Immediate()};
return 0; }
using AUTD3Sharp;
using AUTD3Sharp.Utils;
using AUTD3Sharp.Gain;
var x = 0.0f;
var y = 0.0f;
var z = 0.0f;
new WithSegment(
inner: new Focus(
pos: new Point3(x, y, z),
option: new FocusOption
{
Intensity = new Intensity(0x80),
}
),
segment: Segment.S1,
transitionMode: TransitionMode.Immediate
);
from pyautd3 import Intensity, Focus, FocusOption, WithSegment, Segment, TransitionMode
x = 1.0
y = 0.0
z = 0.0
WithSegment(
inner=Focus(
pos=[x, y, z],
option=FocusOption(
intensity=Intensity(0x80),
),
),
segment=Segment.S1,
transition_mode=TransitionMode.Immediate,
)
ここで, TransitionMode::Immediate
はデータの書き込み後, 直ちにSegment
を切り替えることを意味する.
transition_mode
にNone
を指定すると, データの書き込みだけを行いSegment
の切り替えは行われない.
この場合は, 後にSwapSegment
を送信することで, Segment
を切り替えることができる.
詳細は, API/Segment
を参照されたい.
NOTE: なお,
Gain
,GainSTM
,FociSTM
はメモリ領域を共有している. 例えば,Gain
のデータを書き込んだあと,GainSTM
のデータを書き込むと,Gain
のデータは上書きされる.