単一デバイスの駆動
ここでは, 一つのデバイスを駆動する方法について説明する.
依存プログラムのインストール
本チュートリアルでは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
一部機能は未サポート. 詳細はFirmware v10 vs v11を参照.