AWSでwebサーバを起動してSSHするまでの話(図解付き)

AWSことはじめ

この記事では、Amazon Web Service(以下AWS)で仮想マシンを起動してSSHするまでの方法をまとめます。

実行環境

クライアントPC : Mac OS 10.14.6(Mojave)
起動インスタス : Amazon Linux 2 AMI

手順

(1)AWSのページにアクセス
クラウドならアマゾン ウェブ サービス 【AWS 公式】

(2)右上のコンソールにサインインからログイン



(3)ルートユーザーを選択
(アカウントを持っていない場合は作成)


(4)インスタンスを作成



(5)起動マシンを選択
用途/使い慣れに応じて自由に選んで良い
ここではAmazon Linux 2 AMIを選択



(6)確認と作成 起動マシンしたいマシンにチェックが入っていることを確認(①)
確認して問題なければ確認ボタンを押す(②)

※ストレージやインスタンス数、ポート開放など、の詳細を設定したい時には隣のインスタンスの詳細の設定を押す
※デフォルトで22番ポート(SSHに使用)のみが解放されている為、今回の用途では設定を変える必要がないが http通信(80番)やhttps通信(443番)を行いたい場合は設定が必要(もちろん後から変更も可能)


(7)インスタンスの起動

(8)キーペアの作成/ダウンロード
①キーペア名に任意の名前を入力(以下、AAAAAと呼ぶ)
②キーペアをダウンロード
インスタンスの作成


(9)請求アラートの作成/インスタンスの表示
利用額が設定した値段を超えた時に通知するように設定可能(①)
インスタンスを表示する(②)



(10)インスタンスに名前をつける
必須ではないが、複数のインスタンスを保持しているとどれが何だか分からなくなる恐れがあるので、わかりやすい名前をつけて管理するのがおすすめ



(11)手順(8)でダウンロードしたキーペアを移動

ターミナルでコマンドを入力
$mv ~/Downloads/AAAAA.pem ~/.ssh
(AAAAAには(8)で設定した名前を入力、ここではaws_test)


(12)mac本体のsshの設定

ターミナルでコマンドを入力
sudo vi ~/.ssh/config

以下を貼り付け

Host BBBBB
    HostName CCCCC
    User ec2-user
    IdentityFile ~/.ssh/AAAAA.pem

※BBBBBには任意の名前を設定
※CCCCCには以下の場所のパブリックIPv4アドレス(xxx.xxx.xxx.xxx)を入力
※UserはAmazon Linuxの場合はec2-userで良いが、OSごとに異なるので注意

Amazon Linux 2 → ec2-user
CentOScentos
Debian → admin
Fedora → ec2-user または fedora
RHEL → ec2-user または root のどちらか
SUSE → ec2-user または root のどちらか
Ubuntuubuntu

Amazon Linux インスタンスでユーザーアカウントを管理する - Amazon Elastic Compute Cloud



(13)キーペアのアクセス権限を変更

ターミナルで以下のコマンドを入力
$sudo chmod 600 ~/.ssh/AAAAA.pem

(14)SSHを実行
ターミナルで以下を実行
$ssh BBBBB

このように表示されればSSH成功です、おつかれさまでした!




※(12)の設定は省略することができ、その場合は
$ssh -i ~/.ssh/AAAAA.pem User@IPv4アドレス
SSHすることができます。上のABCを使った表記だと
$ssh -i ~/.ssh/AAAAA.pem ec2-user@CCCCC
ということになります。
この方法でSSHする場合でも、Amazon Linux以外では@以前をそれぞれのインスタンスにあったものを使用する必要があります。※(12)参照

修正箇所を見つけた/この方法でSSHできない 場合はコメントを残してくださると助かります。

LED Tower

開発目的

複数のLEDを一つのマイコンで行う方法を模索する。
ここで検証された方法を用いることでLEDを使用したメディアアートの演出制御を容易にすることを目的とする。

システム概要

ハードウェア

LEDについて

