個人的な備忘録です.読んでも有用な情報はあまりないと思います.
えーと,前回の記事 を書いたおかげでブログ更新のハードルが下がりました.アホみたいな記事を書くのもいいもんですね.
どうやらRustがアツいらしいということはずいぶん前から見たり聞いたりしていたのですが,当時は仕様が安定していなかったり未実装の機能が多かったりと,開発しづらいイメージが先行してしまい,結局2020年に入るまでいじらずじまいでいました.ところが最近になってROS互換のフレームワークをRust実装しているらしいロボットベンチャーが現れたり,STM32をはじめとする ARM Cortex-M 系マイコン向けのサポートの整備が急速に進んだりしており,「乗るしかない!このビッグウェーブに!」と思い現在に至るわけです.
散々ほかのサイトでも解説されていると思いますが,私の知る限りのRustのアツい点を羅列すると,
などなど,高度(?)なアルゴリズムをマイコンに載せたい私としては,嬉しいことが満載なのです.
拙作の迷路探索ライブラリの移植を目論んでいます.
このライブラリは,迷路やグラフの情報の格納に必要な領域をコンパイル時に計算して静的にメモリ確保することや,グラフ表現やソルバ(A*アルゴリズム,幅優先探索など)の付け替えが可能であることが特徴です.途中まで順調に開発が進んでいたのですが,設計に致命的なミスがあったため結局完成しないまま放置されています(ひどい).
そういえばこのライブラリについての記事も書いてない(ひどい).
まずはRustを勉強します.
The Rust Programming Language を読んで,環境の構築(1章)と基本的な文法の習得(2,3章)を行いました.こいつはとにかく書き方が冗長丁寧なので,暇なときに読む分には良いと思います.はじめはなかなか先に進まず,英語を読むスピードが遅いからかなと思っていましたが,どうやらそうではなさそうだと気づいた私は3章で脱落しました.戦略的撤退です.
代わりに rustlings という入門例題集を一気にやりました.これを終えた頃には,なんとか調べながらRustを書けそうな気がしてきました.
rustlings完走 pic.twitter.com/ujfRm7NGuP
— ねこねこきーつね♪ (@tokoro10g) January 2, 2021
効率厨の私としては,bookはさらっと眺めてからrustlingsを進めつつ読んで,最後にまたbookに戻って補強すると良いのかなと思いました.でも最初からbookを読んだほうが楽という方もいるかもしれません(私は読んだだけでは頭に入らないもので…).
上級者には Rust Quiz なるマニアックな問題集もあるらしいので,モリモリ書けるようになったらやりたいです.
Rustの基礎が身についたところで,libamazeの2つの特徴に絞って,Rustでどう実現するか考えていきます.
グラフ表現やソルバの付け替え
Rustには継承の概念がありません.その代わりに,グラフやソルバのtraitsを定義して,boundsとして使ってやればよいはずです.
(用語の使い方が怪しい… 今のところそのように理解していますが,あってるよね…?)
静的アロケーション
こちらの要件が少し厄介かもしれません.組み込み向けのRustについては, The Embedded Rust Book に詳しくまとまっています(まだ全部読めていない…).これによると,ビルトインの固定長配列を利用するのはもちろんですが,VecやHashMapを利用したい場合は heaplessを利用するのが一般的な解決方法のように見えます.
しかし,ここで別の問題があります.stable版のRustではC++でいうテンプレート引数に定数を渡すことができないのです.
対応するものは,現状unstableなconstant genericsという機能ですが,執筆時点ではconstant genericsは指定された定数を演算して利用できないという機能の制約があります.libamazeでは,迷路のサイズから自動的にグラフのノード数を計算したり,サイズの整合性をチェックしたりする機能を実装しており,これをRustで再現するのは難しそうです.
no_std
を前提としてコードを書くConstant genericsで実現しようとした迷路・グラフのサイズのコンパイル時計算ですが,typenum crate を使ったり,マクロを組んだりすれば実現できるようです.しかし,いずれもハック的な解決方法でしっくり来なかったため,この機能については諦めることにし,迷路サイズは定数(幅・高さ32マス)とすることにしました.振り返ってみれば,C++版libamazeもこの W
というパラメータのせいで無駄に複雑になっていた節があるので,切り捨てて正解のような気がします.
また,libamazeでは迷路データの壁有無フラグの格納にビットフィールドを利用していましたが,これは modular-bitfield を使えば実現できそうです.
(๑•̀ㅂ•́)و✧
C++17漬けになってしまった私ですが,これでようやくモダンな言語に入門できそうです.進捗状況はなるべく記事にしていきたいと思うので,サボってたらつついてください.
リポジトリの予定地: tokoro10g/amaze
]]>昨日はアニキの「新・教材トレーサー」でした.
さて,皆さんが真面目な技術記事を書いているところ大変恐縮なのですが,私の個人的な趣味の記事を書かせていただきます.今年はマイクロマウスについて何もやっていないのです・・・
突然ですが,あなたにとってマイクロマウスの開発に最も必要なものは何でしょうか?
― 技術への情熱
― 互いに切磋琢磨する仲間
― エンコーダ付きモータを躊躇なく買える資金力
など,様々なものが思い浮かんできそうですね.
わたしの場合はというと・・・ そう,うまい飯です.「ロボコンダイエット」と言って,食費を削って部品代を捻出するという知り合いもいましたが,うまい飯なしにはやってられないと思いませんか?おいしいごはんのつくり方というタイトルのブログのマウサーもいるぐらいですから,これはマジです(?).
ということで(?)今回は,マイクロマウス製作に欠かせないうまい飯 麻婆豆腐 の作り方をご紹介します.(あくまでも試行回数の少ない自己流なので,この通りに作れば絶対うまい!ってわけではないです・・・)
調理中慌ただしかったので,通常のレシピ記事のように写真が豊富にないことをまずお詫びしておきます.写真撮りながら料理できる人すげえわ.GoProほしい.
まずは炸醤(ザージャン)を準備します.炸醤はひき肉を甜麺醤と醤油と酒でカラカラに炒めた肉味噌で,麻婆豆腐や担々麺,炸醤麺(ジャージャーメン)などに使用される,汎用的な食材です.
ここで,この記事で伝えたいこと1つめです.
ひき肉が安売りされていたら,大量に炸醤を作って冷蔵庫・冷凍庫にストックしておきましょう.
あつあつのごはんに乗せるだけで美味しいですし,うどん・卵黄・ねぎ・ラー油と絡めるだけでおいしいジャージャーうどんが出来上がります.日曜お昼のド安定メニューです.
材料:
材料はすごくわかりやすく,イッパンノゴカテイにあるものばかりですね.ないときは老抽王→濃口醤油,紹興酒→料理酒でも構いませんが,これを機に中国食料品店に行って日本語の通じる店員さんを探して買いましょう.
作り方はとても簡単です.
冷蔵の場合3,4日ぐらいで使い切ってください.冷凍もできます.
さて,本題の麻婆豆腐に戻りましょう.まずは材料の準備です.
豆腐
タレの工程で使用
煮込みの工程で使用
材料はすごくわかりやすく,イッパンノゴカテイにあr(
郫県豆板醤は麻婆豆腐の味を作るのにとても重要なので,これも中国食料品店などでなんとかして入手してください.ネットでも買えるっぽいです.
どうしても入手できない場合は,通常の豆板醤2に対して塩麹1を混ぜたものを代わりに使用しましょう.発酵感が加わってそれらしい味わいになります.
今回は,こちらのなんとも本場感の漂うもの(丹丹 红油郫县豆瓣酱)を使いました.熟成感と塩気が強めの豆板醤で,これだけを使うと少し塩辛くなるので,ユウキ食品の四川豆板醤(上記材料リストに分量記載)と合わせることにします.麻辣醤と合わせても良いと思います.
写真のように,左下の郫県豆板醤は右上の普通の豆板醤と比べて濃い茶色をしています.
それでは麻婆豆腐を調理していきましょう.工程はざっくり
タレづくりは豆腐を茹でる作業と並行できますが,慣れないうちは先にタレを準備してから豆腐を茹でましょう.
郫県豆瓣醤はこの写真のように塊がゴロゴロしていることが多いので,包丁で叩くようにして刻んでから使います.豆鼓も刻んでおきます.
冷たいフライパンにサラダ油を入れ,炸醤以外の材料を入れてから中火にかけます.唐辛子を入れる場合は,ハサミで輪切りにして種と一緒に入れましょう.ふつふつして油に赤色が移っていい香りがするまで炒めます.
炸醤を入れ,混ぜるようにして軽く炒めます.
ちょっとしたポイント:
ここまでの状態でタッパーに入れておくと,自家製麻婆豆腐の素になります.
0.5%程度(ちょっと薄い味噌汁ぐらい)の塩分濃度にしたお湯で豆腐を茹でます.豆腐がダンスを始めるのが茹で上がりのサインです.
参考: ダンスの様子(11:12あたり〜)
最初の工程で作ったタレの素を火を少し強めて温め,そこに鶏ガラスープと紹興酒を入れてひと煮立ちさせます.すでにおいしそう.
茹でた豆腐を入れて中火で2〜3分煮ます(茹でたお湯は入れないように).
混ぜるときは,フライパンをゆすりながらお玉の裏側で押し出すようにすると豆腐が崩れにくいです.8割方煮たらネギ(+お好みでニンニクの芽)と中国たまり醤油を入れて混ぜ,味をみます.ここで塩味を調整してください.
最後にとろみをつけます.火を止め,よく混ぜた水溶き片栗粉を少しずつ加えて混ぜます.水溶き片栗粉をすべて入れたら火をMAXにし,化粧油を回しかけて,30秒ほど焼くようにして片栗粉に火を通しながら混ぜます(ここが結構ポイントなんですが写真を撮れないほど慌ただしい).
花椒をたっぷり挽いてまぶせば完成です.
うまい・・・!
・
・
・
・
この記事で最後に伝えたいです.
新宿中村屋の麻婆豆腐の素を買え.
安定してうまい麻婆豆腐を作れて,しかも1パック200円ほど+豆腐とネギだけでごちそうが出来上がります.この記事の前半だけ見て食材店に走ってしまった方,ごめんなさい.
担々麺もおうちで作るとうまいです.今回最初に作った炸醤を使います.以下簡単なレシピ:
3. 鶏ガラスープ200mlを熱湯で作って2を溶かす
— ねこねこきーつね♪ (@tokoro10g) December 11, 2020
4. 麺と菜っ葉を湯切りし、炸醤、ネギみじん切り少々と盛り付け
5. ラー油を回しかけ、ごまと花椒を挽いて振る
味が薄い人はかき醤油を足してくれ。濃い人はお湯を足してくれ。
オイスターソースを入れるレシピもありますが,個人的にはかき醤油のほうが旨味がくどくなくて良いです.もっと醤油味を効かせたいという場合は,スープの素を減らして醤油を増やすか,かき醤油の一部を普通の醤油にしましょう.
香りの良いラー油を使うことも大事です.よく売られている赤色付きごま油ではだめです.簡単なので,ラー油を自作しても良いでしょう.
]]>同年代の社会人が,ボーナスでカメラをポチったり,CNCをポチったり,旅行に行ったりしているのを見て,わたしにもできると思った.後悔はしていない.
手滑らせてなにか買いたいけど今じゃない
— 🦋ところたん🦋 (@tokoro10g) December 10, 2019
Photon
— 舌下免疫taniho (@taniho_0707) December 10, 2019
判断力が低下している pic.twitter.com/pSPS5ZXzqu
— 🦋ところたん🦋 (@tokoro10g) December 10, 2019
即オチ3コマ.
まず,3Dプリンタには雑に大きく分けて2種類があります.
いわゆる3Dプリンタとして有名なのは1つめのタイプではないでしょうか.今回私が購入したのは,2つめの「光造形」と呼ばれる方式の3Dプリンタです.
通常,光造形方式は練り出す3Dプリンタと比較して製造コストが高く,ホビー用途としてはかなり高嶺の花[1]だったわけですが,ここ数年の間でLCD-SLAという簡易的な方式が確立されてから,かなり安価に手に入るようになりました.LCD-SLA方式は,UVレジン(ジェルネイルとかにも使うやつ)に紫外線を照射する際に,間に挟んだLCDスクリーンで積層パターンをマスクするという方式です.とはいってもお値段はだいたい5万円〜と,気軽に買える価格ではなかったのですが…
これを見て手を滑らせてしまったよ… [2]
購入したのはこちらのAnycubic Photon.500mLのレジン付きで 262ドル !!!定価が450ドルなのでおよそ4割引です.4割引といえばスーパーのおすしの最終値引きぐらいのお得感です.つまりめっちゃお得.
↓ 実際の出力結果とこれからどうしたいかについて書きます.
ということで博士論文発表会を年明けに控えた今,現実逃避がてら動かしてみようと思います.データは標準で用意されているテストパターン.UV照射時間のキャリブレーションに使えるようになっているらしいですが,とにかくワクワクしてプリントしたい気持ちでいっぱいです.
だいたい45分ぐらいで高さ15mm程度のモデルの出力が完了しました.これは未硬化のレジンを洗浄してからUVランプで追加の硬化をさせているシーンです.
— 🦋ところたん🦋 (@tokoro10g) December 21, 2019
光造形方式の特徴は,とにかく高精細な出力ができること.Photonも例にもれず素晴らしい出力結果が得られました.
わかりにくかったのでもう一枚 pic.twitter.com/svD0hfSO66
— 🦋ところたん🦋 (@tokoro10g) December 21, 2019
ただし,横からよく見るとまっすぐであるはずの部分が曲がっています.
うーん歪んでるなあ pic.twitter.com/A9tN0KJoFj
— 🦋ところたん🦋 (@tokoro10g) December 21, 2019
どうも硬化が全体的に甘いようです.原因をいろいろ考えてみたのですが,今回プリントしたテストパターンがPhotonの後継機であるPhoton S向けのものだったことが原因なのではないかと考えています.Photon SはUVランプの出力が強くなっていて,その分照射時間が短く設定されているためです.ということで,今度は自作のモデルをもう少し長い照射時間で出力してみようと考えています.
歪みを軽減する方法等については,こちらも参考になるんじゃないかなと思います.
今回届いたPhotonは,初期のPhotonとはハードウェア構成が異なります.海外のフォーラムでは俗にFauxton[3]と呼ばれています.ものとしては,基板が後継機のPhoton Sのものに変わっているだけです.どうも9月頃からこのタイプのものを送るようになったようですが,それ以降にゲットした人も旧来型を入手していたりしてよくわかりません.
見分け方はいろいろありますが,ざっくり以下を確かめれば良いでしょう.
ただし,Photon Sとは異なり搭載されているUVランプの出力は従来のPhotonのままですので,Photon S向けのpwsファイルをそのままプリントすると形が崩れます.
3万円と書きましたが,本体以外にもいろいろ必要になります.
以下,アフィリンクになっているので嫌な人は踏まないでください.
3万円はふつうに考えると高額ですが,ものづくりを趣味にしていると感覚が麻痺してしまって,これぐらいなら壊しても大丈夫と思ってしまうぐらいの微妙なラインかなと思います.Photonに関しては,保守パーツもそれなりに安く出回っているようですし.ということで,もっと便利にPhotonを使えるように改造を施したいなと考えています.
たとえばこんなの:
UVライトの説明書にあった怪レい日本语
— 🦋ところたん🦋 (@tokoro10g) December 21, 2019
ソフトウェアにおけるイースターエッグとは, 開発者がプログラム内に仕込んだ隠し機能や隠しメッセージのことです.MATLABにも様々なイースターエッグが仕込まれていて, どれも遊び心を感じるものになっています.
この記事では, その一例を独断と偏見によるランキング形式で紹介しようと思います.
fifteen
, xpbombs
なんと15パズルとマインスイーパがFigureウィンドウ上で遊べます.暇つぶしや休憩のおともにどうぞ(業務中に遊ばないでね).
コード:
実行結果:
コード:
実行結果:
ちなみに, コマンドウィンドウで
>> edit xpbombs |
と実行すると, ソースコードを見ることができます.GUIプログラミングをする上で参考になるので, 気になる人は読んでみると良いと思います.
logo
関数MATLAB芸人なら, 突然MATLABのロゴを出したくなったことが何度もあるはずです.そんなときに便利なのが, logo
関数です.
内部的には, membrane
関数を surf
を使ってプロットし, 大きさやライトを調整しています.詳細な手順が公式ドキュメントで示されています.
spy
関数spy
関数は本来行列のスパース性を可視化するための関数で, つぎのように使用します.
コード:
実行結果:
引数なしで実行すると, なぜか犬の顔が表示されます.
コード:
実行結果:
この spy
関数は, 本来の使い方以外にも面白い使い方があります.非ゼロの要素がある部分にドットが打たれるため, 簡単なドットマトリクスディスプレイとして使用することができます.これを応用すると, Conwayのライフゲームがこんな感じで実装・表示できます.
コード:
実行結果:
上記のコードはここに書いてあったものをゴルフして作りました.
image
関数image
関数を引数なしで実行すると…
コード:
実行結果:
逆さまになった男の子の顔が表示されます.ちょっとしたホラーです.
実はこの画像にはさらに秘密があって, 各画素のdoubleの値のうち53ビットをbitrotateすると, 隠し画像が現れるらしいです.説明が結構面倒なので, 詳細はこちらをご覧ください.
why
関数why
関数は上記に挙げた関数とは違い, 特にこれといった用途のない関数です.インパクトには欠けますが, これを知っている人は結構なMATLAB通だと思います.
why
を実行すると, 予め用意された語句を組み合わせたへんちくりんな文が表示されます.
これを使った実用的なコードを何か考えられるでしょうか? 思いつく人がいたら教えてください.
いかがでしたか?皆さんはいくつ知っていましたか?
ほかにもバージョンごとにいろいろな隠し要素があるようなので, 探してみると面白いのではないかと思います.それでは, よいMATLAB芸人生活をお送りください.
これは rogy Advent Calendar 2018 3日目の記事です.投稿時点で12/3の25時ですが許して.
3次元回転は, 航空機, 人工衛星, マルチコプターなどの姿勢制御や, 3DCG, VR/AR, コンピュータビジョンなど, 3次元の物体が関わるあらゆる技術に密接に関係しています.この強力なツールを習得すればできることがぐっと増えるのですが, 回転の順序を入れ替えられないことや, 回転の基準とする座標系の取り方によって結果が変わること, 数学的な表現が初学者には分かりづらいことなどを理由に, 敬遠されがちなのが実情です.実際, わたしも特に座標系にはさんざん苦しめられながら学習してきた経緯があり, 研究で取り扱っている今でもたまに混乱することがあるほどです.
これから書いていくシリーズ「たのしい3次元回転の世界」では, 3次元の回転に関わる事実や諸注意をなるべく図的に解説し, 扱う際の混乱や誤解をなくすことを目標にしています.特にクォータニオンに関しては, 「なぜこれで回転が表現できるのかわからない」「イメージがしづらい」という意見をよく目にしますので, そのあたりに関する解釈も書いていければと思います.筆者は数学的な深い知識には乏しい人間ですので, あまり数学的に立ち入った内容にはせず, 読み物としてためになるものが書ければと考えています.したがって, 数学的にプロパーな解説は, ほかの方の記事や論文等を参照していただくのが良いと思います.
今回は 3次元回転の特徴 について記します.3次元空間内の回転は, 2次元平面上での回転にない特徴を多くもっています.まずはその特徴に触れることで, 3次元の回転へのイメージを養うことからこのシリーズをはじめたいと思います.
2次元平面上の回転が1つのパラメータで表されるのに対して, 3次元空間内の回転は少なくとも3つのパラメータを用いて表現します.
任意の3次元の回転操作は, 3x3の回転行列で表すことができます.回転行列は, 3次元の姿勢を表すためにも使うことができます.基準となる座標系をゼロ回転(単位行列)とすれば, そこからの回転操作で姿勢を考えることができるからです.
このシリーズでは, 特にことわりがない限り $R$ を回転行列として扱います.
座標系とは, 雑に説明すると, 「こっちが上」「こっちが右」みたいな印を数学的に記述したものです.3次元の座標系は, ふつう $x, y, z$ という3つの直交する軸の組を使って表現します.
座標系は3次元空間内に異なるものを複数もつことができます.たとえば, 地面に固定した座標系を考えても良いし, 地面を走ったり空中を飛んだりするロボットに取り付けた座標系を考えても良いわけです.これらはそれぞれ異なる姿勢をもつ座標系になり, それぞれの座標系によって $x, y, z$ 軸の指す方向が異なります.
上図の座標系1の軸を座標系0で表現した方向ベクトル $e_x, e_y, e_z$ を横に並べて行列を作ると, これは回転行列になります.$$R_{01} = \left[ e_x\ e_y\ e_z \right]$$$R_{01}$ は, 座標系0 から見た 座標系1 の姿勢 を表す回転行列, というふうに読みます.
回転行列を使うと, 2つの座標系の間の姿勢の関係を表すことができるようになります.座標系0を地面に固定した座標系, 座標系1をロボットに取り付けた座標系と考えると, 地面から見たロボットの姿勢が $R_{01}$ で表されることになります.わかりにくければ $R_{地面,ロボット}$ などと書いてもおっけーです.
本来3次元空間内の座標系というと, 原点の位置も3次元空間内で自由に選べるのですが, このシリーズでは回転だけを考えるので, すべての座標系の原点は同一の点Oを用いることにします.また, 座標系0は動かない座標系を表すことにします.
先述の回転行列 $R_{01}$ は, 座標系1で表現されたベクトル $p_1$ を座標系0での表現に変換する役割を果たします.$$p_0 = R_{01}p_1$$このように, 添字をぷよぷよ式に消すような表現にしておくと便利です.
回転行列を掛け合わせることによって, 3次元の回転を合成することができます.$$R_{02} = R_{01}R_{12}$$一般に, この計算の順序は入れ替えることはできません.これについては次節で詳しく述べます.
紙面方向しか回転軸がない2次元平面上の回転とは異なり, 3次元空間内の回転は, 軸の選び方に大きな自由度があります.これに起因して, 3次元の回転にはとにかくややこしい性質がいくつもつきまといます.
本節では, 代表的な性質を3つ紹介します.
だんだん疲れてきたと思うので, 少し体操をして目を覚ましましょう.ふつうに体操をするだけではつまらないので, 3次元の回転に思いを馳せながらやってみることにします.かわいいゆかりさんにお手本を見せてもらいましょう.
まず片手を前に出して, 手のひらが横を向くようにしてください.
この状態から, 親指方向に90度回して手を上に上げてください.
つぎに, 手の甲の方向に90度回して, 手を横に出します.
最後に, 小指方向に90度回して, 手を前に戻します.
この3つの回転によって, 最終的に手のひらが上向きで前に出た状態になります.
今度はこの手順を逆にしてやってみましょう.もう一度最初の状態に戻します.
今度は, はじめに小指方向に90度回して手を下に下げてください.
つぎに, 手の甲の方向に90度回して, 手を横に出します.
最後に, 親指方向に90度回して, 手を前に戻します.
今度は手のひらが下を向いています.
あれ, 回転の操作の順序を変えただけなのに, 最終的な結果が変わってしまいました.この事実は, 行列の非可換性という性質の表われです.$$R_{02} = R_{01}R_{12} \neq R_{12}R_{01}$$同じ軸まわりの回転であれば, 隣同士の順序を入れ替えても問題ありませんが, それ以外の場合は結果の姿勢が異なるものになります.
ちなみに2次元平面上の回転の場合は, 回転軸が平面に垂直な方向の1つしか存在し得ないのでこのようなことは起こらず, 最初に右回りに回しても左回りに回しても最終的に同じ結果が得られます.むしろ2次元平面上の回転の方が特殊だということに気づいていただければと思います.
先ほどの例では, 手の指の向きを基準にした手の回転を行っていました.今度は, 顔の向きを基準にして同様に手を回してみようと思います.
まずはじめに, 先ほどの最初の状態と同様に片手を前に出して, 手のひらが横を向くようにしてください.この状態で, 顔の向きと手の向きの対応関係を取ります.
手の向き基準 | 顔の向き基準 |
---|---|
親指方向への回転 | 頭頂方向への耳軸まわりの回転 |
小指方向への回転 | あご方向への耳軸まわりの回転 |
手の甲方向への回転 | もともと手の甲が向いていた方向への首軸まわりの回転 |
ちょっとややこしいですがご容赦ください.
では回していきましょう.この状態から, 小指方向に対応するように, 耳軸まわりにあご方向へ90度回します.
つぎに, もともと手の甲が向いていた方向に首軸まわりに90度回します. 手をひねるような動作になります.
最後に, 耳軸まわり頭頂方向に90度回します. 手を元の位置に戻してくるような動作になります.
さて, やってみて気づくことがありませんか?鋭い方はお気づきかもしれませんが, 顔の向きを基準に回転を行うと, その逆順で手の向きを基準に回転を行った際と同じ結果になります.これはほかの回転パターンでも常に成り立ちます.
回転する物体(手)を基準にする場合と, 動かない物体(顔)を基準にする場合にはこのような関係があります.
実は, どちらの回転も数式で表現すると$$R_{03} = R_{01} R_{12} R_{23}$$という全く同じ回転行列の積で表現することができます.
より一般的には, 行列を左右どちらからかけ合わせるかによって, 回転の基準とする座標系を以下のように選ぶことができます.もとの姿勢を $R$, 与える変換を $R_\mathrm{trans}$ とします.
左からかける場合(絶対変換)$$R_{\mathrm{abs}} = \color{red}{R_\mathrm{trans}} R$$この操作は, 顔の向き(動かない座標系)を基準にした回転操作に対応します.
右からかける場合(相対変換)$$R_{\mathrm{rel}} = R \color{red}{R_\mathrm{trans}}$$この操作は, 手の向き(動かした後の座標系)を基準にした回転操作に対応します.
先ほどの例ですと,$$\begin{align*}\underbrace{R_{03}}_{\text{初期状態からみた終端状態の姿勢}} &= \underbrace{R_{01}}_{\text{親指方向}}\ \underbrace{R_{12}}_{\text{手の甲方向}}\ \underbrace{R_{23}}_{\text{小指方向}}\\&= \underbrace{R_{01}}_{\text{耳軸まわり上方向}}\ \underbrace{R_{12}}_{\text{首軸手の甲方向}}\ \underbrace{R_{23}}_{\text{耳軸まわり下方向}}\\\end{align*}$$のように対応しています.
先ほどの腕の回転の順序を変える例を考えると, どちらの場合も親指方向の変化量の積算値は 90-90 で 0 度, 手の甲方向は 90 度になります.この例から, 結果として異なる姿勢が得られるにもかかわらず, 同じ積算値(角速度の積分値)となる場合があるということがわかります.つまり, 角速度を単純に時間積分した数値を見ても, 物体が今どのような姿勢になっているかということは知ることができないのです.
このことは, 姿勢の時間変化がそのときの姿勢に大きく依存していることに起因しています.実際, 回転行列の時間微分 $\dot{R}$ は以下のような式になります.$$\dot{R} = R \widehat\omega$$ただし,$$\widehat\omega = \begin{bmatrix}0 & -\omega_3 & \omega_2\\\omega_3 & 0 & -\omega_1\\-\omega_2 & \omega_1 & 0\end{bmatrix}$$
今回は, 3次元の回転にまつわる性質について紹介しました.我々はこんなややこしい空間に住んでいて, しかも何も考えずにものの姿勢をいじれるって, なかなか驚きですよね.
書いたことをまとめると, 以下のとおりです.
次回は
まずはこちらをご覧いただきたい.
この人やばいですよ! pic.twitter.com/zoASnhPfAc
— 研磨子 (@tonkatsu_5mile) 2018年8月4日
…… おわかりいただけただろうか.
わからないと思うので説明すると, この様子はOculus Go上のDebianに映るターミナルを眺めながらテキストエディタで作業をしているところです.写真の人はわたしの後輩で, Oculus Goの上でDebianを走らせて, VR対応なVNCクライアントを自作して接続することで, バーチャルな空間上での作業を可能にしたパイオニアです.見た目はさながらlainの中盤に出てきて川に突っ込んで死んだやばい人(うろ覚え)のようです.
この取り組みのおもしろいポイントは, Oculus Go(とキーボード)だけですべてが完結するということです.ふつう, こういったヘッドマウントディスプレイはPCへの接続が前提ですが, Oculus Goは単体でゲームに必要な演算やコンテンツの再生ができます.要は実質レンズ付きAndroid端末みたいなものなので, アプリの開発さえできれば何でもありなのです.
これにめちゃくちゃ感銘を受けたので, 完全にアイディア丸パクりなのですが[1], なるべくセットアップが簡単になるようにわたしもチャレンジしてみました.最終的にはこんな感じになりました:
構成としては, 以下のようなものを使用しています.
Oculus Goは通常のHMDとは異なりケーブルがいらず, 中で処理もできるため, いつでもどこでも作業できることがとても良いポイントですね.もちろん, PC上のVNCサーバに接続すれば, より重い処理をさせたり, 動画を見ながらの作業なんかもできたりします.
セットアップ方法等の詳細な記事については, 以下をご覧ください(準備中です).
やったまま放置してしまっていたので, 今回はひとまず紹介だけ…
記事を書くことは了承してもらってます ↩
クォータニオンを拡張した概念として, Dual Quaternionというものがあります.これを使うと, クォータニオンで考えられる3次元の回転に加えて, 3次元の並進まで1つの枠組みで考えることができるというすぐれもので, ロボティクスやCGの分野でほそぼそと使われています.
今回はDual Quaternionの基礎と, 3次元の位置・姿勢のDual Quaternion表現, そして剛体の運動をDual Quaternionで記述する方法について書きます.
若干偏った事前知識が必要かもしれません.誤り等があればまさかりを投げてください.
クォータニオン(quaternion)は,
クォータニオンはつぎの規則を満たす基底 $1, i, j, k$ をもつ数 $a + bi + cj + dk$ です.$$i^2 = j^2 = k^2 = ijk = -1$$複素数の次元を拡張したような形をしています.クォータニオンは実数と3次元実ベクトルの組として表記されることが多いため, この記事でもその記法を使用することにします.$$\boldsymbol q = (q_0, \boldsymbol{q}_v) = (a, [b\ c\ d]^T)$$
Dual Quaternionの定義のために, 集合をいくつか定義しておきます[1].
定義 | 説明 |
---|---|
$\mathbb{H} = \{(q_0, \boldsymbol{q}_v) \mid q_0 \in \mathbb{R}, \boldsymbol{q}_v \in \mathbb{R}^3\}$ | クォータニオン全体の集合 |
$\mathbb{H}_u = \{ \boldsymbol q \in \mathbb{H} \mid \lVert \boldsymbol q \rVert = 1 \}$ | 単位クォータニオン全体の集合 |
$\mathbb{H}_v = \{\boldsymbol q \in \mathbb{H} \mid q_0 = 0\}$ | ベクトルクォータニオン全体の集合 |
クォータニオンを用いて回転を表現するには, 大きさが1の単位クォータニオンであることが重要です(詳しくは後述).
ベクトルクォータニオンは, スカラー部分が0でベクトル部分にのみ値を持つクォータニオンのことを指します.クォータニオンからベクトルクォータニオンを取り出す(スカラー部分を0にする)演算子を $\mathrm{vec}(\cdot)$ と表記します.
和・差
$ \boldsymbol q_1 \pm \boldsymbol q_2 = (q_{1,0} \pm q_{2,0},\ \boldsymbol q_{1,v} \pm \boldsymbol q_{2,v})$
内積
$ \boldsymbol q_1 \cdot \boldsymbol q_2 = q_{1,0}q_{2,0} + \boldsymbol q_{1,v} \cdot \boldsymbol q_{2,v}$
外積
$ \boldsymbol q_1 \times \boldsymbol q_2 = (0,\ q_{1,0}\boldsymbol q_{2,v} + q_{2,0}\boldsymbol q_{1,v} + \boldsymbol q_{1,v} \times \boldsymbol q_{2,v})$
クォータニオン積
$ \boldsymbol q_1 \otimes \boldsymbol q_2 = (q_{1,0}q_{2,0} - \boldsymbol q_{1,v} \cdot \boldsymbol q_{2,v},\ q_{1,0}\boldsymbol q_{2,v} + q_{2,0}\boldsymbol q_{1,v} + \boldsymbol q_{1,v} \times \boldsymbol q_{2,v})$
共役
$\boldsymbol q^\ast = (q_0, -\boldsymbol q_v)$
ノルム
$ \lVert \boldsymbol q \rVert = \sqrt{\boldsymbol q \cdot \boldsymbol q} = \sqrt{\boldsymbol q \otimes \boldsymbol q^\ast} = \sqrt{\boldsymbol q^\ast \otimes \boldsymbol q} = \sqrt{q_0^2 + \lVert\boldsymbol q_v\rVert^2}$
単位元
$\boldsymbol q_I = (1, [0\ 0\ 0]^T)$ に対して$$\boldsymbol q_I \otimes \boldsymbol q = \boldsymbol q \otimes \boldsymbol q_I = \boldsymbol q\\\boldsymbol q^\ast \otimes \boldsymbol q = \boldsymbol q \otimes \boldsymbol q^\ast = \lVert \boldsymbol q \rVert^2\boldsymbol q_I$$
単位円上の複素数は2次元の回転変換(と姿勢)を表わすことができますが, 単位クォータニオンは3次元の回転変換(と姿勢)を表現できます.回転角を $\theta \in \mathbb{R}$, 回転軸を $\boldsymbol\xi \in \mathbb{R}^3$ とするとき,$$\boldsymbol q = (\cos\frac\theta2, \boldsymbol\xi \sin\frac\theta2)$$によって回転を表現できます.
点の位置ベクトルを表すベクトルクォータニオン $\boldsymbol p = (0, \boldsymbol p_v)$ を $\boldsymbol q$ によって移すには, $\boldsymbol q \otimes \boldsymbol p \otimes \boldsymbol q^\ast$ というクォータニオン積を考えます.
符号違いの2つの単位クォータニオン $\pm \boldsymbol q$ が同一の回転を表すことに注意してください.$-\boldsymbol q$ は, $\boldsymbol q$ の回転軸軸ベクトル $\xi$ を逆向きにして $2\pi-\theta$ つまり $-\theta$ 回転させることを表していて, この回転はもとの $\boldsymbol q$ による回転と等価になります.また, 大きさが1であるということは, 変換の際に相手の大きさを変えないという性質を表しています.
二重数(dual number)はざっくり言うと複素数の別のバリエーションのようなもの[2]です.$\epsilon \neq 0, \epsilon^2 = 0$ となるような新しい基底を持ってきて $a + \epsilon b$ としたものが二重数です.
ちなみに二重数は行列を使って表すことができます[3].$$a + \epsilon b : \begin{bmatrix}1 & 0\\0 & 1\end{bmatrix}a + \begin{bmatrix}0& 1\\0 &0\end{bmatrix}b$$コンピュータで数値計算を行う際には, この表現が便利になることがあるらしいです.
自動微分[4]という面白い用途もあるようです.
ようやく本題です.Dual Quaernion(二重クォータニオン, 二重四元数)は, 二重数とクォータニオンをあわせたものです.$$\hat{\boldsymbol q} = \boldsymbol q_p + \epsilon \boldsymbol q_d$$ただし, $\boldsymbol q_p, \boldsymbol q_d \in \mathbb{H}$ で, $\boldsymbol q_p$ は primary part, $\boldsymbol q_d$ は dual part と呼ばれます.
定義 | 説明 |
---|---|
$\hat{\mathbb{H}} = \{ \boldsymbol q_p + \epsilon \boldsymbol q_d \mid \boldsymbol q_p, \boldsymbol q_d \in \mathbb{H}\}$ | DQ全体の集合 |
$\hat{\mathbb{H}}_u = \{ \hat{\boldsymbol q} \in \hat{\mathbb{H}} \mid \boldsymbol q_p \in \mathbb{H}_u, \boldsymbol q_p \otimes \boldsymbol q_d^\ast + \boldsymbol q_d \otimes \boldsymbol q_p^\ast = 0 \}$ | 単位DQ全体の集合 |
$\hat{\mathbb{H}}_v = \{\boldsymbol q \in \hat{\mathbb{H}} \mid \boldsymbol q_p, \boldsymbol q_d \in \mathbb{H}_v \}$ | ベクトルDQ全体の集合 |
単位DQのdual partにはノルムに関する制約がなく, 代わりにprimary partとdual partの可換性に関する条件が加わっています(ノルム1とは限らないということに注意してください).
あとで説明しますが, primary partで回転, dual partで並進に関する部分を表現できるようになり, 剛体の3次元位置・姿勢がDQの枠組みで扱えるようになります.
和・差
$ \hat{\boldsymbol q}_1 \pm \hat{\boldsymbol q}_2 = \boldsymbol q_{1,p} \pm \boldsymbol q_{2,p} + \epsilon (\boldsymbol q_{1,d} \pm \boldsymbol q_{2,d}) $
内積・ノルム
$ \hat{\boldsymbol q}_1 \cdot \hat{\boldsymbol q}_2 = \boldsymbol q_{1,p} \cdot \boldsymbol q_{2,p} + \boldsymbol q_{1,d} \cdot \boldsymbol q_{2,d}$
外積
$ \hat{\boldsymbol q}_1 \times \hat{\boldsymbol q}_2 = \boldsymbol q_{1,p} \times \boldsymbol q_{2,p} + \epsilon (\boldsymbol q_{1,p}\times \boldsymbol q_{2,d} + \boldsymbol q_{1,d} \times \boldsymbol q_{2,p})$
クォータニオン積
$ \hat{\boldsymbol q}_1 \otimes \hat{\boldsymbol q}_2 = \boldsymbol q_{1,p} \otimes \boldsymbol q_{2,p} + \epsilon (\boldsymbol q_{1,p}\otimes \boldsymbol q_{2,d} + \boldsymbol q_{1,d} \otimes \boldsymbol q_{2,p})$
共役
単位元
$\hat{\boldsymbol q}_I = \boldsymbol q_I + \epsilon \boldsymbol 0$ に対して$$\hat{\boldsymbol q}_I \otimes \hat{\boldsymbol q} = \hat{\boldsymbol q} \otimes \hat{\boldsymbol q}_I = \hat{\boldsymbol q}\\\hat{\boldsymbol q}^\ast \otimes \hat{\boldsymbol q} = \hat{\boldsymbol q} \otimes \hat{\boldsymbol q}^\ast = \lVert\hat{\boldsymbol q}\rVert^2\hat{\boldsymbol q}_I$$
さて, これでツールがようやく揃ったので, ここからは3次元空間上の剛体の運動をDQを用いて記述していきます.
運動を考える前に, まずはDQで剛体の位置・姿勢を表現します.ワールドに固定された座標系(慣性座標系)を $\Sigma_i$, 剛体に固定された座標系(ボディ座標系)を $\Sigma_b$ とします.慣性座標系からみたボディ座標系の姿勢を表すクォータニオンを $\boldsymbol q_{ib} \in \mathbb{H}_u$ , 慣性座標系から見たボディ座標系の原点の位置をクォータニオン $\boldsymbol p^i_{ib} \in \mathbb{H}_v$ を用いて表します.このとき, 剛体の位置・姿勢は$$\hat{\boldsymbol q}_{ib} = \boldsymbol q_{ib} + \epsilon \frac12 \boldsymbol p^i_{ib} \otimes \boldsymbol q_{ib}$$と書けます.また, ボディ座標系を基準に慣性座標系の原点からの位置ベクトル $\boldsymbol p^b_{ib}$ を取ることもできて, その場合以下のような式になります.$$\hat{\boldsymbol q}_{ib} = \boldsymbol q_{ib} + \epsilon \frac12 \boldsymbol q_{ib} \otimes \boldsymbol p^b_{ib}$$
$\boldsymbol p^i_{ib}$ と $\boldsymbol p^b_{ib}$ は意味が異なり, 一般に等しくならないことに注意が必要です.これらの間には以下の等式が成り立ちます.$$\boldsymbol p^i_{ib} \otimes \boldsymbol q_{ib} = \boldsymbol q_{ib} \otimes \boldsymbol p^b_{ib}$$この等式を用いることで $\boldsymbol p^i_{ib}$ と $\boldsymbol p^b_{ib}$ との間を行き来できます.
上記の式では, 剛体の位置があまり自明ではない形でdual partに格納されています.この位置・姿勢表現は, 純粋な並進と純粋な回転を表す2つのDQを合成したDQとして定義されています.
回転せずに $\boldsymbol p_{ib}$ だけ並進移動するDQは以下のようになります.$$\hat{\boldsymbol q}_L = \boldsymbol q_I + \epsilon \frac12 \boldsymbol p_{ib}$$同様に, 回転 $\boldsymbol q_{ib}$ しかしないDQは以下のようになります.$$\hat{\boldsymbol q}_A = \boldsymbol q_{ib} + \epsilon \boldsymbol 0$$
慣性座標系でボディ座標系を回転させてから, 慣性座標系でボディ座標系の原点を並進移動する変換[5]は,$$\hat{\boldsymbol q}_L \otimes \hat{\boldsymbol q}_A = \boldsymbol q_{ib} + \epsilon \frac12 \boldsymbol p_{ib} \otimes \boldsymbol q_{ib}$$と計算できます[6].このときの $\boldsymbol p_{ib}$ は, 慣性座標系で表現されたボディ座標系の原点の位置 $\boldsymbol p^i_{ib}$ に相当します.
同様に, 慣性座標系でボディ座標系の原点を並進移動させてから, 慣性座標系でボディ座標系を回転する変換[7]は,$$\hat{\boldsymbol q}_A \otimes \hat{\boldsymbol q}_L = \boldsymbol q_{ib} + \epsilon \frac12 \boldsymbol q_{ib} \otimes \boldsymbol p_{ib}$$と計算でき, このときの $\boldsymbol p_{ib}$ は, ボディ座標系で見た「慣性座標系の原点からボディ座標系の原点へのベクトル」$\boldsymbol p^b_{ib}$に相当します.
…なにやらややこしいですね.変換が可換ではないので, どうしてもこのようなややこしさが生じてしまいます.
ここで確認したように, $\boldsymbol p^i_{ib}$ と $\boldsymbol p^b_{ib}$ はそれぞれ違うものを指し示しています.したがって, 混同してしまうと座標を正しく表現することができなくなります.$\boldsymbol p^i_{ib}$ が物理的にわかりやすいのですが, 後述するように, こちらを採用すると今度は角速度がわかりづらくなります.
まずは回転のみに着目してみます.剛体の姿勢を表す単位クォータニオン $\boldsymbol q_{ib} \in \mathbb{H}_u$ の時間微分は, ボディ角速度ベクトルを表すクォータニオン $\boldsymbol \omega^b \in \mathbb{H}_v$ を用いて$$\dot{\boldsymbol q}_{ib} = \frac12 \boldsymbol q_{ib} \otimes \boldsymbol \omega^b$$と書けることが知られています[8].
オイラー角やロール・ピッチ・ヨー角を使用した姿勢表現の場合, 姿勢角の時間微分と角速度ベクトルとの間の変換が必要になりますが, クォータニオンを使えば現在の姿勢と角速度ベクトルのクォータニオン積という非常にシンプルな形で時間微分を書くことができます.しかも, 冒頭で説明したような特異点の問題もありません.
また, 別の角速度(空間角速度, spatial angular velocity)を使って$$\dot{\boldsymbol q}_{ib} = \frac12 \boldsymbol \omega^i \otimes \boldsymbol q_{ib}$$と書くこともできます.
機体に搭載するジャイロセンサで計測できるのはボディ角速度 $\boldsymbol \omega^b$ です.実用を考えると, 後者の式は少し使いづらくなります.空間角速度とボディ角速度の間には以下の関係が成り立つので, これを利用することで行き来することができます.$$\boldsymbol \omega^i \otimes \boldsymbol q_{ib} = \boldsymbol q_{ib} \otimes \boldsymbol \omega^b$$この式は, 先述した $\boldsymbol p^i, \boldsymbol p^b$ に関する式とも対応しています.
DQの時間微分もクォータニオンの時間微分と対応づいた形で書くことができます.DQにおける速度に対応する $\hat{\boldsymbol\omega}$ のことを, Dual Velocity と呼びます.
ボディ速度(body velocity)のベクトルクォータニオンを $\boldsymbol v^b = \dot{\boldsymbol p}^b_{ib} + \boldsymbol \omega^b \times \boldsymbol p^b_{ib} \in \mathbb{H}_v$ と定義します[9].泥臭く各成分を微分してきます.$$\begin{align*}\dot{\hat{\boldsymbol q}}_{ib} &= \dot{\boldsymbol q}_{ib} + \epsilon \frac12\left( \dot{\boldsymbol q}_{ib} \otimes \boldsymbol p^b_{ib} + \boldsymbol q_{ib} \otimes \dot{\boldsymbol p}^b_{ib} \right)\\&= \frac12 \boldsymbol q_{ib} \otimes \boldsymbol \omega^b + \epsilon \frac12\left( \frac12 \boldsymbol q_{ib} \otimes \boldsymbol \omega^b \otimes \boldsymbol p^b_{ib} + \boldsymbol q_{ib} \otimes \dot{\boldsymbol p}^b_{ib} \right)\\&= \frac12 \boldsymbol q_{ib} \otimes \boldsymbol \omega^b + \epsilon \frac12\left( \frac12 \boldsymbol q_{ib} \otimes (\boldsymbol \omega^b \otimes \boldsymbol p^b_{ib} - 2 \boldsymbol \omega^b \times \boldsymbol p^b_{ib}) + \boldsymbol q_{ib} \otimes \boldsymbol v^b \right)\end{align*}$$クォータニオン積の定義と, $\boldsymbol \omega^b, \boldsymbol p^b_{ib}$ がいずれもベクトルクォータニオンであることから, $\boldsymbol \omega^b \otimes \boldsymbol p^b_{ib} - 2 \boldsymbol \omega^b \times \boldsymbol p^b_{ib} = \boldsymbol p^b_{ib} \otimes \boldsymbol \omega^b$ が成り立つので,$$\begin{align*}\dot{\hat{\boldsymbol q}}_{ib} &= \frac12 \boldsymbol q_{ib} \otimes \boldsymbol \omega^b + \epsilon \frac12\left( \frac12 \boldsymbol q_{ib} \otimes \boldsymbol p^b_{ib} \otimes \boldsymbol \omega^b + \boldsymbol q_{ib} \otimes \boldsymbol v^b \right)\\&= \frac12 \hat{\boldsymbol q}_{ib} \otimes \hat{\boldsymbol\omega}^b\end{align*}$$となります.ただし, $\hat{\boldsymbol\omega}^b = \boldsymbol \omega^b + \epsilon \boldsymbol v^b$ とおきました.
同様にして$$\begin{align*}\dot{\hat{\boldsymbol q}}_{ib} &= \frac12 \hat{\boldsymbol\omega}^i \otimes \hat{\boldsymbol q}_{ib}\end{align*}$$も言えるのですが, 先述したように空間角速度 $\boldsymbol\omega^i$ は解釈がしづらく, また, 並進成分である $\boldsymbol v^i$ も $\dot{\boldsymbol p}_{ib}^i$ ではなく, 角速度 $\boldsymbol \omega^i$ と干渉する形になるため, 物理的な解釈が難しくなります.ボディ速度と空間速度は, 単にみる座標系が異なるだけではなく, そのベクトルが意味する物理的な量も異なります.詳しいことに関しては, 書籍[10]に詳しく書かれていますので, そちらを参照してください.
回転行列の単純な2階微分に物理的な意味がないのと同様に, クォータニオンの2階微分には特に物理的に有用な意味はありません.物理的に意味のある加速度・角加速度に対応するものは $\boldsymbol v, \boldsymbol \omega$ の時間微分で, これらが我々が扱うべきものです.
最も単純な運動方程式 $ma = F$ は, 運動量を $p = mv$ とすると,$$\dot{p} = F$$と書き直すことができます.これと同様の方法で, DQを使って並進と回転の運動量を定義し, そこから運動方程式を求めていきます.
DQによる運動量(dual momentum)の定義の仕方には複数の流儀があるようなのですが, 本稿では文献[11]のものを採用します.$$\hat{\boldsymbol h}^b = \hat M \hat{\boldsymbol \omega}^b = \boldsymbol h_L + \epsilon \boldsymbol h_A$$$\boldsymbol h_L, \boldsymbol h_A$ は, それぞれ並進・回転の運動量です.$\hat M$ は慣性行列に対応する演算子(dual inertia operator)で, 以下の操作を行うものです.$$\hat M \hat{\boldsymbol \omega}^b = \begin{bmatrix}1 & \boldsymbol 0\\\boldsymbol 0 & mI_3\end{bmatrix} \boldsymbol v^b + \epsilon \begin{bmatrix}1 & \boldsymbol 0\\\boldsymbol 0 & J^b\end{bmatrix} \boldsymbol \omega^b$$若干記号を乱用していますが, $\boldsymbol v^b, \boldsymbol \omega^b$ のベクトル部にそれぞれ質量と慣性テンソルをかけて, primary partとdual partを入れ替える操作を表しています.
Dual momentumを使ってDQで運動方程式を記述すると, 以下のようになります.$$\begin{align*}\dot{\hat{\boldsymbol h}}^b = \hat M \dot{\hat{\boldsymbol \omega}}^b &= \hat{\boldsymbol f}^b - \hat{\boldsymbol \omega}^b \times \hat M \hat{\boldsymbol \omega}^b\\&= \underbrace{\hat{\boldsymbol f}^b_u}_{\text{印加力}} - \underbrace{\hat{\boldsymbol f}^b_G}_{\text{重力}} - \hat{\boldsymbol \omega}^b \times \hat M \hat{\boldsymbol \omega}^b\end{align*}$$このように, 非常にコンパクトな形で運動方程式を書き表すことができます.通常であれば, 以下のようになります.$$M \begin{bmatrix}\dot{v}^b\\\dot{\omega}^b\end{bmatrix} = f^b - \begin{bmatrix}m \omega^b \times v^b\\\omega^b \times (J \omega^b)\end{bmatrix}$$……まあ, ほとんど変わらないわけですが, 遠心・コリオリ項がDQの演算によってぎゅっとまとまっただけでもありがたいものです.
また, ここまでで見てきたように演算はクォータニオンと対応する形になるので, 二重数の実装さえうまくできれば, 回転のみのコードから並進を含んだものへの移行は楽なのではないかと思います.
Dual inertia operatorにおいて, primary partとdual partが入れ替わっているのは, 計算上は理解できるのですが, 何か物理的・幾何的な本質に関連しているのでしょうか?何かご存知の方やピンときた方は教えてください.
記号の文字HはHamiltonの頭文字から来ています. ↩
いずれも二元数というものに分類されます ↩
この記事の本筋とは無関係ですが, 複素数も同様に行列表現ができます.$$a + i b : \begin{bmatrix}1 & 0\\0 & 1\end{bmatrix}a + \begin{bmatrix}0& -1\\1 &0\end{bmatrix}b$$この複素数の行列表現において $a = \cos\theta,\ b = \sin\theta$ とすると, 2次元の回転行列$$R(\theta) = \begin{bmatrix}\cos\theta & -\sin\theta\\\sin\theta & \cos\theta\end{bmatrix}$$が得られます. ↩
慣性座標系でボディ座標系の原点を並進移動してから, できあがったボディ座標系でボディ座標系を回転させる変換と等価 ↩
回転行列や同次変換行列と同じ要領で, 絶対変換は左から, 相対変換は右から掛けます. ↩
慣性座標系でボディ座標系を回転してから, できあがったボディ座標系でボディ座標系を並進移動する変換と等価 ↩
この式の導出をなんだかんだで見たことがないのですが, 単純に微分の定義とか回転行列の微分とかから出せるんですかね? ↩
これは, 単純計算により $\boldsymbol v^i$ を $\boldsymbol q_{ib}^\ast$ で回転させた $\boldsymbol q_{ib}^\ast \otimes \boldsymbol v^i \otimes \boldsymbol q_{ib}$ , つまり慣性座標系での並進速度を機体座標系でみたものと等しくなります. ↩
R.M. Murray, Z. Li, and S.S. Sastry, “A Mathematical Introduction to Robotic Manipulation”, 1994, CRC Press ↩
T.S. Andersen, T.A. Johansen, and R. Kristiansen, “Dual-quaternion backstepping control for a fully-actuated rigid-body”, 2018, American Control Conference ↩
(この記事は2018/8/17時点での内容です)
これは公式ドキュメンテーションが悪いです.以下のように書き換えて対処してください.
SPRESENSE SDKチュートリアルの手順の中で
$ git clone --recursive git@github.com:sonydevworld/spresense.git |
と書かれている項目を,
$ git clone --recursive https://github.com/sonydevworld/spresense.git |
に置き換えて実行しますす.
問題なくクローンできるはずです.
OS側に鍵を用意していない/自分のGitHubアカウントに公開鍵を置いていない場合にこうなります.
SONYさん,結構たくさんのお客さんが困っているみたいなので,修正してください.
]]>Arduino IDEで作成したプログラムは,電源投入時に自動実行されるようになっていますが,SPRESENSE SDKを使用して直接NuttX上に実装したコマンドは,デフォルトではnshを使って手動で実行する必要があります.実はnshには起動スクリプト(init.dのようなもの)の機能があり,適切に設定を行えば,プログラムの起動や環境変数の設定などを自動で行うことができます.
この記事では,SPRESENSEのNuttXの設定を変更し,起動スクリプトを有効化する方法を紹介します.
起動スクリプトは nsh_romfsimg.h
というヘッダの中に記述されたROMFSというファイルシステムの中に格納されます.ROMFSの生成には genromfs
が必要なので,まずはインストールします.
Ubuntu
$ sudo apt-get install genromfs |
その他のプラットフォームでパッケージがない場合は,SDKのセットアップ時に kconfig-frontends
と一緒にソースがついてきているので,それをビルドして使います.
参考→ SPRESENSE SDKをArch Linuxにセットアップする
SDKのディレクトリに移動して,menuconfigで設定を行います.
$ make menuconfig |
2番めの設定は,SPRESENSEの bsp
内に nsh_romfsimg.h
を用意することを意味しています.その他の部分はデフォルトのままで構いません.
つぎに,起動スクリプトのテンプレートを bsp
の中にコピーします.
$ cp system/nshlib/rcS.template bsp/include/arch/board |
rcS.template
ファイルは,そのままNuttXの /etc/init.d/rcS
ファイルになります.デフォルトではRAMディスクを生成して /tmp
にマウントするというスクリプトが書かれています.
たとえば rcS.template
の中身を
としておけば,hello
が起動時に自動実行されるようになります.また,
などと書いておくことで,環境変数 HOGE
の値が foo
に起動時に設定され,nshから利用できるようになります.
ひと通り編集したら,ROMFSを生成します.この作業は付属のシェルスクリプトで簡単にできます.sdk/bsp/include/arch/board
の中で以下を実行します.
$ ../../../../tools/mkromfs.sh ../../../../ |
ただし, ../../../../
はSDKのディレクトリを指していることに注意してください.これで,ROMFSのバイナリが書かれた nsh_romfsimg.h
が bsp/include/arch/board
ディレクトリの中に生成されます.
この作業は make
中に自動実行はされないので,rcS.template
を変更したら手動で実行するようにしてください.
変更した設定とROMFSを反映させるために,再度ビルドを行います.うまくいかない場合は make clean
や make cleankernel
をしてから再試行してください.
$ make buildkernel |
Flashツールで nuttx.spk
を書き込み,minicom等でシリアルポートに接続します.ls
してみると,etc
というディレクトリができている[1]ことがわかります.また,/etc/init.d/rcS
に,rcS.template
に書いた中身が反映されていることも確認できます.
以下の例は,デフォルトの起動スクリプトをそのまま使用した場合のものです.
nsh> ls |
menuconfig
でSDカードの設定をした上で,以下のように rcS.template
を変更します.これで,SDカード直下に置いた rc.txt
が自動で読み込まれて実行されるようになります.
ROMFSがマウントされている ↩
NuttXに付属しているシェルであるNuttShellにアプリケーションの実行ログを垂れ流すと,転送速度が足りず,バッファが詰まって処理が遅くなることがあります.これはNuttXのカーネルの設定で転送速度(ボーレート)を変更することで解決できます.
この記事では,SPRESENSEのNuttXを例に設定方法を紹介します.ほかのプラットフォームでも同様に変更が可能なはずです.
設定を保存するまでの動画を用意したので,こちらをご確認ください.menuconfigでは,矢印キーで選択,Enterで下の階層に入り,Escを2回押して上の階層に戻れます.
$ make menuconfigkernel |
$ make cleankernel |
tools/flash.py
を使用した書き込みでは,2Mbpsでも可能です.nuttx/libxx
の中に基本的なC++の機能を提供するためのライブラリは付属していますが,STLがカバーしている iostream
や vector
等の機能を利用したプログラムは,そのままではコンパイルできません.この記事では,軽量なSTL互換ライブラリであるuClibc++をSPRESENSEのNuttXに組み込み,C++の標準ライブラリを利用できるようにする方法を紹介します.
バージョン等
33597a8
)NuttXのuClibc++をsdkと同じディレクトリにクローンします.
$ git clone https://bitbucket.org/nuttx/uclibc.git |
SPRESENSEのNuttXは本家NuttXの最新版とはディレクトリ構造が異なるため,install.sh
を編集して対応させます.
実行してファイルをインストールします.
$ cd uclibc |
これによって,nuttx/include/uClibc++
の中にヘッダが,nuttx/libxx/uClibc++
の中にソースがコピーされます.nuttx/Make.defs
を編集して,uClibc++のヘッダのあるディレクトリをインクルードパスに追加します.
最近のコンパイラではそのままビルドできないため,パッチを当てます.
参考: [PATCH 2/2 uClibc++] Fix ARM EABI build failure in include/unwind-cxx.h
$ cd sdk |
矢印キーで選択,Enterで下の階層に入り,Escを2回押して上の階層に戻れます.スペースでチェックを付け外します.
ビルドします.
$ make cleankernel |
うまく行かないときは config.py
でデフォルトの設定を読ませてから再度 make menuconfig
するとうまく行くかもしれません.
tools/mkappsdir.py
と tools/mkcmd.py
を使ってプロジェクトを作成します.
参考→ SPRESENSE SDKでArduinoを使わずにとりあえずLチカする
$ tools/mkappsdir.py cxxapps 'C++ Applications' |
テンプレートとしてコピーされるソースの拡張子を変更します.
$ cd ../cxxapps/test_stl |
Makefileを編集します.コンパイラのフラグも書いておきます.
外から見えている必要のある関数(ここではtest_stl_main
)を extern "C"
で囲みます.
基本的にはこれだけしていればおkです.あとはプログラムを書いていきます.以下の例は,vectorに入れて出すだけの無意味なプログラムです.
$ make menuconfig |
“C++ Applications” → “STL Test” にチェックを入れて終了します.
$ make |
Arch Linuxは推奨のUbuntuとは異なりローリング・リリースを採用しているため,想定環境とのバージョンの不一致によって若干手順が異なります.
セットアップの基本的な手順はここにしたがいます.apt-get
等は適宜読み替えて pacman
等でパッケージをインストールします.
Spresense SDK チュートリアル - Spresense - Sony Developer World
kconfig-frontendsのビルドの段階で,以下のようなエラーが出ます.
In file included from yconf.c:234: |
これはESP32向けNuttXにおいてすでに確認されている現象です.
こちらにしたがって, libs/parser/hconf.c
の163行目を以下のように変更します.
バージョンアップ等で変更点があれば更新していきます.
]]>Arduino IDEとかいうぬるま湯に浸かりたくない人や,SPRESENSE SDKを使って自作のアプリケーションをCやC++で書いてみたい人向けの記事です.Arduino信者はお帰りください.
今回は,最も基本的な例としてLチカとシェルへの文字列の出力を扱います.
この記事では,SDKのインストールができているという前提で進めます.
参考→ SPRESENSE SDKをArch Linuxにセットアップする
一旦適当なサンプルをビルドして手順を確認します.すでにSPRESENSE SDKで何かを試している場合は一旦設定を退避させておいてください.以下のコマンドのうち make distclean
でNuttXカーネルとアプリケーションの設定が消えるので注意してください.
$ cd /path/to/spresense/sdk |
これによって,Hello WorldのサンプルアプリケーションがNuttXのコマンドとして追加されます.
nsh> help |
NuttXは通常,自分でアプリケーションを書こうとするといろいろと面倒な設定が必要なのですが,SPRESENSEには便利なツールが用意されています.
9.3. ツールを使用する: Spresense SDK デベロッパーガイド - Spresense - Sony Developer World
sdkと同じ階層に myapps
というディレクトリを作成し,その中に test_gpio
というアプリケーションを作成します.以下のコマンドでこの操作ができます(クォートで囲まれている説明文は適宜自由に設定してください).
$ tools/mkappsdir.py myapps 'My Apps' |
どのアプリケーションをビルドするかはmenuconfigで設定できます.
$ make menuconfig |
矢印キーで選択,Enterで下の階層に入り,Escを2回押して上の階層に戻れます.スペースでチェックを付け外します.
'My Apps’から’Test LED App’にチェックを入れます.早速ビルドしてみましょう.
$ make |
nuttx.spk
ができたら準備は完了です.
設定を保存して再度config.pyから利用できるようにするには,以下のツールを使用すると楽です.
$ tools/mkdefconfig.py myconfig |
myconfig
の部分は好きな名前に変えてください.
先ほど作成した test_gpio
アプリケーションの中身を書いていきます.ファイルはsdkと同じ階層のmyapps/test_gpio
の中にあります.
GPIO関係のAPIは,SDKの中の bsp/board/common/src/cxd56_gpioif.c
の中にあります[1].その他のペリフェラルについても同じディレクトリの中に出揃っているので,Doxygenで生成されたドキュメントを読むのに疲れた際にはこちらを参照すると良いと思います.
さて,CXD56のGPIOには「モード」があり,GPIOとしてピンを使用するかペリフェラルの機能を持ったピンとして使用するかが選択できます.それとは別に,入力ピンとして使用するか,ドライブ電流を大きくするか,プルアップ/ダウンをどうするか等が選択できます.
上記のコードの中で使用している board_gpio_config
関数は以下のような書式になっています.
ピン番号(の名前)についてはこちらから確認できます.
LED1に相当するピンは I2S1_BCK
で,この定数は bsp/include/arch/chip/pin.h
の中に 97
と定義されています[2].
NuttXはPOSIX互換ですので,usleep
を使用してディレイを実現できます.ハードウェアタイマーを使用して正確なタイミングを生成する方法は,また後日書ければ書きます.
ビルドして書き込みます.
$ make |
picocomやminicomでコンソールを開いて,nsh上でビルドしたコマンドを実行します.
nsh> test_gpio |
メッセージが表示されるとともに,LEDの点灯状態が1秒ごとに切り替わります.
SPRESENSE SDKでArduinoを使わずに自力でNuttX上のLチカコマンドを作成できた pic.twitter.com/SyUojg1Uc8
— ねころこん (@tokoro10g) 2018年8月2日
NuttXではコマンドをバックグラウンドで実行できます.
nsh> test_gpio & |
とすることで,実行中にもnshを使用することができます.
bsp/board/...
の中にある画像の中の直線を検出する古典的な方法として,ハフ変換が有名です.ハフ空間上の点は直線の式に相当するものになります.
たとえば,上のような写真の中から四角形の物体の頂点を取り出したい場合,ハフ空間上の点から求めた直線の式を連立して,直線どうしの交点を求める必要があります.とても簡単なことなのですが,巷の記事ではわざわざ $y=ax+b$ の形に直してから解いていたり,数値的に交点が求められていたりして若干微妙に感じるポイントがあります.いちいち解説している記事が見当たらない割によく使うため,書くことにします.
ハフ空間上の点 $(\rho, \theta)$ は,つぎの直線を表すものになっています.$$\rho = x \cos\theta + y \sin\theta$$
いま,$(\rho_1, \theta_1),\ (\rho_2, \theta_2)$ で表現される2本の直線を考えます.これらが交点をもつということは,$$\rho_1 = x \cos\theta_1 + y \sin\theta_1\\\rho_2 = x \cos\theta_2 + y \sin\theta_2$$の両方が同一の $(x,y)$ に対して成り立つということなので,$$\begin{bmatrix}\cos\theta_1 & \sin\theta_1\\\cos\theta_2 & \sin\theta_2\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix} =\begin{bmatrix}\rho_1\\\rho_2\end{bmatrix}$$と書けます.これを単純に $(x,y)$ について解くことで,$$\begin{bmatrix}x\\y\end{bmatrix} =\begin{bmatrix}\cos\theta_1 & \sin\theta_1\\\cos\theta_2 & \sin\theta_2\end{bmatrix}^{-1}\begin{bmatrix}\rho_1\\\rho_2\end{bmatrix}$$と計算できます.
ただし,傾きが同一の2直線に対しては行列部分が特異となり,この方法は使用できません.この場合はそもそも交点をもたないので,行列式の値の大きさを確認する例外処理を入れると良いでしょう.
線形代数に祈りを.
]]>MATLABデスクトップのタブ補完機能は便利に作られています.たとえば,コマンドウィンドウに
>> load |
と入力した後にTABキーを押すと,現在見えるパス上のディレクトリやファイルをリスト表示してくれます.また,
>> matl |
まで入力してTABを押すと,matlab
までが確定して入力され,その後に続く関数や変数の候補が表示されます.
最近わたしはVimのPythonプラグインを書いていて,その上でMATLABエンジンを動かして遊んでいます.この補完機能をうまく利用してVim上でMATLABの賢い補完ができないだろうかと考え,やってみたのがこの記事の内容です.
ドキュメント化されていない機能なので,今後のバージョンアップ等で使用できなくなる可能性があることを注意しておきます.
com.mathworks.jmi.tabcompletion.TabCompletionImpl
クラスのメソッドを呼びます.
引数には,補完対象のchar配列(もしくはstring)と,その文字列の何文字目から補完するかを指定しています.
実行すると,つぎのようなJSON形式のchar配列が得られます(長いので項目は省略しています).
中身の詳細は微妙にわからない部分もありますが,補完プラグインの実装に必要な情報は取れそうだということがわかりました.
MATLABデスクトップのGUIとエンジン部分はどうやらJavaで結合されているようです.MATLABマニア御用達のUndocumented Matlabに詳しいことが書かれています.
%matlabroot%/java/jar/jmi.jar
が該当するファイルのようです.こちらのファイルのコンテンツを jar
コマンドで確認したところ,タブ補完の機能に相当するコンポーネントがあることがわかりました.
MATLABには標準でJavaのパッケージをインポートする機能があります.また,メソッドをリスト表示する関数 methodview
も便利な機能です.
パッケージをインポートした状態で
>> methodview TabCompletionImpl |
を実行すると,TabCompletionImpl
に実装されているメソッドのリスト(と対応する引数の型)が表示されます.
ご存知のとおり load
コマンドではTABキーによってパスが補完されますが,自分で作成した関数の引数としてファイル名を指定する際には,通常補完がかかりません.実は functionSignatures.json
というファイルに設定を記述することで,自作の関数にも補完の仕方を指定することができます.
今年の3月に発売されたiPad第6世代は,これまでiPad Proにしか対応していなかったApple Pencilにも対応したモデルです.これまでiPad Proの価格に悩まされて購入に踏み切れなかった私ですが,この知らせを受けて手が滑って,つい1週間ほど前に(自費で)iPadを購入してしまいました.
今回購入したのは以下のモデルです.
これまでスタイラスを頑なに作らなかったAppleでしたし,正直Apple Pencilの何が良いのか,1万円も出して買うだけの価値はあるのか疑問でした.今回アーティストやデザイナー以外でもかなり便利に活用できることがわかったので,記事に残そうと思います.
私の普段のユースケースにかなり偏った記事になりますが,特に研究者の方や日曜エンジニアの方には,活用いただける記事になっているのではないかと思います.また,記事の最後で便利なアクセサリーや,Apple製品をなるべく安く購入する方法についても書こうと思います.
タブレットと研究,といっても,いまいち関連づかない方が多いのではないかと思います.特に理論系の学生は日々の計算用紙の消費が激しく,どこでも研究ができてしまうことから,分厚い専門書や論文の束を持ち歩くこともあり,カバンの中や机の上,自宅の床などが紙だらけで大変なことになることが往々にしてあります.(わたし自身は理論系というよりは理論系に寄った実験系だと思いますが,それでも紙が…)
こういった状況から脱却するにあたって,タブレットは良い選択ではないかと思うのです.ここから,具体的にどのように活用できるのか紹介していきます.
Foxit Mobile PDFでてきとーに注釈と手書きメモを書いてみた
— ねころこん (@tokoro10g) 2018年5月15日
Google Driveと同期ができて便利
手書きメモの書き心地は別のアプリの方がいいけど十分使えるレベル
ノート的に絵を描きたくなったら、別のアプリで描いて貼り付けるといいかも pic.twitter.com/4HpsoMSB4E
注釈のメモの編集画面はこんな感じ 画面下のLgにつけるコメントを編集している pic.twitter.com/bioQqdHqc2
— ねころこん (@tokoro10g) 2018年5月15日
PDFを読めるアプリはたくさんありますが,その中でも論文読みや校正に特に便利だと感じたアプリがこちらです.
Foxit Mobile PDFの良い点は,大きく以下の3点です.
Foxit Mobile PDFのクラウド連携は,単にダウンロードとアップロードができるだけではなく,同期(sync)の機能を備えています.そのため,注釈をつけたPDFファイルを即座にクラウドストレージに反映させ,各端末間で共有することができます.
たとえばとあるフォルダはこうなっていて、これに注釈をつけて変更を加えたり、ファイルをPCから追加したりすると、ネットに繋がっている限りは同期がかかる
— ねころこん (@tokoro10g) 2018年5月15日
常に同じ注釈が入ったもののコピーが手元とラボと自分のPCに入る pic.twitter.com/2FxeUHP1Em
注釈の種類も,手書き入力やポップアップノート,下線や取り消し線,マーカーによるハイライトなど,基本的なものに対応しています.その他にも,文字の置換や挿入を表すマーカーの挿入も可能です.FoxitのPDFリーダーはPC版もあり,Windows, Mac, Linuxに対応しています.PC側のリーダもFoxitで揃えておくことで,よりシームレスな連携が取れるようになります.
手書き入力に関しては,Apple Pencilとの連携機能は特にないため,書き始めに若干の遅延が発生したり,線がカクカクしたりします.文書を拡大してから書くことで,ある程度は問題なく使うことができますが,基本的にはハイライトやポップアップノートを使用したほうが良いかと思います.どうしても快適に手書きしたい場合は,つぎに紹介するNotabilityを使用すると良いでしょう.
Notabilityの書き心地 pic.twitter.com/Kw1iNfjC1d
— ねころこん (@tokoro10g) 2018年5月23日
Notabilityの特徴は,なんといってもその書き味(レスポンス)の良さでしょう.ほかのアプリでは遅延を感じることがあるのですが,Apple PencilとNotabilityを組み合わせると,あたかもボールペンでノートに書いているかのような感覚で,書くことに集中することができます.線の種類は,ボールペンのような感覚のものと,筆のような感覚のものの2種類から選ぶことができます.個人的な書きやすさと読みやすさとしては,前者の方がよいかと思います.
もちろん書いている途中で色を変えたり,蛍光マーカーに切り替えることもできます.また,これは電子ノートの良い特徴ですが,書いたものを選択して移動したり,コピー・貼り付けをしたりできるのがとても便利です.特に数式の変形では,同じ部分を何度も書いたり部分を記号で置き直したりする必要がなくなるので,とても楽になります.
Notabilityは,クラウドストレージへのバックアップ(≠同期)に対応しています.iPadが手元にないときでも,自分の書いたノートを読むことができます.
Notabilityは有料アプリで,アプリとしては少し高めの1,200円という金額設定になっています.しかし,この書き味と利便性を考えると,iPadとApple Pencilを使用するなら買っておいて損はないと思います.(迷うことはないです.このアプリの購入を検討する時点で,あなたは1万円のインクの出ないペンを購入してしまっているので……)
ちなみに,アプリを安く購入するには,iTunesカードを安売りしている店を探すのが最も効率的かと思います.そのへんは課金ガチャ界隈でよく説明されていますので,この記事では割愛します.
この節の内容は,MATLABを使用している方向けのものです.
先ほど紹介したNotabilityとMATLAB Mobileを併用することによって,研究ノートへのプロットの挿入が圧倒的に楽になります.MATLAB Mobileで出力したプロットはカメラロールに保存することができ,Notabilityのノートに簡単に貼り付けることができます.
ノートは拡大して見ることができますし,スペースも無限(実際は有限)なので,プロットの大きさを特に考えずに貼り付けて問題ないのも嬉しいポイントです.
個人的な話で恐縮ですが,出力したプロットと紙のノートの位置を関連付けたい場面が何度かあり,そのたびにプロットの扱いに苦労することがありました.どうしても貼りたい場合には,プロットを印刷してテープで貼り付けていたのですが,これらの導入によってその必要がなくなりました.
Onshapeアプリを使うと,3D CADをなんとiPadで動かすことができます.Onshapeはクラウドベースの3D CADサービスです.詳しくはこちらの記事をご覧ください.
視点変更の操作は通常のiOSの操作方法とほとんど変わりありません.少し癖があるとすれば,スケッチを描く際に表示されるカーソルがタップしている位置と異なる場合があることぐらいでしょうか(下の動画では別の部分をタップしながらスワイプしています).また,クラウドベースのCADですので,ネットに接続していないと使用できません.
実際の作業風景を動画に撮ってみたのが下の動画です.
こんな感じで編集できる pic.twitter.com/mJgkOecPvs
— ねころこん (@tokoro10g) 2018年5月17日
最近のiOSの便利機能である,画面の動画キャプチャ機能を使用しています.こんなふうに作業中の風景を動画に残しておいたり,Twitterに投稿して自慢したりできます.
わたしはおえかき練習中の身なのですが,個人的に好きなUIのアプリだったため,紹介したいと思います.
Autodesk SketchBookは,片手で描きもう片方の手でUIの操作をするという使い方ができることや,ジェスチャー機能が豊富であることが特徴です.また,プリセットにコピックのブラシやペンが標準で搭載されているのも特徴だと思います(Apple Pencilには画面との角度と筆圧しかパラメータがないため,使用感覚は本物とは異なりますが).
マルチタッチ時にたまに動作が不安定になることがあります.また,保存ボタンがないため,落ちたときのダメージが大きいです.一旦ギャラリーに戻る際に保存するかどうかを選べるのですが,標準で保存ボタンがほしいなと思います……
たとえば下に載せたものは,このアプリを使って描いたイラストです.
— ねころこん (@tokoro10g) 2018年5月22日
— ねころこん (@tokoro10g) 2018年5月22日
仙狐さんかわいい…
Autodesk SketchBookは,絵を書いている途中経過のタイムラプス録画に対応しています.(下の動画は撮った後にiMovieでスピードを調整したものです.)
あややリベンジ pic.twitter.com/4UPrlfKf4c
— ねころこん (@tokoro10g) 2018年5月22日
教育期間関係者であれば,Apple Storeの一番下にある学生・教職員ストアのリンクをクリックしてから買い物をすることで,約2〜5%ほどの割引を受けることができます.なお,この割引は大学生協で購入しても適用されるようです.
しかし,大学生協で購入した場合は,つぎに説明するポイント還元を受けられません.
楽天が運営するRebatesというサービスを経由してApple Storeで買い物をすると,通常1%のポイント還元を受けることができます.たとえば,今回購入したiPadとApple Pencilは合計でおよそ60,000円ですが,税抜きおよそ56,600円の1%にあたる566ポイントを受け取ることができました.
これは学生・教職員ストアの割引と併用することができます(公費購入の場合はポイントの扱いについて事務担当に確認してください).また,もちろん学生・教職員ストアでない場合にもこれは適用されます.
さらに,Rebatesに登録した上で条件を満たすお買い物をすると,初回購入ボーナス500ポイントがもらえるキャンペーン特典があります.詳しくは下のバナーから確認してみてください.
楽天ポイントは最近マクドナルドやローソンとでも使用できるようになりましたので,この機会に活用してみてはいかがでしょうか.
ネット回線契約で割引とか,大型家電購入で割引といったようなキャンペーンが行われている場合があります.もしタイミングが合うようなら,上記よりも圧倒的な割引率で購入できるチャンスです.
Apple Pencilを使用する場合は,キャップの紛失やペンの落下を防ぐためのパーツを購入すると良いでしょう.わたしは以下のグリップとキャップをAmazonで購入しました.
こちらのグリップは知人から紹介してもらったものなのですが,マグネットでかなり強固に取り付けることができるので,紛失や落下の心配が和らぎます.
冒頭の写真のカバーはこちらから:
これからしばらく使用して見えてきたことがあればまた改めて記事を書こうと思います.また,もっと便利なツールをもしご存知の方がいらっしゃいましたら,ぜひ教えてください!
]]>FreeRTOSはみんな使っててつまらないから別のRTOSを使ってみるよ
NuttX[1]はPOSIX, ANSI準拠のフリーのRTOSで,いろいろなプラットフォームに対応しています.有名所ではSonyのICレコーダやマルチコプター向けのフライトコントローラPixhawkに採用されていたりします[2].
FreeRTOSなどのほとんどのメジャーなRTOSにはシェルは提供されていませんが,NuttXにはNuttShell(nsh)というbashライクな独自のシェルが用意されています.また,ファイルシステムやネットワーク,オーディオ,グラフィクスなどの拡張機能も実装されています.アプリケーションはRTOSのコードと一緒にリンクする必要はなく,別にリンクしたELFの読み込みもサポートしています.もはやふつうのOSと遜色ない機能を持ち合わせています.何にでも使えそうな感じがします.
続きからF4Discovery向けにビルドしていきます.
基本的に以下のチュートリアルを参考にすればおkですが,メモとして残しておきます.http://nuttx.org/doku.php?id=wiki:getting-started:stm32f4discovery_unix
NuttXをビルドするには,kconfig-frontends
をインストールする必要があります.わたしはArchなのでAURで入れました(執筆時点ではそのままではビルドできなかったので,AURのコメント欄にあるパッチを適用しました).
zipかgit経由でnuttx本体とappsをダウンロードして,nuttx, appsのフォルダを同じディレクトリにつっこみます.
$ ls |
ビルドに移ります.今回はF4Discoveryを使用し,オンボードのMicroUSB経由でnshをいじることにします.
$ cd nuttx/tools |
distcleanしろと怒られた場合はnuttxディレクトリで make distclean
を実行してから再試行します.
ビルドが完了すると nuttx.hex
ファイルがnuttxディレクトリに出力されます.
st-flash等で焼きます.
$ st-flash --format ihex write nuttx.hex |
F4DiscoveryのMicroUSBポートとPCを接続し,別途モバイルバッテリー等を使用してF4Discoveryに電源を供給します(MicroUSBからは給電されません).USB CDC-ACMデバイスとして認識されるので,適当なシリアルターミナルを開きます.
$ picocom --b 115200 /dev/ttyACM0 |
起動まで若干の時間がかかりますが,Enterを何回か押していると反応するはずです.以下の画像のようにシェルとして使用できます.
いきなり自作のELFを実行というのもアレなので,まず最初のステップとして付属のビルトイン(NuttXと一緒にリンクする)アプリケーションを動かしてみます.appsの中にあるpwmというサンプルを動かしてみます.
ビルトインアプリケーションを入れるには,menuconfigから設定を行うと楽です.
$ make menuconfig |
また,執筆時点(v7.24)では以下の修正が必要です.バグなのかconfigのどこかが抜けているのかよくわかりませんが,ビルドに失敗します.以下のコードを configs/stm32f4discovery/src/stm32_pwm.c の85行目あたりに書き加えて修正します.
make
して書き込み,シリアルターミナルを開きます.
nsh> pwm -h |
とするとヘルプが表示されます.たとえば
nsh> pwm -d 10 -t 1 |
を実行すると,基板下部の橙色LEDがDuty比10%で1秒間発光します.
/dev/pwm0
はnsh上から echo
で値を書き込むことはできないようです.ioctl
でプロパティを操作する必要があるようです.
Discoveryでは遊べることに限界があるので,つぎはaitendoのSTM32F103ボード[3]を使ってSDIOとファイルシステムのテスト,SDに書いたELFの実行あたりをやってみようと思います.
マイクロマウスをはじめたばかりの人にありがちなのが,大会に行ったものの用語がよくわからなくて,「何言ってんだこいつら」状態になるという問題です.私が初めてマイクロマウスの大会に参加したのは2013年の学生大会なのですが,その際に審査員の方から「これは重ね探索ですか?」と聞かれて「何だそれは」となったのを昨日のことのように思い出します.また,競技者は当日心の余裕がないので,MCの人にマイクを向けられても観客のことなんかそっちのけで自分が普段使ってる用語で話してしまいがちです.
というわけで,私が「これはマイクロマウス固有の用語だろう」と独断と偏見により判断した語句を,軽く事典ライクにまとめてみました.なるべく一般的な語句を使用して説明しようと試みています.一部内輪ネタが入ってしまっているかもしれません.すみません.
コメントくだされば2019年版に反映させるかもしれませんが保証はしません.
ちなみにこの記事のネーミングはこちらの書籍をパクっています.
迷路探索アルゴリズムの一種.足立法では,まず未知の壁をないものとして考えて求めた最短経路を走行しようとする.壁があって進めなくなったら,その時点までで得られた迷路の情報をもとに最短経路を再度導出するという処理を繰り返す.この考え方を用いることで,スタートからゴールまでの経路が存在する場合,必ずゴールにたどり着ける.
狭義に歩数マップと上記のアルゴリズムを用いたものを指すこともある.その昔,足立芳彦さんが福山マイコンクラブに所属していた際に考案し,競技者に広く知れ渡ったことから,この名前が定着した.
学術的にはIncremental heuristic searchやReplanning algorithmというカテゴリに属するアルゴリズムである.
参考: 用語解説【マイクロマウス】 | 日本システムデザイン株式会社
基板をシャーシとして用いた機体.走る基板.2003年頃から登場したもので,現在はDCマウスの主流の形態となっている.
参考: 物理を考慮した進化 | マイクロマウス委員会 関西支部
痛車のマイクロマウスバージョン.
迷路を片付ける際に柱を引き抜くこと.柱の破損は稲刈りの際によく起こるので注意.
対義語は田植え.
上位入賞の常連や,常軌を逸した機体を製作する人のこと.対義語は「人間」「地球人」.
宇宙人の一歩手前のレベルとして「成層圏あたり」や「人類トップクラス」などの表現が用いられることもある.
2017年まで存在した,全日本大会のマイクロマウス競技のクラス分け.フレッシュマンクラスとは異なり16x16マスの迷路で予選を行い,上位25名ほどが決勝進出となる.マイクロマウス競技では基本的にフラッシュ撮影は禁止されているが,全日本大会のエキスパートクラス決勝ではこれが例外的に許可されている(運営に関する注意事項5(2)).
競技者を煽る 大会全体や各競技の司会進行を務める人.事務所所属の声優さんたちらしい.
機体名を読んでくれるので,恥ずかしくて読めないような名前にしないように注意.
機体を板に載せ,慣性センサを使って姿勢角を一定に保たせながら,板を回す技.
モータの制御と慣性センサからの角速度の取得と制御ができていることを確認する,マイクロマウス製作の基本の「ほ」あたりに位置するもの.
— ところたん (@tokoro10g) November 4, 2017
軸の回転数を計測するセンサであるロータリーエンコーダのこと.
ロータリーエンコーダには大きく分けてインクリメンタル型とアブソリュート型の2種類がある.インクリメンタル型は,回転に伴って出力されるパルスによって,軸の相対的な回転を検出するタイプである.一方,アブソリュート型では軸の絶対角度を取得できる.絶対角度の出力にはグレイコードと呼ばれるエンコード手法が使われるほか,SPIなどを使って角度の値をICとの通信で取得できるものもある.
2回目以降の走行において,競技者の操作なしに自動でスタートすること.スタート区画への進入後最低でも2秒経過してからスタートしなければ,オートスタートとして認定されない(競技規定3-4).自律賞を獲るためには必須の機能.
ターンの曲率半径が大きいことを表す語.主に90度や180度のターンにおいて,2区画以上をまたいだターンのことを指す.
電子回路や基板を設計するソフトウェア.マイクロマウスの製作者の間では,Eagle, KiCad, PCBEなどがよく用いられる.
硬貨を機体に取り付けて機体の質量や重心を調整すること.「+30円」などが機体名についている場合はもれなく課金されている.なお,この行為は硬貨を損傷したり鋳つぶすものではないため,貨幣損傷等取締法違反にはあたらない.
すでに持っている迷路の情報に追加しながら探索走行をすること.探索走行に失敗して迷路の情報が不完全であるような場合に,競技者の判断で行われる.
巻頭言で述べたように,このマイクロマウス用語はこの事典を書く原因になった言葉の一つである.
横壁や柱が出現する(なくなる)区間を通過したときに起こる壁センサの立ち上がり(立ち下がり)を検出して,走行距離を補正する処理のこと.この処理を用いることで,一般の移動ロボットにおいて行われるオドメトリ(自己位置推定)を行わなくとも,区画の中のどの位置に機体がいるのかを知ることができ,前後方向のズレに対応できる.
壁センサの数値を利用して,区画の真ん中を走る制御方法のこと.参考: [rogy Advent Calendar 2015] マイクロマウスと制御理論 (1)壁トレース制御
壁の有無や壁と機体との距離を測るために用いられるセンサ.通常赤外線LEDとフォトダイオードを用いて構成される.走行しながら迷路の形状を記憶するためには,最低でも前・右前・左前の3つの壁を認識するセンサを搭載する必要がある.
観測対象の動的モデルと統計的性質を利用して,対象の状態を推定する手法.マウサーのいうカルマンフィルタは必ずしも計測・制御用語のカルマンフィルタとは一致しない可能性があることに注意が必要である.
スタートからゴールまで到達すること.全走行を走りきることではない.まずはこれを目指そう.
壁がないことが既知である区画を加速して直進することで,探索時間を短縮する手法のこと.斜め走行と組み合わせる場合もある.ちなみに鬼畜とは関係ない.
電気・電子回路を実装する板のこと.基"盤"じゃなくて基"板".
"Computer-aided design"の略.コンピュータを用いて設計すること.マイクロマウスの文脈では,主に機械設計に用いるソフトウェアのことを指す.
ファンを用いて地面から空気を吸い上げることによって,地面に吸着する機構.みかけの重力が大きくなるためタイヤの摩擦力が増加し,スリップの抑制につながる.
8x8の迷路を使用した初心者向けの競技.地区大会で開催される.走行の質(壁にぶつからないか,完走できるか等)に応じてバッジがもらえる.
迷路の区画数が通常の1/4であるためこの名称が使用されている.1/4のサイズのマウスの競技ではないことに注意.
髪をとく櫛のような形状をした迷路の部分のこと.別名「駐車場」.
特に上図のように両側に櫛がある場合は,壁による走行位置の補正が困難である.
マイクロマウス競技の一種.区画の1辺が180mmの迷路を使用して競技を行う.2018年に「マイクロマウスクラシック競技」から改称された.
1980年に開かれた第1回全日本マイクロマウス大会から基本ルールは変わっていない.
競技規定1-2に示されている文言.マイクロマウス競技では,競技時間を消費しながらのその場での軽微な修理が認められている.
マイクロマウスは、競技中に操作者により、ハードウェアおよびソフトウェアの追加、取りはずし、交換、変更を受けてはならない。ただし、軽微な修理・調整は許される。
迷路を将棋盤に見立てた際に,桂馬が動ける位置へ至る経路のことを指す言葉.
斜め走行を行う場合,桂馬飛びが左右交互に続く経路では45度と0度が1区画ごとに切り替わるため,ターンが連続して姿勢が崩れやすいと言われている.ある特定の条件下においては,この経路を1つの大回りターンに短縮することができる(小島ターン).
倍率.主に制御に用いるパラメータを指して使用する言葉.フィードバック制御の考え方では,目標値と偏差にゲインをかけて出力を決めることで,ズレを小さくしていく.
マイクロマウス界の宇宙人として名高い小島さんが初めて採用したとされるターンのバリエーション.上図のように,45度と0度が交互に繰り返されるターンを大回りの90度ターンに簡略化したもの.
経路としては通常のターンに比べて遠回りになるが,曲率半径の小さい45度ターンに比べて曲率半径が大きくなるため,ターン時に機体横方向にかかる遠心力が小さくなる.したがって,ターン速度を上げることができるという利点がある.
たどり着きたい場所.マイクロマウスでは,ゴール区画は通常2x2マス以上の正方形によって設けられる.
クラシック競技では中央の2x2マスにゴールが固定されており,ハーフサイズ競技では場所もサイズも固定されていない.そのため,ハーフサイズ競技に限定して,事前にゴールの入り口の場所を示す座標が告知される.
マウスのユーザインタフェースとしてロータリーエンコーダの回転を使用する際に,コリコリした触覚フィードバックを行う手法.回転量がある一定値を超えたときにモードを切り替えるのが一般的だが,その際にモータに一瞬だけ逆転トルクやブレーキをかけることで実装できる.LEDやスピーカを搭載していない基板でも使用できるテクニック.
ホコリを取るための粘着テープがついたローラー.
一般的にはカーペットの掃除に使われるが,マイクロマウスではタイヤの掃除のために使用される.タイヤにホコリが付着すると摩擦力が小さくなりスリップを起こしやすくなるため,走行1回ごとにコロコロを使用してタイヤ掃除をする競技者が多い.
同一の状況が作り出される度合い.マイクロマウスの文脈では,走行時間や失敗の仕方が毎回の走行で似ている場合に,再現性が高いと言う.
再現性は,機体の走行を調整する際に非常に重要なものであるとされている.
探索によって得られた迷路の情報をもとにして,スタートからゴールまでの経路を高速走行すること.口語的には,最短ではない場合にも最短と呼ばれる.
マイクロマウスの文脈では,実力の過小評価という意味で使われる.用例として,「フレッシュマン詐欺」(エキスパートクラス並の実力があるにもかかわらず,フレッシュマンクラスに参加すること)が挙げられる.
16x16サイズの迷路の外周を2周するタイムを競う競技.地区大会や学生大会などで行われ,全日本大会では開催されない.通常,クラシック競技終了後の迷路の外周にある壁を抜いて行われるため,走行経路の両側に壁があるとは限らない.正式名称は「支部サーキット競技」.
全日本大会と一部の地区大会で,出走者全員に配られる記念品.タオル,ふせん,定規,ペンなどのバリエーションがあり,いずれもマイクロマウスのロゴ等がプリントされた限定グッズである.
CNCフライスのこと.設計した形状データを切削によって切り出すことができる工作機械.
ハーフサイズのマイクロマウスでクラシック競技に出場すること.語源は,宇宙人小島さんによるハーフサイズのクラシック競技機体『こじまうす7CL』.
地方ごとに設けられた,有志によるマイクロマウス競技者の集まり.支部ごとに定例会や大会を開催している.
課題迷路を作る人.特定の模様を迷路の中に埋め込んで出題者が誰か暗に分かるようにしている人もいるらしい.
角速度を計測できるセンサ.1軸まわりのみのシンプルなものから,3軸まわりの角速度をすべて取り出せるセンサまである.特にDCマウスでは,鉛直軸(z軸)まわりの回転をジャイロセンサを用いて計算することが多く,製作に欠かせない電子部品となっている.
MEMS技術によって製造されているセンサのチップの中には,微小なバネやおもりが内蔵されており,その運動によるピエゾ抵抗や静電容量などの電気的特性の変化を計測することで,角速度や加速度を測定している.
後進して機体の後ろを壁に当てることで,位置と角度を物理的に補正する方法.見た目があまり良くなく,かつ余計な時間がかかってしまうが,完走率は確実に上がるため初心者におすすめの方法.
「1回目がスタートしてから持ち時間内に全走行が完了(最後にスタート地点まで戻る)するまで、ノータッチで走り切ったマウスのうちで、最短走行時間を記録したマウス」に贈られる賞.
マイクロマウスの競技理念である自律性を評価する賞だが,近年該当者がいない.最短走行の速さを上げる戦いは,吸引マウスの台頭によって厳しさを増してきているため,しっかりと走って自律賞を狙うのも一つの戦略である.
いくら技術者だらけであるとはいえ,マイクロマウスの世界にもジンクスは存在する.一例として,「マウスをほめるとコケる」「うまく走らないときはパラメータを上げろ」「MAXパラメータは走る」などが挙げられる.
競技者を煽る 機体の走行を審査する人.大会運営に長く関わられている先生方や,ベテラン競技者の方が担当する.
審査員の隣では,計測係・記録係が競技の進行をサポートする.これらの係の多くは,参加者によるボランティアによって成り立っている.
吸引マウスの床面との密着性を保つための機構.機体の裏側にフィルム状のシートをスカートのように貼って作られることから,この名前がついた.加減速に伴う振動によって機体が床面からはがれないようにするための有効な方法であるとされている.
パルスを入力すると一定角度回るモータ(これはあまりにも雑な説明なので他の解説サイトを参照されたい).マイクロマウスではステッピングモーターに直接車輪を取り付けるダイレクトドライブを採用することが多い.DCモータよりもサイズが大きいことや,制御初心者でも簡単に扱えることから,クラシックマウスで使用されることが多い.
機体の進行方向とタイヤの進行方向のなす角度.自動車用語の「スリップアングル」「横滑り角」と同一の概念.
機体を回転させながら進む際にはこれが必ず生じ,直進していない限りすべり角は0にならない.車輪の回転のみから自己位置や進行速度を推定しようとすると失敗することはこれに起因している.
停止することなくカーブと直進を連続的に走行すること.ポールを避けて走行するスキー競技の動きに似ていることから名前がついたとされる.
超信地旋回を使用した走行と比較して,スラローム探索(通称:スラ探)は走行時間を大幅に短縮できるため,マイクロマウス初心者脱出にあたって重要なテクニックである.
軽微な修理として,センサに使用しているLEDやフォトダイオードの足を無理やり曲げること.
憧れの舞台になってしまったもの.従来は登録者が全員競技に参加できたが,2018年からは地区大会での実績をもとに参加の可否が決定されることになった.
全日本大会は毎年11月下旬〜12月初旬ごろに東京近郊(?)で開催され,全国各地や海外から参加者が集まる.競技に参加しない場合でも,観戦や技術交流のために足を運ぶことをおすすめする.
非常に長い斜め走行が可能なルート.ハーフサイズ競技決勝の32x32サイズの迷路によく出現するパターンである.
等加速→等速→等減速で位置決めを行う軌道,またはその軌道を使用した制御手法のこと.
上図のように加減速中の加速度は一定であり,加速度ではなく速度が台形状になる.ではなぜ台形加速と呼ぶのかという理由については諸説あるが,もともとステッピングモータの脱調を防止する方法として「台形駆動」という名前で紹介されていたものが,ロボコン界隈の中で変化したと考えられる.「台形加減速」という用語がモータ制御業界で使用されていたという説もある.
加減速時に急激なトルク変化を要するため,進行方向へのスリップを引き起こすことがある.それを防止する亜種として,加速度を連続的に変化させた「S字加速」というものが存在する.
柱を床板に埋めること.32x32の迷路になると実に33x33=1089本もの柱が必要になるため,それこそ実際の田植えのようにかがみながら1本1本植えているらしい.誰か田植え機を作ってあげて.
対義語は稲刈り.
NTFのウェブページ 田代賞について を参照.
過負荷や急激な速度変化指令に伴ってステッピングモータの同期が失われること.駆動力が抜けるような挙動をする.
転回.マイクロマウスの文脈では,直進と直進の間をつなぐ旋回動作やその軌道・軌跡のことを指す.多くのマイクロマウスは45度,90度,135度,180度のターンが行えるように設計・プログラミングされている.
迷路を展開する床板のつなぎ目に生じる厄介者.板の反りが原因.競技規定(注意-7)にも約1mm程度の段差が生じることが明記されている.
板マウスの裏面に表面実装部品を実装すると,高速走行時に段差に引っかかってランドごと剥がされてしまうことがあるらしい.
迷路のスタートからゴールまでの道のりを探すこと.マイクロマウスにおいて最も重要な要素.
多くの競技者はまず第1走で迷路の形状を記憶する探索走行を行い,導出した最速の経路を使って第2走以降の最短走行でタイムアタックを行う.
全日本大会の前に全国各地で開催される大会.地区によっては,梨,米5kgなどの豪華景品が贈呈される場合もある.
2018年からは全日本大会の予選という位置づけになった.
左右輪を互いに逆方向に回転させることで,その場で旋回を行うこと.もともとは戦車やショベルのような履帯をもつ重機に関する用語.
スラローム走行の実装は初心者には難しいため,まずは超信地旋回を実装して1マスごとに停止しながら探索を行うことがおすすめである.
プログラミングから最終段階の合わせこみまでを包含する非常に広い意味をもつ言葉.「調整が間に合わなかった」など,ネガティブな文脈で使用することが多い.
DCモータを使用したマイクロマウスのこと.
直流電源で動作するモータ.いわゆるモータと言ってイメージするものはだいたいこれ.マイクロマウスに限らずロボコン関係の文脈における「DCモータ」は,ブラシ付きDCモータのことを指すことが多い.
特別な賞.大会の運営や盛り上げに貢献した個人・団体に贈られることもある.
壁や柱の隙間を縫って区画を斜めに走行すること.1区画ずつ90度ターンを繰り返して走行するよりも,走行時間が圧倒的に短くなる.最も一般的な斜め走行は区画に対して45度の角度.
ターンの前には減速が必要であるため,ゴール付近でターンが発生する場合はタイムがわずかに長くなる.また,多くのパターンにおいて斜めに進入することでゴール区画内での直進距離を長くできるため,その分減速のタイミングを遅らせることができ,わずかにタイムを縮めることができる.斜め突っ切りは,1ミリ秒単位を争う宇宙人の世界では重要なテクニックであるようだ.
マイクロマウス用語としての「2輪」はバイクのような構成の2輪車両ではなく,2つの車輪が同軸上に取り付けられた車両のことを指す.
4輪以上のマウスとは異なり,シャーシのどこか少なくとも1点が床面と接する必要があるため,段差の踏破性能に乏しい.この形状のロボットは,構造が単純であるにもかかわらず任意位置・姿勢への安定化が一筋縄には行かないことから,ロボット工学の典型的な例題(two-wheeled mobile robot)としてよく知られている.
参考: マイクロマウスと制御理論 (2)自由度と非ホロノミック拘束
虫.ねずみの好物.
プログラムの不具合.
壁を固定するために床板に埋め込まれるもの.吸引マウスのサンドバッグ.
意図した挙動から外れて暴走すること.制御工学や信号処理の分野で使用する「発散」とほぼ同じ概念だが,ベクトル解析のそれ(divergence)とは異なる.
電池.小型・軽量・高エネルギー密度であることから,マイクロマウスではリチウムイオンポリマー(LiPo)電池が使用されることが多い.取り扱いを誤ると火事のもとになるので十分な注意が必要である.
マイクロマウスの文脈では,最大速度・加速度・減速度等の設定値のことを指す.
噛み合う2枚のギアのうち小さい方のギア.モータに直接取り付けられる初段のギアのことを指すことが多い.
DCマウスでは減速比を低く(約1:4)設計することが多いため,ピニオンギアにかかるトルクが大きい.そのため,モータの軸との摩擦が適切でない状態で走行を行うと,ギアと軸が滑ってしまったりギアが外れてしまったりする場合がある.
基板を貫通させず表面に実装する電子部品.英語では略称として「SMD」,「SMT」などがよく用いられる.対義語は「リード部品」.
異常時に安全に停止する機能.安全第一.
物理的な次元をもつ量で内部の演算を行うこと.15年ほど前までは安価な小型マイコンが現在ほど高性能ではなく,また浮動小数点演算が気軽にできなかったことから,通常は計測した値や制御入力は無次元量として(パルス数やADC値のような生データを)取り扱うほかなかった.そうした背景から,物理量をマイコン内の演算に使った制御という意味で,この言葉がガラパゴス的に生まれたらしい.
マイクロマウスに乗るようなプロセッサでまともに実数演算できるようになったのはつい最近のことで、整数ベースだった制御演算やパラメータをSI単位系にできるだけでも当時は革新的だったのですじゃ...
— kato (@robolaboN) 2016年11月12日
カメラのフラッシュライト.全日本大会のエキスパートクラスではフラッシュを使用した撮影が許可されている.
2017年まで存在した初心者向けの競技クラス.全日本大会で完走した競技者は出場できない.
4輪のスキッドステア車両(SSV)の意味で使われる.スキッドステアとは,ステアリング機構をもたずに左右輪の差動で旋回する構造のことである.ところでこの用語は素直に「4輪」ではいけなかったのだろうか.
ゴールからの歩数(必要な移動回数)を記録する配列.歩数が1歩ずつ小さくなる方向に進んでいくとゴールに最短歩数でたどり着けるという性質がある.
マイクロマウスでは,壁や柱等の外界の情報を利用して機体の位置・姿勢等の推定値を修正することを指す.代表的なものに,壁切れ補正や前壁補正などがある.
従来の「ハーフサイズ競技」が2018年に改称されてできた競技.
クラシックマウスの半分の長さ,すなわち1辺90mmの区画を使用する競技.それにしても,既存の名前に別の既存の概念を割り当て直すのは混乱を生むのではないかと筆者は思う.
マウスの脳みそ.マイクロコンピュータもしくはマイクロコントローラの略.英語ではMCUと略すことが多い(最後のUはunit).
マイクロマウスの進歩はマイコンの進歩に大きく依存している.
マイクロマウス公式キャラクター(参照).かわいい.大会パンフレットの大会の流れを説明する漫画にも登場する.
マイクロマウス競技者のこと.ちなみに同じような読みのMouser(マウザー)という電子部品通販サイトがあってたまにややこしい.和製語なので海外の方には通じない.
有志が開催する合宿形式の交流会.大学のサークルが持ち回りで企画している.
宇宙人の1人である加藤さんによる訓示.マイクロマウス競技において上位を志す者に求められる心構えが示されている.
参考: マイクロマウス委員会 関西支部へようこそ | マイクロマウス委員会 関西支部
全日本大会の期間中に開催される公式の懇親会兼技術交流会.立食パーティー形式でわいわいできる.2016年から田代杯と称して,大会に出せない前衛芸術的な迷路にチャレンジする企画がはじまった.
アルコールが入った状態で機体をいじると思わぬ事故のもとになるので,ほどほどにしよう.
前方の壁との距離を計測することで現在位置を補正する方法.前方を見る壁センサの取り付け方によっては,角度も補正できる.
ターンや壁切れの前に低速で直進させる距離.すごくテクニカルな内容になりそうなのでここには詳細は書かないことにする.
木々が立ち並んでいるような迷路パターン.「畑」とも呼ばれることがある.特に下の図のようなものを指す.
マイクロマウスが走るフィールド.いわゆる迷路と異なる点は,ゴールが迷路内に存在することである.
モータを駆動するために必要な回路要素.電子工作初心者は意外と知らないのだが,マイコンのIOピンで直接モータを駆動することはできないのだ.
壁センサに使用するLEDの発光方法の1つ.単純にパルス点灯させるのではなく,コンデンサに溜めた電荷を瞬時に流すことによって発光量を稼ぐ手法.近年は指向性・パワーともに高いLEDが出回っているため,大抵の場合はパルス点灯で十分である.
加速度の時間変化量(時間微分).加加速度とも.躍度が連続となる軌道を与えることで,タイヤに急激な力がかかりづらくなり,滑りの解消につながる.
競技者が機体に指令する方法.マイクロマウスの小さな機体に搭載できるスイッチやLED等の数は限られるため,ロータリーエンコーダ,壁センサ,ジャイロセンサなどを使用してメニュー選択を行えるようにすることが多い.
2017年には音を使用して指令を行うマウスが登場し,会場を沸かせた.
ハーフサイズ競技で頻繁に登場する渦巻き状の経路のこと.「それはラーメンじゃなくてなるとでしょ!」と思わずつっこみたくなる.ラーメンどんぶりの模様のことを指しているのではという説もある.ラーメンを通ると経路が長くなるだけでなく,同じ方向に何度も回るため角度の偏差が現れやすいという技術的な難しさもある.
ゴールにたどり着く前に走行を中断すること.退職することでも敗退することでもない.
リチウムイオンポリマー電池.リチウム・ポロニウムではない.エネルギー密度が高く,軽量・小型で大容量であることが良い特徴であるが,使用方法を誤ると火災に至る場合もあるため,十分な知識を持ち注意を払って使用するべきである.
参考: リポ電池の充電にはご注意! | RT Robot Shop Blog
マイクロマウス用語としてはベアリング2個で駆動軸を支持することを指す.
材料力学で出てくる両持ちではない.お願いだから学術用語に対する敬意をもっと払ってほしい.
似ていること.同一の団体からの参加者が同一と思われる機体とプログラムを使用して上位をさらっていく事案が発生したため,車検・タイム・経路等がほとんど一致している機体の決勝進出権は一台までしか認めないという制度が定められた.類似性の定義は曖昧であり,審査員の一存で決められることから,一時物議をかもした.
貴重なデータ.目視をあてにするよりも,ログを参照しながら制御ゲインや走行パラメータの調整を行う方が効率が良いため,面倒くさがらずに早めに実装するべき機能である.
マイクロマウス大会において,マイクロマウス競技とともに開催されるライントレースロボットの競技.黒の床面に白いテープで引かれたラインをたどるタイムを競う.
ほかのロボットのタイヤが通った跡.
迷路の床面は競技開始前に清掃されるが,それでもタイヤのゴムは走行時に細かいホコリを少しずつ集めてグリップを失ってしまう.そのため,わだちができる後半の出走が有利であるとされている.
]]>LaTeX Beamerを使いはじめるにあたって,はじめにぶち当たる障壁はなんといっても図の配置だと思います.PowerPointやKeynoteといったWYSIWYG系のプレゼンテーション作成ツールに慣れている人がBeamerスライドを見ると,「ここの図をもうちょっと左に動かして」とか,「ここの部分赤丸で囲んだほうが良いんじゃない」みたいな指摘が飛ぶことがあるのですが,楽な方法がなかなか検索しても出てきません.
これまで私は\vspace
や\hspace
をふんだんに駆使して図を巧みに配置していたのですが,さすがにこれではコードが汚くなりすぎます.というわけでシンプルでかつ効果的な方法を見つけたので書きます.
サンプルスライド:
textposパッケージを利用します.プリアンブルに以下を記述します.
absolute
: textposパッケージを絶対座標指定モードで使用するoverlay
: 文字の上から配置するtextblock*
環境の幅と座標を指定して,中に表示させたい図表やテキストを差し込むだけでOKです.ここで,figure
環境を使わないことがポイントです.figure
環境を使用した場合,y座標がずれる可能性があります.
TiKZで描画した図形も同様にして配置できます.
アスタリスクなしのtextblock
環境との違いは値を自由に指定できる点です.textblock
環境の方は,変数で設定した値の定数倍の位置に配置するものになっているので,このような用途ではtextblock*
環境の方が使いやすいと思います.
eso-picパッケージを使ってスライドの上からグリッドを表示することで,座標の決定が楽になります.
layoutパッケージを使うとプレゼンのヘッダやフッタ等のサイズを簡単に調べることができます.配置がうまくいかないときのデバッグに便利です.
この記事では,textposパッケージを用いた図表の絶対座標配置の方法とTipsを解説しました.textposパッケージはもともと発表ポスターを作る際の図の配置を便利にしようというモチベーションで開発されたもののようですので,Beamerとの相性も抜群ではないでしょうか.お困りでしたらぜひお試しください.
関連記事: TeXでプレゼン - LaTeX Beamerを使う人のためのTips集
最近身も心も寒いので,とりあえず身の寒さだけなんとかしようと思い暖房をつけるのですが,最近こんなニュース[1]を見てしまったせいで,
暖房ってめっちゃ無駄なのでは??
と思うようになってしまい,マイニングで暖を取る環境を整えようと決意したのが数日前の話です.しかし,BitcoinやBitcoinCash等の有名所の通貨はもはや新規参入に旨味がない上,送金にも時間がかかるし手数料も高いというのが現状です.それはあまりにももったいないので,マイナーなコインを採掘して小銭を得つつ暖を取るというのが今回の目標です.
あの2000年代後半の 円天事件の円天ではありません .
円天事件はこれ↓
擬似通貨「円天」は電子マネーとして使用可能と公開されていた。10万円以上を預け、あかり会員になると「1年ごとに預けた金額と同額の円天を受け取ることができる」「年利100%の金利が払われる」とされ、受け取った円天は、円天市場で利用することが可能とされていた。
擬似通貨ではない 仮想通貨「円天」 は,2017年10月末に登場したばかりのマイナー仮想通貨です.GPUやASICでは生成しづらい種類のハッシュを使用しているため,基本的にCPUでマイニングを行うという特徴があります.わたしはGPUリッチなPCなど持ち合わせていませんので,手元にある非力なノートPCで手軽にマイニングできるのはアドです.また,マイナー通貨なので,記事を書いている時点ではそこそこ掘れています.
Yenten is made for reducing MEGA WASTE of electricity by ASIC on the earth.When this cryptocurrency spreads, reduction of CO2 emission would be realize by Yenten.
概要にCO2排出量削減とかまじめっぽいことが書いてありますが,これは(たぶん)ネタです.ウェブサイトを見ればわかりますが,「円く円天」とか,「どう払うん?」「円天で」とか完全にネタづくしです.作者の名前も conan-equal-newone (コナンは新一) とかいうやつで,これもたぶんネタです.
これで仮想通貨「円天」の魅力を知ってもらえたと思います(?).
ここから先は,実際に円天ウォレットを作成し,マイニングして報酬を得るところまでを説明していきます.
もし万が一この記事が役に立ったのであれば,ぜひチップをはずんでください.
円天アドレス: YjRBHYAcbmGkvGrKWVqFfXFrKHCRMx4gqp
まずはウォレットを作らないことには始まりません.Yenten Core[2]についているウォレットを使って,受取アドレスを取得します.
これで円天の送受信ができるようになりました.
ウォレットの準備ができたので,つぎは円天をマイニングしていきます.
ソロマイニングとプールマイニングがありますが,今回はプールマイニングを行います.使用するプールはひとまずここです:
ユーザ登録をします.
つぎに,ワーカの登録を行います.
最後に,受取口座の設定を行います.
マイニングには,cpuminer-opt[3]を使用します.
GitHubからダウンロード
バイナリ(Windows): Releases - JayDDee/cpuminer-opt - GitHub
LinuxやMacな方はソースコードからビルドしてください.
ちなみにわたしの場合 configure
のオプションはこんな感じにしました.CFLAGS="-O3 -march=native -Wall" CXXFLAGS="$CFLAGS -std=gnu++11" ./configure --with-curl
以下で起動します
$ cpuminer -a yescryptr16 -o stratum+tcp://bunnymining.work:20333 -u 10gtokoro.test -p test |
-u
と -p
には,ユーザ名.ワーカ名とパスワードをそれぞれ入力します.-B
オプションをつけるとバックグラウンド実行されます.サーバで動かす場合につけると便利です.
マイニングが始まると,下の画像のようなログが流れていきます.
また,プールの「Dashboard」で,どの程度マイニングできているか,どれだけ報酬をもらえたか等を確認することができます.
これで一連の作業は完了です.あとは待つだけ.
ゆくゆくは積んでいるボードPCたちにも頑張ってもらおうと考えています.
仮想通貨「円天」は,CPUで公平にマイニングできる特徴的な暗号通貨です.暖を取るというこの記事の目的はさておき,この機会にぜひマイニング・取引してみましょう.また,ネタですがCO2排出量が少ないという触れ込みなので,ビットコインたちが消費電力の問題で頓挫した場合は,もしかすると日の目を見ることになるかもしれません.そういう意味で,少量でも保有しておくとおいしいことがある可能性があります.
再度になりますが,もし万が一この記事が役に立ったのであれば,ぜひチップをはずんでください.
円天アドレス: YjRBHYAcbmGkvGrKWVqFfXFrKHCRMx4gqp
Siberians Use Cryptocurrency Miners to Heat Homes - Bitcoin.com News ↩
この記事の手順・スクリーンショット等は,Yenten Core v1.2.1 の時点でのものです. ↩