クイックスタート - shinolab/autd3-library-software Wiki

Original URL: https://github.com/shinolab/autd3-library-software/wiki/クイックスタート

最終更新日: 2021/10/14

1. 準備

この文章では, git, CMakem, 及び, Visual Studioを使用します. なお, OSはWindows 10を使用します. 他のOSの場合は適宜読み替えてください.

また, npcapをWinPcap API-Compatible Modeでインストールしておいてください (Windowsのみ).

本サンプルで使用したソフトウェアのversionは以下のとおりです.

まずは, プロジェクト用のフォルダを適当に作成しましょう. ここでは, 仮にautd3_sampleとします

mkdir autd3_sample
cd autd3_sample

次に, CMakeLists.txt, main.cppファイルを作成します.

└─autd3_sample
        CMakeLists.txt
        main.cpp

次に, 最新のバイナリを以下のURLからダウンロードしてきます. https://github.com/shinolab/autd3-library-software/releases

ダウンロードしたものを解凍して, includeフォルダとlibフォルダをautd3_sampleにコピーします.

└─autd3_sample
    │  CMakeLists.txt
    │  main.cpp
    ├─include
    └─lib

次に, Eigen3をダウンロードしてきます. カレントディレクトリをautd3_sampleに変更してサブモジュールとして追加します.

git init
git submodule add https://gitlab.com/libeigen/eigen.git eigen
cd eigen
git checkout 3.4.0
cd ..

あるいは, 直接Eigen3 をダウンロードしてきて, autd3_sampleフォルダ以下に置いても良いです. autd3で使用しているversionは3.4.0です.

└─autd3_sample
    │  CMakeLists.txt
    │  main.cpp
    ├─include
    ├─lib
    └─eigen
        ├─bench
        ├─blas
        ├─ci
        ├─cmake
        ...

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

cmake_minimum_required(VERSION 3.16)

project(autd3_sample)
set (CMAKE_CXX_STANDARD 17)

add_executable(main main.cpp)

target_compile_definitions(main PRIVATE _USE_MATH_DEFINES)
target_link_directories(main PRIVATE lib)
target_include_directories(main PRIVATE include eigen)

if(WIN32)
  target_link_directories(main PRIVATE lib/wpcap)
  target_link_libraries(main autd3 soem_link Packet.lib wpcap.lib ws2_32.lib winmm.lib)
elseif(APPLE)
  target_link_libraries(main pcap)
else()
  target_link_libraries(main rt)
endif()

if(WIN32)
    set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT main)
endif()

そして, buildディレクトリを作成して, ビルドします.

mkdir build
cd build
cmake .. -G "Visual Studio 16 2019" -A x64

(CMake GUIを使用する場合はsource code場所をautd3_sample, ビルド場所をautd3_sample/buildと指定して, "Generate"してください.) これで, buildディレクトリ以下にautd3_sample.slnが生成されているはずです. これを開いてください.

2.AUTDの接続と単一焦点

まず, AUTD3とPCをEthernetケーブルでつなぎ, AUTD3に24V電源を接続します. ケーブルは真ん中に指します. 詳しくは https://github.com/shinolab/autd3-library-software/wiki/Device-Information を参照ください.

次に, main.cppを以下のように書き換えます.

#include <iostream>

#include "autd3.hpp"
#include "autd3/link/soem.hpp"

using namespace std;
using namespace autd;

string get_adapter_name() {
  size_t i = 0;
  const auto adapters = link::SOEM::enumerate_adapters();
  for (auto&& [desc, name] : adapters) cout << "[" << i++ << "]: " << desc << ", " << name << endl;

  cout << "Choose number: ";
  string in;
  getline(cin, in);
  stringstream s(in);
  if (const auto empty = in == "\n"; !(s >> i) || i >= adapters.size() || empty) return "";

  return adapters[i].name;
}

