複数デバイスの接続
AUTD3は複数のデバイスをデイジーチェーン接続して大きな一つのアレイを構成することができる. SDKは複数台を接続したとしても, 透過的に使用できるように設計されている.
SDKで複数台のデバイスを使用する場合はController::open
関数の第1引数で接続したデバイスの順にAUTD3
構造体を指定する必要がある.
ハードウェアの接続方法ははじめに/ハードウェアを参照されたい.
以下では, 2つのデバイスを接続する場合の手順を示す.
並進のみ

例えば, 上図のように配置・接続しており, 図左側のデバイスが1台目, 右側のデバイスが2台目だとする. さらに, グローバル座標を1台目のローカル座標と同じようにとるとすると, コードは以下の通りになる.
use autd3::prelude::*;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let link = autd3::link::Nop::new();
let _ =
Controller::open(
[
AUTD3 {
pos: Point3::origin(),
rot: UnitQuaternion::identity(),
},
AUTD3 {
pos: Point3::new(AUTD3::DEVICE_WIDTH, 0., 0.),
rot: UnitQuaternion::identity(),
},
],
link,
)?;
Ok(())
}
#include<chrono>
#include<autd3.hpp>
#include<autd3/link/nop.hpp>
int main() {
using namespace autd3;
link::Nop link;
Controller::open({AUTD3{
.pos = Point3::origin(),
.rot = Quaternion::Identity(),
},
AUTD3{
.pos = Point3(AUTD3::DEVICE_WIDTH, 0, 0),
.rot = Quaternion::Identity(),
}},
std::move(link));
return 0; }
using AUTD3Sharp;
using AUTD3Sharp.Link;
using AUTD3Sharp.Utils;
var link = new Nop();
Controller.Open([
new AUTD3(pos: Point3.Origin, rot: Quaternion.Identity),
new AUTD3(pos: new Point3(AUTD3.DeviceWidth, 0, 0), rot: Quaternion.Identity)
], link)
;
from pyautd3 import AUTD3, Controller
from pyautd3.link.nop import Nop
link = Nop()
Controller.open(
[
AUTD3(pos=[0.0, 0.0, 0.0], rot=[1, 0, 0, 0]),
AUTD3(pos=[AUTD3.DEVICE_WIDTH, 0.0, 0.0], rot=[1, 0, 0, 0]),
],
link,
)
ここで, pos
はグローバル座標におけるデバイスの位置を表す.
なお, AUTD3::DEVICE_WIDTH
はデバイスの (基板外形を含めた) 横幅である.
グローバル座標の設定
SDKで使用するグローバル座標の原点や向きは, ユーザーが自由に設定できる.

例えば, 上図のように, グローバル座標を2台目のローカル座標と同じようにとると, コードは以下の通りになる.
use autd3::prelude::*;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let link = autd3::link::Nop::new();
let _ =
Controller::open(
[
AUTD3 {
pos: Point3::new(-AUTD3::DEVICE_WIDTH, 0., 0.),
rot: UnitQuaternion::identity(),
},
AUTD3 {
pos: Point3::origin(),
rot: UnitQuaternion::identity(),
},
],
link,
)?;
Ok(())
}
#include<chrono>
#include<autd3.hpp>
#include<autd3/link/nop.hpp>
int main() {
using namespace autd3;
link::Nop link;
Controller::open(
{
AUTD3{
.pos = Point3(-AUTD3::DEVICE_WIDTH, 0, 0),
.rot = Quaternion::Identity(),
},
AUTD3{
.pos = Point3::origin(),
.rot = Quaternion::Identity(),
},
},
std::move(link));
return 0; }
using AUTD3Sharp;
using AUTD3Sharp.Link;
using AUTD3Sharp.Utils;
var link = new Nop();
Controller.Open([
new AUTD3(pos: new Point3(-AUTD3.DeviceWidth, 0, 0), rot: Quaternion.Identity),
new AUTD3(pos: Point3.Origin, rot: Quaternion.Identity)
], link)
;
from pyautd3 import AUTD3, Controller
from pyautd3.link.nop import Nop
link = Nop()
Controller.open(
[
AUTD3(pos=[-AUTD3.DEVICE_WIDTH, 0.0, 0.0], rot=[1, 0, 0, 0]),
AUTD3(pos=[0.0, 0.0, 0.0], rot=[1, 0, 0, 0]),
],
link,
)
並進と回転
デバイスの回転を指定する場合はrot
で指定する.
ここで回転はオイラー角, または, クオータニオンで指定する.

例えば, 上図のように配置されており, 下が1台目, 左が2台目で, グローバル座標を1台目のローカル座標と同じだとすると, コードは以下の通りになる.
use autd3::prelude::*;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let link = autd3::link::Nop::new();
let _ =
Controller::open(
[
AUTD3 {
pos: Point3::origin(),
rot: UnitQuaternion::identity(),
},
AUTD3 {
pos: Point3::new(0., 0., AUTD3::DEVICE_WIDTH),
rot: EulerAngle::ZYZ(0. * rad, PI/2.0 * rad, 0. * rad).into(),
},
],
link,
)?;
Ok(())
}
#include<chrono>
#include<autd3.hpp>
#include<autd3/link/nop.hpp>
int main() {
using namespace autd3;
link::Nop link;
Controller::open({AUTD3{
.pos = Point3::origin(),
.rot = Quaternion::Identity(),
},
AUTD3{
.pos = Point3(0, 0, AUTD3::DEVICE_WIDTH),
.rot = EulerAngles::ZYZ(0. * rad, pi / 2.0 * rad,
0. * rad),
}},
std::move(link));
return 0; }
using System;
using AUTD3Sharp;
using AUTD3Sharp.Link;
using AUTD3Sharp.Utils;
using static AUTD3Sharp.Units;
var link = new Nop();
Controller.Open([
new AUTD3(pos: Point3.Origin, rot: Quaternion.Identity),
new AUTD3(
pos: new Point3(0, 0, AUTD3.DeviceWidth),
rot: EulerAngles.Zyz(0 * rad, MathF.PI / 2 * rad, 0 * rad))
], link)
;
import numpy as np
from pyautd3 import AUTD3, Controller, EulerAngles, Nop, rad
link = Nop()
Controller.open(
[
AUTD3(pos=[0.0, 0.0, 0.0], rot=[1.0, 0.0, 0.0, 0.0]),
AUTD3(
pos=[0.0, 0.0, AUTD3.DEVICE_WIDTH],
rot=EulerAngles.ZYZ(0 * rad, np.pi / 2 * rad, 0 * rad),
),
],
link,
)
NOTE: Rust版のみ, 12種類全てのオイラー角が使用できる. それ以外の言語ではXYZ, ZYZのみ.