LEDにはアノード(+極)とカソード(ー極)という2つの極がある。

注*

アノードを電源側、カソードをグラウンド側に配線することでLEDは発光し、逆に繋いだときは光らない。

詳しく知りたい方はこちらを参考にしてください。
www.my-craft.jp
*注 : 図はhttp://www.my-craft.jp/html/aboutled/led_kyokusei.htmlより引用

ハードウェア概要

LEDを3×3×6のタワー状に配置して、1つのarduinoを使用して任意のLEDを光らせることを目指す。
今回はLEDのアノード同士/カソード同士を接続することで同時制御を可能にする。

上から見て重なるLED同士でアノードを、横から見て同じ高さにあるLED同士でカソードを共有する。
アノード/カソード同士の共有は半田付けで行う。

装置の作り方

1 . LEDのアノード(長い方)を根元から90°折る
2 . アノードの付け根から2mm程度の箇所で下向きに90°折る
3 . カソードの付け根から2mm程度の箇所を横向きに90°折る
4 . 1~3を繰り返し、同じものを3×3×6=54個つくる
5 . 直角に曲げた箇所と、接合するLEDの端子を半田付けする

f:id:tsh982:20200728193714j:plain:w400

arduinoでのLED制御

説明の便宜上、アノードにa〜i カソードに1〜6を図のように割り振る。

アノード側の電位がカソード側の電位より高くなっている時に発光する。
arduinoの端子ではHIGH(5V)とLOW(0V)の切り替えができる。
これを組み合わせることで任意のLEDを光らせることができる。

例えば、正面から見て一番手前の(g,h,iの)層のHigh/Lowの関係とLEDの光り方の例を示す。
f:id:tsh982:20200728202131p:plain:w200

配線

上で定義したアノード/カソードの番号に対して、図のように配線していく。

図中のスティックとはジョイスティックのことであり、後に説明するLEDの点滅パターン制御に使用する。
f:id:tsh982:20200728185503p:plain:w600
このモジュールは、スティックのx,y方向の値を0~1023で返す。
また、スティックを押し込むことでスイッチを押すことができ、通常時に1、押し込まれると0が返される。

ソフトウェア

機能

以下の二つの機能を実装する。

①天気の表現

LEDの点滅パターンで天気(晴/曇/雨)を表現する。

また、スティックを左右に倒すことでどの天気を表示するか切り替える。
スティックを左右で倒すことで変数を下のように遷移することで実現する。
f:id:tsh982:20200728192058p:plain:w400

②サイコロ

1~6の中からランダムな値をLEDタワーで表示する。
出目がnのとき、下から数えてタワーの1~n番目のLEDが全て点灯する。
例えば、出目が4の時の見た目はこのようになる。
f:id:tsh982:20200728203007p:plain

デフォルトは天気モードで、スティックを押し込むことでサイコロモードへ遷移する。
サイコロモードが終了すると自動的に天気モードへ戻る仕組みにする。

実装

今後の応用

今回はarduinoの端子の数を考えて手軽に作れる336のタワーを作成したが、シフトレジスタを使用することでより大きいタワーやキューブが作成できそうなことが分かった。
また、今回実装した仕組みでは表示不可能なパターンも存在してしまう。
例えば図のようなパターンを表示させたい時、(g,h,i)=(H,L,H),(1,2,3,4,5,6)=(L,L,▲,▲,▲,▲) とする必要がある。(▲はH/L任意)
f:id:tsh982:20200728204500p:plain
しかし、この組み合わせでは(g,5)と(i,6)も点灯してしまい、欲しいパターンが入手できない。
これでは不便なので、さらなる改善の余地がある。

また、天気の表示について、今はスティックを使用してモードを切り替えているが、これを湿度センサなどを使うことで実用性のあるものにできるかもしれない。
また、動画を見てもらってわかるように、今のままでは(雨だけは何とか分かるが)天気がわかりづらいという難点もあり、表現力を高める必要も出てくる。

