単一デバイスの駆動

ここでは, 一つのデバイスを駆動する方法について説明する.

依存プログラムのインストール

本チュートリアルではSOEMを利用する. Windowsを使用する場合, Npcapを「WinPcap API-compatible Mode」でインストールしておくこと.

なお, ファームウェアが古い場合, 正常な動作は保証されない. 本文章におけるファームウェアのバージョンはv11.0.0, または, v10.0.11が想定される. ファームウェアのアップデートははじめに/ファームウェアを参照されたい.

サンプルコード

まずは適当なプロジェクトを作成し, autd3ライブラリを依存関係に追加する. また, デバイスとの通信を行うautd3-link-soemライブラリも依存関係に追加する.

cargo new --bin autd3-sample
cd autd3-sample
cargo add autd3
cargo add autd3-link-soem

次に, src/main.rsファイルを編集し, 以下のようにする. これは単一焦点にのAM変調をかける場合のソースコードである.

use autd3::prelude::*;
use autd3_link_soem::{SOEMOption, Status, SOEM};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Open controller with SOEM link
    // Here, the AUTD3 device is placed at the origin
    let mut autd = Controller::open(
        [AUTD3 {
            pos: Point3::origin(),
            rot: UnitQuaternion::identity(),
        }],
        SOEM::new(
            // The first argument is a callback that is called when error occurs
            |slave, status| {
                eprintln!("slave[{}]: {}", slave, status);
                if status == Status::Lost {
                    // You can also wait for the link to recover, without exitting the process
                    std::process::exit(-1);
                }
            },
            // The second argument is a option of SOEM link.
            SOEMOption::default(),
        ),
    )?;

    // Check firmware version
    // This code assumes that the version is v11.0.0 or v10.0.1
    autd.firmware_version()?.iter().for_each(|firm_info| {
        println!("{}", firm_info);
    });

    // Enable silencer
    // Note that this is enabled by default, so it is not actually necessary
    // To disable, send Silencer::disable()
    autd.send(Silencer::default())?;

    // A focus at 150mm directly above the center of the device
    let g = Focus {
        pos: autd.center() + Vector3::new(0., 0., 150.0 * mm),
        option: FocusOption::default(),
    };

    // 150 Hz sine wave modulation
    let m = Sine {
        freq: 150 * Hz,
        option: SineOption::default(),
    };

    // Send data
    autd.send((m, g))?;

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

    // Close controller
    autd.close()?;

    Ok(())
}

そして, これを実行する.

cargo run --release

Linux,macOS使用時の注意

Linux, macOSでは, SOEMを使用するのに管理者権限が必要になる. その場合は,

cargo build --release && sudo ./target/release/autd3_sample

とすること.

依存プログラムのインストール

本チュートリアルではCMakeを使用するので, インストールしておくこと.

AUTD3クライアントプログラムの作成

まず, ターミナルを開き, 適当なディレクトリを用意する.

mkdir autd3-sample
cd autd3-sample

次に, autd3-sample以下にCMakeLists.txt, main.cppファイルを作成する.

└─autd3-sample
        CMakeLists.txt
        main.cpp

次に, CMakeLists.txtを以下のようにする.

cmake_minimum_required(VERSION 3.21)

project(autd3-sample)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.24.0") 
  cmake_policy(SET CMP0135 NEW)
endif()

include(FetchContent)
if(WIN32)
  FetchContent_Declare(
    autd3
    URL https://github.com/shinolab/autd3-cpp/releases/download/v30.0.1/autd3-v30.0.1-win-x64.zip
  )
  FetchContent_Declare(
    autd3-link-soem
    URL https://github.com/shinolab/autd3-cpp-link-soem/releases/download/v30.0.1/autd3-link-soem-v30.0.1-win-x64.zip
  )
elseif(APPLE)
  FetchContent_Declare(
    autd3
    URL https://github.com/shinolab/autd3-cpp/releases/download/v30.0.1/autd3-v30.0.1-macos-aarch64.tar.gz
  )
  FetchContent_Declare(
    autd3-link-soem
    URL https://github.com/shinolab/autd3-cpp-link-soem/releases/download/v30.0.1/autd3-link-soem-v30.0.1-macos-aarch64.tar.gz
  )
else()
  FetchContent_Declare(
    autd3
    URL https://github.com/shinolab/autd3-cpp/releases/download/v30.0.1/autd3-v30.0.1-linux-x64.tar.gz
  )
  FetchContent_Declare(
    autd3-link-soem
    URL https://github.com/shinolab/autd3-cpp-link-soem/releases/download/v30.0.1/autd3-link-soem-v30.0.1-linux-x64.tar.gz
  )
endif()
set(USE_SYSTEM_EIGEN OFF)
FetchContent_MakeAvailable(autd3 autd3-link-soem)

add_executable(main main.cpp)

target_link_libraries(main PRIVATE autd3::autd3 autd3::link::soem)

NOTE: 上記の例では, 依存ライブラリ (Eigen3) を自動的にダウンロードするようになっている. すでにEigen3がインストールされている場合, USE_SYSTEM_EIGENをONにすると, 自動ダウンロードを無効化し, インストール済みのものを使用できる.

