Other articles


  1. M5Stack-IDF = ESP-IDF + arduino の仕掛け

    M5Stack-IDFの仕掛け

    M5Stack-IDFはESP-IDFでArduinoとM5Stackのライブラリを使う環境を提供しています。実はESP-IDFは外部ライブラリを追加して使うメカニズムを持っていてM5Stack-IDFはそれを利用します。 使える外部ライブラリは内部ライブラリとの相性である程度制限されます。

    ESP-IDFはビルド(make)時に決め打ちのディレクトリとそのサブディレクトリを見に行きそこにcomponent.mkという名前のファイルがあるかどうか調べます。 もしあるとそれぞれのcomponent.mkの中にある指示をビルドへの指示として追加します。 ESP-IDFのサンプルプログラムを見ると必ずmain/component.mkがあってたいていは中身は空です。 この場合は単にここにもソースがあるよという意味になります。 少し複雑なライブラリでよく使われるのは

    COMPONENT_ADD_INCLUDEDIRS := include src
    COMPONENT_SRCDIRS := src
    CXXFLAGS += -fno-rtti -Wno-error=unused-value
    

    の3つの変数あたりでこの例の場合component.mkのあるディレクトリ下のsrcの中にソースがあり、includeとsrcの2つのディレクトリをインクルードのサーチパスに加え、c++でのコンパイル時にオプション -fno-rtti -Wno-error=unused-value を追加することを指示しています。 arduino-esp32にはさらに複雑な指示のあるcomponent.mkがあります。

    決め打ちのディレクトリとしてmakeするディレクトリの中にあるmainとcomponentsがあります。 なのでcomponentsにいろいろなライブラリを並べライブラリのルートとなるところに各ライブラリに対応する component.mkを置いてやればライブラリ・コンポーネントの追加ができるというわけです。 例えば

    .
    ├── Makefile
    ├── README.md
    ├── components
    │   ├── arduino …
    read more
  2. "Aircraft Control and Simulation (3rd ed.)" メモ

    Aircraft Control and Simulation

    Book cover of Aircraft Control and Simulation

    を読んでのメモです。 この分野まったくの素人です。

    Ch1. The Kinematics and Dynamics of Aircraft Motion

    航空機の運動を表すのに必要な座標系、そこでの回転や並進と座標変換についての話。古典力学と地球の形状や物理の基礎知識。

    Ch.2 Modeling the Aircraft

    ベーシックな航空力学とそれに基いた航空機のモデル。モデルは線形または非線形の微分方程式あるいはその係数のセット(derivatives)。 実際は複数テーブル化される。 簡単なものだとテーブルが十数個だがF22のsimulationなんかだと数千テーブルが必要で総データポイントは2-300万項にも及ぶらしい。

    Ch.3 Modeling, Design, and Simulation Tools

    古典的な制御の基礎とその航空機simulationでの適用例。次章への準備

    'state-spaceモデル' 'state equation' 'network transfer function' 'Bode plot' '数値積分 Runge-Kutta' 'steady-state flight' 'feedback control' …

    read more
  3. "Geometric Algebra for Computer Science" 紹介

    Geometric Algebra 幾何学的代数

    これは幾何学的代数をテーマにした本

    "Geometric Algebra for Computer Science", Leo Dorst, Daniel Fontijne, Stephen Mann (ISBN 9780123749420)

    の紹介のために書きました。 この本は幾何学的代数の導入から応用までを扱っていますがその内容や語り口に至るまでも素晴らしくいままでに読んだ中でもとびきり良い本です。 レビューといった類ではなくこの本の題材となっているものを本の切り口に沿って説明できればとはじめたのですが私の力ではとても難しいと思い知りました。 ですがこの並外れた本の内容や雰囲気まではかなわなくてもそのかけらでも伝えられればうれしいです。

    幾何学的代数(Geometric Algebra)は幾何学的な対象がつくる代数系だといえます。 この代数系は幾何学積(geometric products)に基づいています。幾何学積の実際の扱いは簡単とはいえませんがその基本的な概念は意外に簡単で初等的でさえあります。

    natural

    つまり基本的なアイデアは内積と面積などを組にして一度に扱うと話がむしろ簡単になる、ということです。 こういうことはよくあることですよね。

    この幾何学積は空間やもっと高い次元へも拡張できます。 それには向きのついた平行四辺形や平行六面体の拡張概念"k-blade"と内積の拡張概念"contraction"(縮約)が必要になります。

    前者はベクトルu,vでできる向きのついた平行四辺形(面積要素)をu^vと書いて2-bladeと呼び、u,v,wが作る体積要素を3-blade u^v …

    read more
  4. Visual yaw estimation

    以前紹介した 室内測位システム ではフレームの姿勢をMAVLinkで貰ってるんですが室内なのとコアレスモーターがついてるせいでフレームに載せているコンパスがくるってしまい、それで得られるyawの値も酷いものなので代わりに天井のカムからみたマーカーで推定できるヘッドの方向を使っています.

    一般には斜め上からみることになるので頭と尾のマーカーがちょうど南北を向いているように見えても機体が水平でないと実際には南北を向いていません. 絵で書くとこんな感じになります

    figure

    wが機体の頭と尾のマーカーを結んだ直線の方向でカムからこれをみると方向がvであるかのように見えています. 実際は真上から見た方向v'をpitchの分だけ回転したのがwなわけです. 斜めになった緑の面Hはカムやvやwを含む平面です.

    なので問題は見かけの方向を機首の上げ下げの情報で修正する、つまり

    vとpitchからwを求める

    になります. 通常このような問題は回転行列や球面角で計算するのだと思うのですがgeometric algebraを使って求めることができます.

    Adjust yaw

    図のようにvをvとz-軸方向でできる面内でpitchだけ回転した黄色のベクトルの終点をPとしてこの点を通って水平に球上を回る円周Kを描きます. wの終点はK上にあるはずです. vとwを含む面Hはvとカムから球の中心への方向uとを含む面でもあるのでKとHの2つの交点のどちらかの表す方向がwになります. これらの操作はgeometric algebraでの簡単な操作に対応していてlibvsrだと

    auto bi = v ^ Vec(0, 0, 1);
    auto rop = Gen::rot(bi*(-pitch_angle/2));
    auto H = (PT(0, 0, 0) ^ v ^ u ^ Inf(1)).dual();
    auto K = v.sp(rop …
    read more
  5. 貧者的局所測位系 The versorer's apprentice

    小さい機体でもSLAMこそが未来だと思うもののさすがに私では手がでないので貧者的局所測位系と名付けて天井に貼り付けたOpenMV cam+魚眼レンズとフレームからの情報を合わせてフレームにのせたマーカーの水平位置を推計するというのを作っています.

    OpenMV cam M7 + fish-eye + esp32 OpenMV ide

    魚眼レンズで得られるイメージセンサー上のマーカーの位置からcamからの方向を計算してマーカーの高さの情報をヒントにマーカーのcamを基準にした水平位置をだしてます. このセンサ上のマーカーの位置から3Dの方向を計算するところはいわゆるステレオグラフィックプロジェクション(立体射影)になっていて、三角関数や線形代数を使って計算できます.

    前置きが長くなりましたがフレームの水平位置を求めるところまでをgeometric algebraを使ったらどうなるか試してみました.

    auto pointO = Construct::point(0,0,0);
    auto pointP = Construct::point(0,0,-h);
    auto v = - Vec(x,y,-1) * Vec(0,0,1) / Vec(x,y,-1);
    auto line = pointO ^ v ^ Inf(1);
    auto dlp = (pointP <= Drv(0,0 …
    read more
  6. A tiny c/c++ example of MAVLINK library howto

    MAVLink をc/c++プログラムから使う簡単な例です. MAVLinkの基本的なインストールや使い方については mavlink github のREADME.mdにある通りですなのですがc/c++プログラムから使う場合にはheaderだけでできている c_library_v2 を使うのがお手軽です.

    • STEP.1 git clone https://github.com/mavlink/c_library_v2.git
    • STEP.2 cloneしたc_library_v2をどこかに置いてそれがc/c++プログラムのincludeパスに入るようにします. これで準備はokです.

    基本的には

    #include <common/mavlink.h>
    

    でいろいろなMAVLinkのライブラリ関数が使えるのですが場合によってはそれだけではダメな時があります. 例えばtcpなどでMAVLimkのパケットをやり取りしたいときは上のREADME.mdに書いてあるようにMAVLINK_USE_CONVENIENCE_FUNCTIONSを定義するのですがこの場合には補助的な宣言が少しだけ必要です.

    arduinoのWiFiClientというtcp clientのライブラリクラスといっしょに使った時の例です.

    #undef F
    #include <mavlink_types.h>
    #define MAVLINK_USE_CONVENIENCE_FUNCTIONS 1
    #define MAVLINK_SEND_UART_BYTES send_tcp_bytes …
    read more
  7. hachidori - APM on PC with remote sensor/actuators

    hachidori

    hachidori はPC上で走らせたArduPilotで制御する実験的なリモートセンサ/アクチュエータで, ArduPilotプロジェクトへの寄与を目的に始まったDCoJAによる小さなプロジェクトです.

    私はDCoJAのメンバーであるドローンワークス社のコントラクターとしてArduPilotを同社が開発していたFCにポーティングする作業を行っていたのですがhachidoriはその中で派生したプロジェクトでした. 私とドローンワークス社とのコントラクトはすでに終了していますがオープンなプロジェクトとしてhachidoriの開発を続けています. プロジェクトの成果はDCoJAを通じてソフトウェアやプロトタイプの回路図などがオープンソースとして公開されています.

    scheme

    hachidoriからみるとArduPilotはセンサーデータを受け取りアクチュエータへの指示としてPWMの値を返すUDPサーバーです. このようなリモートセンサ/アクチュエータは実に古典的なアイデアですが,このスキームには大小様々な問題があります.

    とりあえずトイドローンタイプのhachidoriの飛行はこんな感じです:

    test flight

    これはstabilizeモードです. APM(ArduPilot)はうまく姿勢を制御できているように見えます. arducopterはlaptop PCのUbuntu 4.4.0-lowlatencyカーネル上で動かしています.

    250mmフレームにのせた別のhachidoriとAPMが動いているホストPCです:

    250frame 250 and PC

    実験的なhachidori用ドライバを含んだArduPilotのソースツリー等はDCoJAのgithubリポジトリ中のardupilotのhachidoriブランチにあります.

    hachidoriのファームウェアはesp-idf上のapplicationになっています. テストやコンフィグレーションのためのPC上の小さなUDPサーバーがjunkyardの中にあります. b3testはセンサーデータの表示やモーターのテストのためのサーバー, b3confは設定や定数などをhachidoriに書きこむためのサーバーです.

    レイテンシ latency

    このようなスキームでの大きな問題の一つがレイテンシです. ご存知のように私達が普通に目にするほとんど全ての無線プロトコルはレイテンシに重点を置いていません. Wi-Fiを除けばそれらはいつも低消費電力が歌い文句ですしWi-Fiはスループット優先です. これらのプロトコルには再送という操作が存在することが多くこれがレイテンシの大きな原因となっています. 物理的データを再送するとリアルタイム性を失いあまり意味がない場合があります. ドローンのIMUから得られるデータが0.2秒遅れて送られて来た場合それは制御にどの程度役立つでしょうか? このケースでは再送などせずにさっさと次のデータを送って欲しいのですがそのようなプロトコルは一般的ではなく、またWi-FiやBTのようにある程度オープンなものはありません …

    read more
  8. nRF24L01+ and ESP32

    Nordic semiconductorのトランシーバーnRF24L01+をESP32にSPI接続して実験してみました

    nrf24 spiclock to cs hold

    対抗しているのはRaspiとnRF24L01+の組でそちらは

    http://tmrh20.github.io/RF24/

    にあるライブラリやプログラムを使いました.

    このトランシーバーはBTやWiFiではなくShockburstという形式で通信します. コンフィグでACKを必要としないたれ流しができそうなのでレイテンシが減らせるか試そうと思っています. リアルタイムのIMUデータとかなんども再送されてもあまりうれしくないしというのがもともとの動機です.

    SPIでつなぐこと自体は簡単でGPIOの番号を

    #define PIN_NUM_MISO 19
    #define PIN_NUM_MOSI 23
    #define PIN_NUM_CLK  18
    #define PIN_NUM_CS    5
    

    としています. SPI以外にnRF24L01+のRFトランシーバーをイネーブルするCEと割り込みの/INTを

    #define GPIO_NRF24_INT  GPIO_NUM_22
    #define GPIO_NRF24_CE   GPIO_NUM_21
    

    につなぎました. SPIのコンフィグは

    spi_bus_config_t buscfg={
        .miso_io_num=PIN_NUM_MISO,
        .mosi_io_num=PIN_NUM_MOSI,
        .sclk_io_num=PIN_NUM_CLK,
        .quadwp_io_num=-1,
        .quadhd_io_num …
    read more
  9. Madgwick filter 自分用メモ

    Madgwick filter(sensor fusion)のペーパーmadgwick_internal_report.pdfを再読してのメモ. 完全に自己流の理解です. madgwick_internal_reportは

    Open source IMU and AHRS algorithms

    にあります.

    Quaternionについてはわかりやすい解説がたくさんあるので詳しいことはパス.

    ただ次のことに注意:

    絶対値1のQuaternion q, q'を3次元球面上の点だと思うとq'=-qでない限り

    (t q + (1-t) q')/|t q + (1-t) q'|

    where 0 <= t <= 1 が球面上q,q'間の最短コース(測地線)になる. 2次元球面上の大円と同じ感じ.

    で、ノイズのこととかいったん忘れて

    • ジャイロで角速度がわかるので微小時間をかけると微小角変位つまり微小回転がわかる
    • それを現在までの回転に続けると微小時間後の回転q'が推定できる
    • 一方初期の方向から回転で得られた方向と加速度計やコンパスでわかる現在の方向の差が最小になるような回転qを勾配降下法で探す
    • これらの回転の推計(あまり変わらないに違いない)をQuaternionで表しておいてそれらを結ぶ(短い)測地線上に最良の答えがあるはずだと考える
    • t q …
    read more

Page 1 / 2 »

links

social