何はともあれ、3×3×6のタワーは作れたので、次は上にあげた課題に取り組んでみたい。

Catch Chestnut

開発目的

瞬時の状況判断それに応じた咄嗟の行動力を鍛えるシステムの開発

システム概要

このシステムは簡単なゲームになっている。

figure1に示す2枚の画像のうち1枚がランダムでディスプレイに表示される。

figure1

表示された画像に応じて、以下の動作を制限時間以内に行う。

「くり」 → 指定秒数以内に 手をグーにする
「いが」 → 一定秒数の間 指を動かさない

時間内に正しいアクションができれば成功
それ以外は全て失敗となる

システム説明

1.動作原理

このシステムを構築するにあたり重要となるのは

「手を握る」動作
「何もしない」状態

この2つをどのように検出するかという点である。

これらを検出するために「浅指屈筋」の筋電位を測定することにする。

a . 浅指屈筋

浅指屈筋をfigure2に示す。

figure2※1

浅指屈筋の収縮は手関節の掌屈に作用、つまり手を握る動作が発生する。

b . 筋電位

また、筋電位とはその名の通り筋肉の電位であり、安静時は値がとても小さく、筋収縮が起こると大きな値になる。
つまり、この波形を見ることで、対象としている筋が収縮活動を行なっているか確認できる。


以上より、浅指屈筋の筋電位を見ることで手を「手を握る動作」「何もしない状態」を検出できる。

2.ゲーム性の実装

このシステムをゲームとして成り立たせるために
A . 「くり」が表示された時の動作制限時間
B . 「いが」が表示された時の動作制限時間

をほどよい長さで設定する必要がある。

A . 「くり」が表示された時の動作制限時間
については短ければ短いほど難易度が上がってしまう。
Aのケースでのミスは「くり」の見逃しである。
ユーザの動作選択肢は「手を開いたまま」か「握る」かの二択であり、動作制限時間がな短いほど見逃しの可能性は高くなる。

設定制限時間の長さを変えて複数回試行したところ、0.5秒に設定がちょうど良いことが分かった。

0.5秒より長いと難易度が下がり
0.5秒より短いと手を握る動作が間に合わず、極端に難しくなる。

B . 「いが」が表示された時の動作制限時間
こちらは極端に短いとミス(手を握ってしまう)を検出できない。
また、極端に長いと、正しい対応(握ってはいけない時に握らない)の判定に時間がかかり過ぎてしまい、ユーザビリティが低下する。

こちらについても長すぎず、短すぎずの調整が必要であり、3秒がちょうど良いと言う結論に至った。

3.実際のプレイの様子

実際にできたものをプレイしてみるとめちゃくちゃ難しい...

これを毎日やれば、コップが机から落ちた時には瞬時に手が伸びて、ハサミが落ちた時には見逃すことができるようになりそうだ。

※1 figure2 : http://therapistcircle.jp/senshikukkin より

VS Codeで " { " を改行させない

きっかけ

MacBookProのOSをCatalinaからMojaveにダウングレードさせる際、アップデート時にバックアップを取っていなかったためMBPを出荷時の状態に戻す作業が必要であり、当然VSCodeの設定もやり直さねばならなかた。 宗教的に様々な流儀があるが、私はC言語系の波括弧は関数やif文の ()の後ろに改行なしで書きたい。

