鏡映変換Q(θ)について

ここでは鏡映変換

\[
Q(\theta) = \left(
\begin{array}{cc}
\cos(2\theta) & \sin(2\theta) \\
\sin(2\theta) & -\cos(2\theta)
\end{array}
\right)
\]

について考えます。

まず、モータ制御をするにあたって、次のような性質がある行列が分かると便利です。

「α,β平面にある任意の点xを、”角度θを対称とする角度かつ、原点からの距離がxと同じ”点に映す。」

何言ってるかわからないので、下の図を見てください。

はい、これを考えていきます。
考えるにあたり、変換を次のように解釈すれば容易です。

①回転行列をかけて補助線0度にする。

②0度を中心の鏡映変換を考えてあげる(ここではTとします。)

③補助線をもとの角度θに戻す。

この操作をすることで、

\[Q(\theta)=R(\theta)TR(-\theta)\]

という行列に変換できます。
(結局Tで鏡映変換しているので、面倒くさくしてるだけじゃん!)と思われると思いますが、0度の鏡映変換は、β(y座標)を反転させるだけなので、極めて簡単な行列で表現できます。

\[
T =
\begin{pmatrix}
1 & 0 \\
0 & -1
\end{pmatrix}
\]

これを使って以下のように計算できます。

\[
Q(\theta)=R(\theta)TR(-\theta)
\]

\[
= \begin{pmatrix}
\cos\theta & -\sin\theta \\
\sin\theta & \cos\theta
\end{pmatrix}
\begin{pmatrix}
1 & 0 \\
0 & -1
\end{pmatrix}
\begin{pmatrix}
\cos\theta & \sin\theta \\
-\sin\theta & \cos\theta
\end{pmatrix}
\]

\[
=\begin{pmatrix}
\cos^2 \theta – \sin^2 \theta & 2\sin\theta \cos\theta \\
2\sin\theta \cos\theta & \cos^2 \theta – \sin^2 \theta
\end{pmatrix}
\]

\[
=\begin{pmatrix}
\cos(2\theta) & \sin(2\theta) \\
\sin(2\theta) & -\cos(2\theta)
\end{pmatrix}
\]

つまり、θを対称とする鏡映変換は、このような2θの三角関数の行列で表現できる訳です。面白いですね。

モータ制御キットを作った

モータを制御するためには、
・電源
・コントローラ
・ドライバ
などとそれぞれ分かれているため、配線などが煩雑になってしまいます。


さらに、私は(現実ではなく)インターネット上で知り合った方と一緒にモータ制御をやっているため、個人個人の環境で全然違う事が起こる現象、いわゆる「おま環」が発生するのを嫌い、作ってみました。

まずはマイコン基板を作ります。

途中遊びでレース柄の基板も作ってみました。
仕事じゃないのでオシャレな柄で作りたいなーって思って作っているのですが、流石にフットプリントが全く見えないデザインは、実装がしんどいので、今度は実装まで頼もうと思います…

3相ドライバは中華製のものを購入しました。
以下が実際に作成したものを、中華製の市販品に接続してる風景です。

CADを作成して、アクリルは発注して作ってもらいました。

本棚にも収まるので、制御則など、理論を触りたい人にとってはとても収まりが良いかと思います。

一品仕上げるのに、非常に手間がかかるため(主にはんだ付けで!)
現在は市販等の予定はありません…

CubeIDEでBoostを使う

C++には、constexprやTemplateといった、強力なコンパイル時処理の仕組みがあります。

これを活用することで実行時には超高速で処理することができるようになったりしますが、いちいち自分で作っていくのも大変なので、今回はBoostライブラリを活用する方法を紹介致します。

以下環境です。
CubeIDEに加えて、arm-none-eabi-gccのインストールされている環境が必須です。

OS
Windows10

IDE
STM32CubeIDE
Version: 1.0.0
Build: 2872_20190423-2022 (UTC)

Boost
Version1.72.0
https://www.boost.org/users/download/

arm-none-eabi-gcc
Ver8.2.0

①ダウンロード+コンパイル

Boostの公式ページ(https://www.boost.org/users/download/)から、ダウンロードしてきて、展開します。(展開後に、Boost1_72_0というフォルダが作られていると思います。)

次に、
Boost1_72_0/user-config.jam
というファイルを作り以下を記述します。

# user-config.jam file
# Arm Cortex M
using gcc : 8.2.0 : arm-none-eabi-g++.exe ;

ここで、コマンドプロンプトを起動して、
>arm-none-eabi-g++ –version
が正しくバージョンを返す事を確認してください。
もし、何も反応が無いようでしたら、環境変数でarm-none-eabi-gccのpathが通っていないと思います。arm-none-eabi-gccのインストール作業を見直してください。

次に、Boost1_72_0 内にコマンドプロンプトを立ち上げます。
私の場合は、次のようになっています。

E:\Boost\boost_1_72_0>

ここで、次のようにコマンドを入力すると、コンパイルが行われます。

E:\Boost\boost_1_72_0>b2 --toolset=gcc-8.2.0 --prefix=./ArmM link=static install

バージョン等は適宜読み替えてください。

②CubeIDEに導入

コンパイルが終了すると、boost_1_72_0/ArmM というフォルダが生成されます。
ここにライブラリの本体が入っています。

本当はCubeIDEにライブラリのリンクを設定するべきですが、今回は簡単のために、全部プロジェクトファイル内にコピーして進めていきます。

まずは、使いたいプロジェクト(今回は「STM32H743ZI_BOOST」としました。)内に、Boostというフォルダを作成します。
プロジェクト名(右クリック)>New>Folderなどから簡単に作れると思います。

次にプロジェクト設定を操作します。
プロジェクト名(右クリック)>Properties>C/C++ Build>Settings>Tool Settings>MCU G++ Compiler>Include paths
からインクルードパスを設定できます。

ここに、
../Boost
を追加します。画像は既に追加済みです。

最後に、Boostの本体をコピーしてきます。
先程作った、プロジェクト内のBoostフォルダをエクスプローラで開いて、
\ArmM\include\boost-1_72\boost

\STM32CubeIDE\workspace_1.0.0\STM32H743ZI_BOOST\Boost
内にコピーします。
Boostの中にboostがあり、紛らわしい状況ですが注意してください。

以上で、Boostの導入は終了です、お疲れさまでした。
確認のため、

#include <boost/version.hpp>

void func() {
    int i = BOOST_VERSION;
}

のようなソースを、コンパイルしてみると良いと思います。
コンパイルに成功したら、導入が成功しています。

Boostは主にアプリケーション向けのライブラリとして幅広く使われておりますが、組み込みでも活躍できると思います。
別ページに書こうと思いますが、Sprintfの置き換えとして、Boost::spirit::karmaを使うことで、3倍?程度早くなることは確認しています。

代償としてコンパイル時間がboostされますが…
今後コンパイル時間を短縮する工夫を書いていければと思います。