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: transition_mode::Immediate,
};
}
#include<autd3.hpp>
int main() {
using namespace autd3;
const auto x = 0.0;
const auto y = 0.0;
const auto z = 0.0;
WithSegment{Focus{Point3(x, y, z), FocusOption{.intensity = Intensity(0x80)}},
Segment::S1, transition_mode::Immediate()};
return 0; }
using AUTD3Sharp;
using AUTD3Sharp.Utils;
using AUTD3Sharp.TransitionMode;
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: new Immediate()
);
from pyautd3 import Intensity, Focus, FocusOption, WithSegment, Segment, transition_mode
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=transition_mode.Immediate(),
)
ここで, TransitionMode::Immediateはデータの書き込み後, 直ちにSegmentを切り替えることを意味する.
transition_modeにNoneを指定すると, データの書き込みだけを行いSegmentの切り替えは行われない.
この場合は, 後にSwapSegmentを送信することで, Segmentを切り替えることができる.
詳細は, API/Segmentを参照されたい.
NOTE: なお,
Gain,GainSTM,FociSTMはメモリ領域を共有している. 例えば,Gainのデータを書き込んだあと,GainSTMのデータを書き込むと,Gainのデータは上書きされる.