Remote
RemoteLink は, AUTD3 デバイスに接続された別ホストへ TCP 接続して送受信する Link 実装.
AUTD3 を操作したいマシンと実機を配線したマシンが異なる場合に使う.
サーバとクライアントの 2 プロセスで構成する.
RemoteServer: 実機に配線されたホストで動かす. 実機リンクを駆動し, フレームを TCP で中継する.RemoteLink: 操作側のホストで動かす.
サーバ側のホストには, 実機を駆動する Link のパッケージ (EtherCrab 等) も併せて追加する.
Simulator への接続もRemoteLinkで行う.
RemoteServer
Section titled “RemoteServer”RemoteServer::new に待ち受け設定と実機リンクを開くクロージャを渡し, serve で中継を始める.
let option = RemoteServerOption::new(bind);RemoteServer::new(option, |_: &[DeviceLayout]| { EchocatLink::open(&EchocatLinkOption::default()) .map_err(|e| RemoteLinkError::Link(e.to_string()))})?.serve()?;| 引数 | 型 | 説明 |
|---|---|---|
option |
RemoteServerOption |
待ち受けアドレスとバススレッドの設定 |
factory |
FnMut(&[DeviceLayout]) -> Result<impl Link> |
実機リンクを開くクロージャ |
RemoteServerOption のフィールド:
| フィールド | 型 | 説明 |
|---|---|---|
bind |
SocketAddr |
サーバが待ち受ける TCP アドレス |
bus |
BusOption |
バススレッドの設定 |
BusOption のフィールド:
| フィールド | 型 | 説明 |
|---|---|---|
pacing |
BusPacing |
バスの周期. LinkPaced は Link 自身のペースに任せる (EtherCAT リンクはこちら) |
rt_priority |
Option<ThreadPriority> |
バススレッドの優先度. 既定で実時間優先度を試み, 失敗したら警告を出す |
rt_policy |
RtSchedulePolicy |
バススレッドのスケジューリングポリシー |
rt_affinity |
Option<CoreId> |
バススレッドを固定する CPU コア |
stack_prefault_bytes |
usize |
起動時にページインしておくバススレッドのスタックのバイト数. 既定 0. 0 のままだと最初のフレームがページフォールト分だけ遅れる |
serve はクライアントの接続を待ち受け, 接続ごとに factory で実機リンクを開いて tx/rx フレームの中継を始める.
クライアントの Geometry の台数はサーバ側のバスの台数と一致していなければならない.
rt_priority の設定には特権が要る (Linux では CAP_SYS_NICE).
権限が無いと警告を出して素のスケジューリングで動くが, 負荷時にバスが不安定になる.
RemoteLink
Section titled “RemoteLink”RemoteLinkOption::new(addr);RemoteLinkOption(addr)new RemoteLinkOption(addr);| フィールド | 型 | 説明 |
|---|---|---|
addr |
SocketAddr |
接続先サーバのアドレス |
timeout |
Option<Duration> |
接続と 1 フレームごとの待ち時間. None は OS 既定のため, 応答の無いアドレスは失敗するまで数分かかる |
mDNS でネットワーク上のサーバを探すことができる.
Rust では discovery feature が要る (Python と C# は既定で使える).
autd3-rs-link-remote = { version = "0.4", features = ["discovery"] }let option = RemoteLinkOption::discover()?;option = RemoteLinkOption.discover()var option = RemoteLinkOption.Discover();サーバが 1 つも見つからないか複数見つかった場合はエラーになる. 複数見つかったときのエラーには見つかったサーバの一覧が入るので, その中から名前で選ぶ.
let option = RemoteLinkOption::discover_with(&DiscoveryOption { instance: Some("autd3-0a1b2c3d".to_string()), ..Default::default()})?;option = RemoteLinkOption.discover(timeout=timedelta(seconds=5), instance="autd3-0a1b2c3d")var option = RemoteLinkOption.Discover(TimeSpan.FromSeconds(5), "autd3-0a1b2c3d");DiscoveryOption のフィールド:
| フィールド | 型 | 説明 |
|---|---|---|
timeout |
Duration |
応答を待つ時間. 既定 2 秒. 短くすると取りこぼす |
instance |
Option<String> |
探すサーバの名前. None ならすべて |
一覧だけが要るなら discover_all を使う.
for appliance in autd3_rs_link_remote::discover_all(&DiscoveryOption::default())? { println!("{} at {}", appliance.instance, appliance.addr);}直結する場合, 探索は IPv6 リンクローカルアドレスを返す. ホスト側に設定は基本的に不要だが, IPv4 で繋ぎたい場合だけ, ホスト側にもリンクローカルアドレスを持つ接続プロファイルが必要.