Lightweightモード

Rust, 及び, Dart版のライブラリではLightweightモードをサポートしている.

NOTE: Dart版のライブラリはLightweightモードのみサポートしている.

Lightweightモードは, RemoteTwinCAT, RemoteSOEM, Simulator リンクを使用する際に, 通信量を削減するためのモードである.

NOTE: C++, C#, Python版のライブラリでは, この機能は提供されていない. ただし, Lightweightモードの通信にはProtocol Buffersを使用しているため, proto定義に従ってデータを送信すれば, 各言語から使用することは可能.

Setup

lightweightモードのクライアントを使用するには, autd3-protobuf crateのlightweight featureを有効にする必要がある.

cargo add autd3-protobuf --features "lightweight"

サーバ側は, AUTD3 ServerのオプションでLightweightモードを有効にすればいい.

以下が, Lightweightモードを使用するクライアント側のRustのサンプルコードである.

基本的に通常のAPIと同じであるが, 以下の点に注意.

  • GainSTM使用時にautd3_protobuf::lightweight::IntoLightweightGain::into_lightweight()を使用する必要がある
  • group_send使用時にautd3_protobuf::lightweight::Datagram::into_lightweight()を使用する必要がある
  • 一部データはサポートされていない
use autd3::prelude::*;

use autd3_protobuf::lightweight::Controller;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let mut autd = Controller::open([AUTD3::default()], "127.0.0.1:8080".parse()?).await?;

    println!("======== AUTD3 firmware information ========");
    autd.firmware_version().await?.iter().for_each(|firm_info| {
        println!("{}", firm_info);
    });
    println!("============================================");

    let center = autd.center() + Vector3::new(0., 0., 150.0 * mm);

    let g = Focus {
        pos: center,
        option: Default::default(),
    };
    let m = Sine {
        freq: 150. * Hz,
        option: Default::default(),
    };
    autd.send((m, g)).await?;

{
    // GainSTM requires `autd3_protobuf::lightweight::IntoLightweightGain::into_lightweight()`
    use autd3_protobuf::lightweight::IntoLightweightGain;
    let stm = GainSTM {
        gains: vec![
            Null {}.into_lightweight(),
            Focus {
                pos: center,
                option: Default::default(),
            }
            .into_lightweight(),
        ],
        config: 1.0 * Hz,
        option: Default::default(),
    };
    autd.send(stm).await?;
}

{
    // group_send requires `autd3_protobuf::lightweight::Datagram::into_lightweight()`
    use autd3_protobuf::lightweight::Datagram;
    autd.group_send(
        |dev| Some(dev.idx()),
        std::collections::HashMap::from([
            (0, Null {}.into_lightweight()),
            (
                1,
                (
                    Sine {
                        freq: 150. * Hz,
                        option: Default::default(),
                    },
                    Focus {
                        pos: center,
                        option: Default::default(),
                    },
                )
                    .into_lightweight(),
            ),
        ]),
    )
    .await?;
}

    println!("Press enter to quit...");
    let mut _s = String::new();
    std::io::stdin().read_line(&mut _s)?;

    autd.close().await?;

    Ok(())
}

Dartからの使用例は, autd3-appのリポジトリを参照されたい.