Segmentの使用

焦点の移動で説明したように, autd3において, Gain等は送信するたびに上書きされ, この書き込みはバッファリングされたりはしない. そのため, (特にGainFociSTMへの切替時などに) 意図しない中間データが出力されてしまうことがある. これを防ぐために, AUTD3では, Gain/GainSTM/FociSTMModulationは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_modeNoneを指定すると, データの書き込みだけを行いSegmentの切り替えは行われない. この場合は, 後にSwapSegmentを送信することで, Segmentを切り替えることができる. 詳細は, API/Segmentを参照されたい.

NOTE: なお, Gain, GainSTM, FociSTMはメモリ領域を共有している. 例えば, Gainのデータを書き込んだあと, GainSTMのデータを書き込むと, Gainのデータは上書きされる.