int main() try {
  auto autd = Controller::create();

  autd->geometry()->add_device(Vector3(0, 0, 0), Vector3(0, 0, 0));

  const auto ifname = get_adapter_name();
  auto link = link::SOEM::create(ifname, autd->geometry()->num_devices());
  autd->open(std::move(link));

  autd->clear();

  const auto firmware_info_list = autd->firmware_info_list();
  if (firmware_info_list.empty())
    std::cerr << "Failed to read firmware information of some devices. You probably use firmware v1.8 or earlier." << std::endl;
  for (auto&& firm_info : firmware_info_list) std::cout << firm_info << std::endl;

  autd->silent_mode() = true;

  const auto focus = Vector3(TRANS_SPACING_MM * ((NUM_TRANS_X - 1) / 2.0), TRANS_SPACING_MM * ((NUM_TRANS_Y - 1) / 2.0), 150.0);
  const auto g = gain::FocalPoint::create(focus);
  const auto m = modulation::Sine::create(150);
  autd->send(g, m);

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

  autd->close();

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

実行の際には, Visual StudioのConfigurationをDebugからReleaseに変更してください.

また, Linux/macを使用する場合は, 正常に実行するためにroot権限が必要な場合があります.

解説

まず, ここで, AUTD3をコントロールするControllerインスタンスを作成し, AUTD3デバイスの配置を教えます.

  auto autd = Controller::create();

  autd->geometry()->add_device(Vector3(0, 0, 0), Vector3(0, 0, 0));

add_deviceの第一引数が位置で, 第2引数が回転を表します. 今回は, AUTD3を原点に置き, 回転もさせませんので, すべて0を指定します.

AUTD3のローカル座標系は, 0番目の振動子の中心を原点とし, 長軸方向がx軸, 短軸方向がy軸で右手座標系を成します. 振動子の番号は以下を参考にしてください. https://github.com/shinolab/autd3-library-software/wiki/Device-Information

次に, AUTDとの接続タイプを選び, Controllerをオープンします.

  const auto ifname = get_adapter_name();
  auto link = link::SOEM::create(ifname, autd->geometry()->num_devices());
  autd->open(std::move(link));

ここでは, SOEMを使用します. ほかにも, TwinCATを使用するものがありますが, Windows限定なのと特殊なソフトウェアが必要となります.

link::SOEM::create()の第一引数はインターフェース名で, 第2引数は接続しているAUTD3デバイスの数です. インターフェース名は, Windowsの場合は, \Device\NPF_{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}のような文字列になります, 確認するのはひと手間かかるので, ユーティリティ関数get_adapter_nameを用意しました. 実行時に適当なものを選んで下さい. (macやLinuxの場合はifconfig等で確認することもできます.)

次に, AUTDデバイスの初期化を行います.

  autd->clear();

電源投入時と接続を切った時際に初期化されるのでclear()は呼ばなくても大丈夫かもしれません.

次に, ファームウェアのバージョンを確認します. これは必須ではないです. なお, 最新バージョンはv1.9です.

  const auto firmware_info_list = autd->firmware_info_list();
  if (firmware_info_list.empty())
    std::cerr << "Failed to read firmware information of some devices. You probably use firmware v1.8 or earlier." << std::endl;
  for (auto&& firm_info : firmware_info_list) std::cout << firm_info << std::endl;

v1.8以前のファームウェアを使用している場合は, firmware_info_listが空になる可能性があります.

次に, サイレントモードを指定します.

  autd->silent_mode() = true;

デフォルトではONになっているので, これも実際には呼ぶ必要はないです. OFFにしたい場合はfalseを与えてください. サイレントモードは, 振動子に与える位相・振幅パラメータをLPFに通すことで, 静音化を行っています (詳細).

最後に, 150HzのAM変調とデバイスの直上に焦点を生成するようにAUTDを駆動します.

  const auto focus= Vector3(TRANS_SPACING_MM * ((NUM_TRANS_X - 1) / 2.0), TRANS_SPACING_MM * ((NUM_TRANS_Y - 1) / 2.0), 150.0);
  const auto g = gain::FocalPoint::create(focus);
  const auto m = modulation::Sine::create(150);
  autd->send(g, m);

AUTDは個々の振動子を個別に振幅・位相制御できるようになっていますが, 上記のようにさまざまな収束ビームを出すためのユーティリティが用意されています. 上記のfocusはアレーの中心から直上150 mmを表します. (AUTDローカル座標系の原点が0番目の振動子の中心であることに注意してください.)

AUTDを止めて, 接続を解除するにはclose()を呼び出します.

  autd->close();

なお, 単に止めたいだけなのであれば, pause()関数が使えます.

次: 複数デバイスの接続