また, main.cppを以下のようにする. これは単一焦点にのAM変調をかける場合のソースコードである.

#include <autd3_link_soem.hpp>
#include <iostream>

#include "autd3.hpp"

using namespace autd3;

int main() try {
  auto autd = Controller::open(
      {AUTD3{
          .pos = Point3::origin(),
          .rot = Quaternion::Identity(),
      }},
      link::SOEM(
          [](const uint16_t slave, const link::Status status) {
            std::cout << "slave [" << slave << "]: " << status << std::endl;
            if (status == link::Status::Lost()) exit(-1);
          },
          link::SOEMOption{}));

  const auto firm_version = autd.firmware_version();
  std::copy(firm_version.begin(), firm_version.end(),
            std::ostream_iterator<FirmwareVersion>(std::cout, "\n"));

  autd.send(Silencer{});

  Focus g(autd.center() + Vector3(0, 0, 150), FocusOption{});
  Sine m(150 * Hz, SineOption{});

  autd.send((m, g));

  std::cout << "press enter to finish..." << std::endl;
  std::cin.ignore();

  autd.close();

  return 0;
} catch (std::exception& ex) {
  std::cerr << ex.what() << std::endl;
}

次に, CMakeでビルドする.

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
cmake --build . --config Release

これで, 実行ファイルが生成されるので, これを実行する.

.\Release\main.exe
sudo ./main

トラブルシューティング

  • anaconda (miniconda) がactivateされている場合に, ビルドエラーになる可能性がある.
    • この場合, buildディレクトリを削除し, conda deactivateを実行したのち再びcmakeを実行する.

まず, ターミナルを開き, 適当なプロジェクトを作成し, AUTD3Sharpライブラリを追加する.

dotnet new console --name autd3-sample
cd autd3-sample
dotnet add package AUTD3Sharp
dotnet add package AUTD3Sharp.Link.SOEM

次に, Program.csを以下のようにする. これは単一焦点にのAM変調をかける場合のソースコードである.

using AUTD3Sharp;
using AUTD3Sharp.Utils;
using AUTD3Sharp.Link;
using AUTD3Sharp.Gain;
using AUTD3Sharp.Modulation;
using static AUTD3Sharp.Units;

using var autd = Controller.Open(
    [new AUTD3(pos: Point3.Origin, rot: Quaternion.Identity)],
    new SOEM(
        (slave, status) =>
            {
                Console.Error.WriteLine($"slave [{slave}]: {status}");
                if (status == Status.Lost)
                    Environment.Exit(-1);
            },
        new SOEMOption()
    )
);

var firmList = autd.FirmwareVersion();
foreach (var firm in firmList)
    Console.WriteLine(firm);

autd.Send(new Silencer());

var g = new Focus(
    pos: autd.Center() + new Vector3(0, 0, 150),
    option: new FocusOption()
);
var m = new Sine(
    freq: 150u * Hz,
    option: new SineOption()
);
autd.Send((m, g));

Console.ReadKey(true);

autd.Close();

そして, これを実行する.

dotnet run -c:Release

Linux,macOS使用時の注意

Linux, macOSでは, SOEMを使用するのに管理者権限が必要な場合がある. その場合は,

sudo dotnet run -c:Release

とすること.

pyautd3ライブラリのインストール

pip install pyautd3
pip install pyautd3_link_soem

次に, main.pyを作成し, 以下のようにする. これは単一焦点にのAM変調をかける場合のソースコードである.

import os

import numpy as np
from pyautd3 import (
    AUTD3,
    Controller,
    Focus,
    FocusOption,
    Hz,
    Silencer,
    Sine,
    SineOption,
)
from pyautd3_link_soem import SOEM, SOEMOption, Status


def err_handler(slave: int, status: Status) -> None:
    print(f"slave [{slave}]: {status}")
    if status == Status.Lost():
        os._exit(-1)


if __name__ == "__main__":
    with Controller.open(
        [AUTD3(pos=[0.0, 0.0, 0.0], rot=[1, 0, 0, 0])],
        SOEM(err_handler=err_handler, option=SOEMOption()),
    ) as autd:
        firmware_version = autd.firmware_version()
        print(
            "\n".join(
                [f"[{i}]: {firm}" for i, firm in enumerate(firmware_version)],
            ),
        )

        autd.send(Silencer())

        g = Focus(
            pos=autd.center() + np.array([0.0, 0.0, 150.0]),
            option=FocusOption(),
        )
        m = Sine(
            freq=150 * Hz,
            option=SineOption(),
        )
        autd.send((m, g))

        _ = input()

        autd.close()

そして, これを実行する.

python main.py

Linux使用時の注意

Linuxでは, SOEMを使用するのに管理者権限が必要になる. その場合は,

sudo setcap cap_net_raw,cap_net_admin=eip <your python path>

とした後, main.pyを実行する.

python main.py

macOS使用時の注意

macOSでは, SOEMを使用するのに管理者権限が必要になる. その場合は,

sudo chmod +r /dev/bpf*

とした後, main.pyを実行する.

python main.py
1

一部機能は未サポート. 詳細はFirmware v10 vs v11を参照.