VSCodeでは()の後ろに改行を挟んで { を記述することがデフォルトのフォーマット様式になっている。

というわけで、今後もPCの買い替えなどでVSCodeの再設定の機会があるだろうし備忘録として書き残しておく。

1 : Clang-FormatをVSCodeへインストール

まず、VSCode拡張機能からClang-Formatをインストールする。

これによってVSCodeでClang-Formatを使用できるようになった。

2 : clang-formatをMacへインストール

次にMac本体へclang-formatをインストールする。

$ brew update
$ brew install clang-format

これをターミナルに入力。
これにより 1 でVSCodeにインストールした拡張機能を使用できるようになったが、後もう1ステップだけ必要になる。

3 : .clang-formatファイルを作成する

1 の拡張はカレントディレクトリ or ルートディレクトリに置かれている.clang-formatというファイルに書かれているフォーマット設定をコードの整形に反映させる。

以下をターミナルに入力して、その.clang-formatファイルを作成する。

$ clang-format -dump-config -style="@@@" > .clang-format

@@@の箇所には自分の好みのフォーマットスタイルを指定する。 使えるのは以下の通り。

Visual Studio
LLVM
Google
Chromium
Mozilla
Webkit

どれを使用するかは完全に好みだがWebkit以外では、コードの一行が長く、そこにコメントがついている箇所では、気持ち悪い改行が自動で挟まれる。

GoogleLLVMを使用すれば、それだけで主題の { 問題は解決されるのだが、上に示したコードの折り返し問題が新たに発生する。

Googleなどをスタイルに適用して折り返し問題に対応するより、Webkitを適用して { 問題を処理する方がシンプルで簡単であると踏んで私はWebkitを採用した。

4 : .clang-formatを編集する

上記の手順でルートディレクトリに.clang-formatファイルが作成できたので、次はこれを編集していく。
ターミナルに

$ vi .clang-format

と入力し編集していく。 今回は波括弧をどうにかしたいのでBreakBeforeBracesの項目を編集する。

上の図のようにこの項目をAttachにすることで波括弧を全て ) と同じ行に表示することが可能になった。

快適なプログラミングライフを!

その他の項目についてはこのページに丁寧にまとめられている。

yasuharu519.hatenablog.com

参考ページ

https://blog.takuchalle.dev/post/2018/04/26/setup_clang_format/

https://qiita.com/para7/items/b4a90dd7338320655357

MacOSをCatalinaからMojaveにダウングレードしようとした話(TimeMachineのバックアップ無し)

正直Catalinaってどうなの?

Catalinaへのアップデートに伴ってMojaveの使用では起こらなかった不具合(不都合)が生じて苦労している人はたくさんいると思うし、私もその一人だ。

Catalinaは完全に64bitに移行した初めてのMacOSのバージョンで、まだ少し32bitアプリが存在している現段階では少し不便なところがある。1か月近くCatalinaを使ってきたが、そろそろ不具合(不都合)の連続に耐えかねてMojaveへのダウングレードを決行。

ダウングレードに当たって他記事では見当たらなかった症状に直面したので、もし同じ状況になった人の為に本記事を書くことにした。

OSの大幅アップデートの前には必ず
Timemachineでバックアップをとろう

いざダウングレードを決行しようと方法について調べるが、出てくるのはTimemachineというMacのバックアップ機能を利用したものばかりだ。

macOSユーザガイド - Apple サポート

他にも方法を調べてみたところ、Catalinaへのアップグレード時にTimemachineでバックアップをとっていなかった場合は、一度ディスク(PC上の全データ)を削除してからMojaveを再インストールする方法をとる他に手段がない様子。 不本意だが使用したいアプリがCatalinaでは動いてくれないので、止むを得ずフォーマットによるダウングレードをすることに。

こちらのサイトを参考にした。

Mac OSをダウングレードする3つの方法を詳しく解説 | スマホアプリやiPhone/Androidスマホなどの各種デバイスの使い方・最新情報を紹介するメディアです。

いざダウングレード

普段はGoogleDriveFileStreamを使っていてMacのデータはGoogleDriveに同期してあるのでバックアップ作業はそんなに大変ではなかった。

同期していなかったローカルデータをDriveに避難させたところで

1.MacBookProを再起動

2.リンゴマークが出たら ⌘+R でOSユーティリティを起動

3.ディスクユーティリティを開く

4.Macintosh HD を選択して削除

と、ここまでで現在インストールされているCatalinaを削除完了、あとはMojaveをインストールするだけ

のはずだった。

PC、それは突然落ちるもの

ようやくMojaveに帰れると思って安心したところでPCの画面が突然に暗くなった スリープ状態かと思い、トラックパッドを軽くなぞる

反応しない

キーを押してみる

反応しない

電源ボタンを押してみる

リンゴマークが表示される

なぜだか分からないが電源が落ちていたようだ。

少し経って画面を見てみるとこのようなアイコンが点滅している。

一切の操作が受け付けられない。

OSユーティリティを再度開くために

強制終了→再起動→⌘+R

この操作を行うもユーティリティは開かず、上のアイコンがただ点滅するだけ。

もしや、ディスクをフォーマットしたために起動プログラムまで消えてしまったのかもしれない

ネットで探しても同様の症状の人は見つからずパニック状態。

持ち込み修理にしても、近場のAppleStoreはまでは1.5時間かかる。
必要大至急とはいえこのご時勢、なるべく遠出は控えたい。

(何よりコロナでアルバイトが全て消し飛びお金がない、
以前にディスプレイ修理で6万円消し飛んだことを思い出した)

30分ほど色々試してみたが、どれもダメだったので最終手段、Appleのサポートに連絡を取ることに。

早速サポートページへ




お客様の製品は無償テクニカルサポートの対象ではないようです。


万事休す


もう30分さらにいろんな方法を模索するもどれもだめそうである。
いよいよAppleStoreへ必要大至急の外出をしなければいけないか?

無償サポートが切れた製品でも
"後日電話したい"から電話サポートを受けられた

回復方法を調べてもラチがあかなかったので、どうにか有料でも電話サポートを受けられないものかと考えもう一度Appleのサポートページへ。

https://www.apple.com/jp/
> サポート
> MacBookPro
> 下へスクロールし サポートが必要なときは (Get Support) >起動または電源 >該当するトピックがない >症状を記入 >"後日電話したい" >メールアドレスを入力 の順で操作を進めていく

すると、受付番号とappleの電話番号が出てきたので電話をかける

これでようやく藁にすがることができそうだ。
自分で色々試してダメだったから、果たしてサポートを受けたところで直るのか半信半疑だった。

Appleサポートのお姉さん本当にありがとう

上記の流れで電話によるサポートを受けられることになった。 状況を伝えたところ
Macを強制終了した後に「option + command + Shift + R」キーを長押しして下さい と伝えられた。

このコマンドも自分で試していたが、自分の場合は電源を入れリンゴが表示されたタイミングでコマンド入力をしていた。

指示通りに行うと、先ほどのファイルのマークではなくOSのインストール画面が表示された。
このコマンドでは、工場出荷時のOS(自分の場合はMojave)を再インストールすることができるらしい。

ネットワークの設定を行いこれでOSのインストールは無事に終了。

こんなにあっさり解決されてしまいポカーンとしていた。

OSインストール後

Mojaveインストール後は、初期設定を行い通常に使用することができた。
モハーヴェ砂漠のデスクトップを見て一気に安心。

動いてくれてよかった〜〜〜〜

まとめ

・OSのアップデート時には必ずバックアップを取る
・餅は餅屋、MacApple

Saitekika

開発目的

身近なファミレスをお得で健康に楽しむ方法を開発する

システム概要

予算内で高カロリー・低塩分に注文するメニューの組み合わせを探す

システム詳細

1 . 対象店舗の決定

よりこのシステムを意義ものあるためにするには、対象店舗が多くの人々にとって馴染みのものにする必要性がある。そこで全国的に展開されていて日本人に最も親しみの深いファミレスの1つと言えるサイゼリヤを今回の対象とする。
サイゼリヤのグランドメニューがネット上で公開されているため、そこにj掲載されているメニューを本システムの対象として扱う。

www.saizeriya.co.jp

2 . 予算の設定

学生間で執り行われる飲み会代として一般的と考えられる

¥3,000

を今回の使用可能な予算に設定する。

3 . 定式化

この問題は以下のように定式化できる

上限金額 P_{max}=3,000[円]

上限塩分量 S_{max}=20.0[g]

i番目の注文メニューの金額 P_i[円]

i番目の注文メニューの塩分 S_i[g]

i番目の注文メニューのカロリー C_i[kcal]

としたとき

制約関数
\displaystyle{\sum_i P_i ≦ P_{max}}

\displaystyle{\sum_i S_i ≦ S_{max}}
において
評価関数
E(P_i,S_i,C_i)

を最大にする注文の組み合わせを見つける。

ここで評価関数E_i(P_i,S_i,C_i)について
・塩分量は少なく
・総カロリーは多く
・金額は多く使った方が多くの料理を注文できる
という点を考慮して以下のように定義した。

\displaystyle{E(P_i,S_i,C_i)=\frac{\sum_i P_i + \sum_i C_i}{\sum_i S_i}=\sum_i \frac{P_i + C_i}{S_i}}

4 . 使用するアルゴリズムの決定

ここで注文した各料理に対しての評価関数E_i(P_i,S_i,C_i)

\displaystyle{E_i(P_i,S_i,C_i)=\frac{P_i + C_i}{S_i}}

と置くと

\displaystyle{E(P_i,S_i,C_i)=\sum_i E_i(P_i,S_i,C_i)}

と書ける。

ここまでを踏まえると以上は
重量制限を総金額,総塩分の制限に、
総価値の最大化を評価関数E_iの合計の最大化に置き換えたナップサック問題1の応用であるとみなすことが出来る。以下、サイゼリヤ問題と呼ぶこととする。

以上より、今回の問題は制約関数が一つ多いナップサック問題の応用に帰着することができた。ナップサック問題はNP困難2であるため、最適解を求めるのに今回は遺伝的アルゴリズムを用いて最適解に近い組み合わせを求めることに決める。

結果

上記で定めたサイゼリヤ問題を遺伝的アルゴリズムで解くとtable1のような近似最適解が得られた。

table1

考察

table1を見るとアルコールがあり実に楽しそうな結果が得られた。
このようになった理由は評価関数Eにあると考えられる。

いまEは以下のように定義されている。

\displaystyle{E(P_i,S_i,C_i)=\frac{\sum_i P_i + \sum_i C_i}{\sum_i S_i}}

塩分の総量が分母にあるため

\displaystyle{\sum_i S_i}= 0[g]

になるような注文方法だと評価関数Eが無限大に発散してしまう。

また、塩分のオーダーは高々10^1なのに対して金額やカロリーのオーダーは高々10^3である。
これでは評価関数内でそれぞれのパラメータを同等に扱えていない。
今回のケースでは、分母にあるオーダーの小さい塩分が他の二つよりも大きな影響を与えてしまっていることになる。

以上二つの理由より、評価関数の見直しが必要である。 ここで以下のように改めて評価関数E(P_i,S_i,C_i)を定める。

\displaystyle{E(P_i,S_i,C_i)=\sum_i C_i + \sum_i P_i - 100*\sum_i S_i}

こうすることにより ・0除算による評価関数の発散 ・金額/カロリー/塩分 のパラメータのオーダー違い を解決することが出来る。

上の場合と同様に

\displaystyle{E_i(P_i,S_i,C_i)=C_i + P_i - 100*S_i}

とすることで

\displaystyle{E(P_i,S_i,C_i)=\sum_i E_i(P_i,S_i,C_i)}

と書けるので、相変わらず遺伝的アルゴリズムによって近似解が求められる。サイゼリヤ問題に新しい評価関数を適用した問題をサイゼリヤ問題(改)と呼ぶことにする。

このサイゼリヤ問題(改)に対して再度遺伝的アルゴリズムを適用して最適なメニューの組み合わせを求める。

結果 その2

サイゼリヤ問題(改)に対して遺伝的アルゴリズムを用いたところ、table2のような近似最適解が求められた。

table2

結論

サイゼリヤを健康に楽しむためには酒類と炭水化物を大量に注文することが有効であることが本システムによって解明された。

これは他のファミリーレストランチェーンに対しても言えるのではないかと考えられるが、その一般性についての検証は今後の課題としたい。



1 . ナップサック問題
重量と価値の2つのパラメータを持つ色々な種類のお宝が目の前にある。
重量制限があるナップサックを用意し、総重量の制限内で価値最大となるお宝の持ち帰りの組み合わせを求める問題である。
NP困難であることが証明されている。

2 . NP困難
正面から戦うと時間がかかり過ぎてとても解けない問題

Tracking Manipulator

開発目的

モーター動作によるリンク機構の制御を応用した実用的なシステムを作成する。

システム概要

手の動作を認識しマニピュレータの先端が前にある物体の動きに追従してく。
figure1にシステム全体と動作のイメージを示す。

figure1

システム詳細

システム全体は3つのモーターと平行四節リンクで構成されている。
また、マニピュレータの先端には距離センサが3つ付けられている。

1 . マニピュレータ先端の位置制御の仕組み

figure1はfigure2のように簡略化できる。
ここでモーター1,2とリンクの結合部を原点にとり右手座標系を採用している。

figure2


黒丸●はマニピュレータ先端を示す。
このうち\theta_0はfigure1のモーター0で制御する。
これをY-Q平面で見たときの図をfigure3に示す。

figure3


\theta_1はモータ1で、\theta_2はモータ2でそれぞれ制御する。
マニピュレータ先端P(x,y,z)に向けて逆運動学によって\theta_0,\theta_1,\theta_2を決定する。
マニピュレータの腕の長さをどちらもlとすると逆運動学より

\theta_0=tan^{-1} \dfrac{z}{x}

\theta_1=tan^{-1} \dfrac{x}{\sqrt{x^2+z^2}} + cos^{-1} \dfrac{\sqrt{𝑥^2+y^2+𝑧^2}}{l}

\theta_2=tan^{-1} \dfrac{x}{\sqrt{x^2+z^2}} - cos^{-1} \dfrac{\sqrt{𝑥^2+y^2+𝑧^2}}{l}

が求まる。

制御したい位置の座標P(x,y,z)から上の式を用いて\theta_0,\theta_1,\theta_2を計算し、PID方式によって各モータの角度を制御する。

2 . マニピュレータ先端のセンサの仕組み

上で述べたように、マニピュレータ先端には3つの距離センサが取り付けられている。
その様子をfigure4に示す。

figure4

各センサは、目の前に物体があるとき、その物体との距離を返す。
検出可能な範囲内に物体がないときは非常に大きな値を返す。

この特性を利用して、目の前にある物体が移動した方向を以下のような原理で検出する。

例えば、物体がfigure5のように現在位置から右に移動したとする。

figure5

移動前、全てのセンサからは物体との距離が返されている。
移動後、センサ1,2からは物体との距離が返されるが、センサ0の前には物体が無いのでそのことを表す"非常に大きな値"がセンサから返される。
これを検知し、物体は「右に動いた」と判断する。
そして、物体の動いた方向にマニピュレータの先端も動かす。

次に物体とセンサが一定距離を保つようにする動作原理を説明する。
マニピュレータ先端に取り付けているのは距離センサなのでこれを利用する。

figure6


figure6に示す平面\alphaはマニピュレータ先端の距離センサで構成される平面である。
物体が平面\alphaに近づくと距離センサが返す値は小さくなるので「近づいた」と判断し、物体から離れるために物体の動きと同じ方向にマニピュレータ先端を移動させる。

同様にして、センサから遠ざかるように動いたときは平面\alphaから距離が離れ、センサの値は大きくなるので、マニピュレータ先端は物体を追うように動く。

このふたつの仕組みによって、距離センサで物体の動きを追跡することが可能になる。

3 . OpenGLによるマニピュレータの可視化

センサが認識した物体の位置と、現在のマニピュレーターの状態とを、OpenGLを用いて可視化できるようにした。
figure7にその様子を示す。

figure7