これは開発版のドキュメントである. 内容は次のリリースまでに変更される可能性がある. 最新のリリース版は 0.6.x を参照.
焦点の移動
ソフトウェア制御
Section titled “ソフトウェア制御”AUTD3 において, Pattern は送信するたびに上書きされる.
したがって, 次のようなコードを実行すると, 約1秒ごとに焦点の位置が移動する.
let mut patterns = geometry.pattern_buffer();loop { for sign in [1.0_f32, -1.0] { let target = center + offset((sign * 20.0) * mm, 0.0 * mm, 0.0 * mm); autd3_rs_pattern::focus( &geometry, target, wavelength, &autd3_rs_pattern::FocusOption::default(), &mut patterns, ); let mut builder = client.datagram_builder(); builder.push(Pattern::new(&patterns)); for frame in &builder.build()? { client.send_checked(frame).await?; } tokio::time::sleep(Duration::from_secs(1)).await; }}patterns = geometry.pattern_buffer()while True: for sign in (1.0, -1.0): target = center + np.array([sign * 20.0, 0.0, 0.0]) pattern.focus( geometry, target, wavelength, pattern.FocusOption(), patterns, ) builder = client.datagram_builder() builder.push(Pattern(patterns)) for frame in builder.build(): await client.send_checked(frame) await asyncio.sleep(1.0)var patterns = geometry.PatternBuffer();while (true){ foreach (var sign in new[] { 1.0f, -1.0f }) { var target = center + new Vector3(sign * 20.0f, 0.0f, 0.0f); Pattern.Focus( geometry, target, wavelength, new FocusOption(), patterns ); var builder = client.DatagramBuilder(); builder.Push(new Pattern(patterns)); foreach (var frame in builder.Build()) { await client.SendCheckedAsync(frame); } await Task.Delay(TimeSpan.FromSeconds(1)); }}上記のコードだとソフトウェア的にタイミングを制御している.
これの精度は OS や実行環境に依存するため, より精度の高い制御が必要な場合は, FociStm / PatternStm を使用することをおすすめする.
FociStmによるハードウェア制御
Section titled “FociStmによるハードウェア制御”FociStm を使用して上記と同等の動作を実現するコードは以下の通りである.
let points = [ ControlPoints::from(center + offset(20.0 * mm, 0.0 * mm, 0.0 * mm)), ControlPoints::from(center + offset(-20.0 * mm, 0.0 * mm, 0.0 * mm)),];let mut builder = client.datagram_builder();builder.push(FociStm::new(0.5 * Hz, &points, FociStmOption::default()));for frame in &builder.build()? { client.send_checked(frame).await?;}points = [ ControlPoints([ControlPoint(center + np.array([20.0, 0.0, 0.0]))]), ControlPoints([ControlPoint(center + np.array([-20.0, 0.0, 0.0]))]),]builder = client.datagram_builder()builder.push(FociStm(0.5 * Hz, points, FociStmOption()))for frame in builder.build(): await client.send_checked(frame)var points = new[]{ new ControlPoints(new[] { new ControlPoint(center + new Vector3(20.0f, 0.0f, 0.0f)) }), new ControlPoints(new[] { new ControlPoint(center + new Vector3(-20.0f, 0.0f, 0.0f)) }),};var builder = client.DatagramBuilder();builder.Push(new FociStm(0.5f * Hz, points));foreach (var frame in builder.Build()){ await client.SendCheckedAsync(frame);}FociStm / PatternStm は AUTD3 デバイス内部でループされるため, ソフトウェアループは必要なく, 送信以降自動的に無限ループする.
また, タイミングは AUTD3 デバイス内蔵のタイマーで制御されるため, 精度が高く, 解像度も最高で 25 µs 単位で指定できる.
ただし, このタイマーの制約上, 出力不可能な周波数が存在する.
FociStm / PatternStm の切り替えタイミングは, 1 ループの周波数, または周期で指定する.
すなわち, この場合は 2 つの焦点で 0.5 Hz (2 s) となるので, 各焦点は 1 s 出力される.
なお, SamplingConfig を使用することで, 1 ループあたりではなく, サンプリング周波数, すなわち 1 焦点あたりの周波数や周期を指定することもできる.
焦点に限らず任意の Pattern を切り替えたい場合は, FociStm の代わりにPatternStm を使う.