クワマイでもできる

クワマイでもわかる

Atomのmarkdown previewで数式を見る

f:id:kuwamai:20190710182848p:plain

tex形式で数式を書くとき、リアルタイムにプレビューしながら書きたいなって思った。Atommarkdown preview機能を使うことにした。下記手順が面倒な人はVisual Studio Code使うといいかも。

必要なパッケージのインストール

Atomはデフォルトのmarkdown preview機能だと数式が見れないので、パッケージをインストールする。下記記事を参考にmarkdown-preview-plusとmathjax-wrapperをインストールしました。

見出しのフォントサイズを変更する

markdown-preview-plusだと見出しがめちゃくちゃでかい。ちょっとしたメモにも使いたかったので設定で小さくすることにした。下記サイトを参考に見出しサイズを変更することができました。

↓こんな感じ

.update-preview {
  font-size: 0.8em;
  font-family: sans-serif;
}

その後

Atomはアイコンが可愛いなって思って使ってたのだけど、Visual Studio Codeをおすすめされて今はそっちを使ってる。Visual Studio Codemarkdown previewで数式も表示されるし文字サイズもちょうどいいのでいい感じ。

VRからロボットを操作する記事を書きました

f:id:kuwamai:20191215165149j:plain ちょっと前の話だけど、HMDとコントローラで構成されたVR機器でロボットを操作した。簡単に言えば僕の手の位置と頭の向きをロボットが真似するやつ。その際趣味TECHオンラインというサイトにお誘いいただいたので、記事を書いた。

動いている様子

記事にも載ってるんだけど一応ここにも動画を。

書いた記事

大事なことは全部ここに書いた。見てくれ。

GitHub

先輩に暖かく見守られながら製作した記録がここに。ちなみに動画でお察しだけどバグが多々あるのであまり参考にはならないかと思います。

感想

人様のサイトに何か書くのは初めてだったけど楽しい。制作を通して先輩や研究室の皆さんに大変お世話になりました。ありがとうございます。特にTiryohさんには全面的にアドバイスをいただいたり、撮影のお手伝いをしていただきました。この場で感謝申し上げます。

VRChatからリアル扇風機を動かす

f:id:kuwamai:20181023195819j:plain VRChatからリアル側にアクションを起こせたら面白そう。今回は縁があってタナベさん、いくこさんとVRChat上のボタンからリアルの扇風機を動かすことができた。っていう思い出記事を2018年9月10日に書いたのに下書きのまま放置してたので供養します。

できたもの

きっかけ

VRChatからラジコンを操作する

以前オフ会の余興としてパノラマカメラでリアル会場の様子をVRChatから見つつラジコンを操作する取り組みがあった。この時点ですでにカオス。

ラジコンと大きいバッテリーと回路が揃うと気分はテロリストだった。

この時はまだWebpanelがあったので、いくこさんが用意してくださったサーバを経由してVRChatからラジコンを操作することができた。ちなみに僕はサーバから受け取った信号を元にラジコンを制御するコードと回路を教えていただきながら作ってた。ラジコンの制御回路については、趣味でラジコンやってるれいちゃんさんに教えてもらいながらできた。

しかしWebpanelは死んだ。他の方法が必要になった。

制作の記録

全体の構成

f:id:kuwamai:20191216015740j:plain

センサを用いてVRChatの画面の明るさを取得し、明るさに応じてアクションを起こす仕組み。例えばスイッチを押すと白→黒に変化するオブジェクトがあれば、センサの値が変化するので、VRChat上のスイッチ入力がリアルで検知できる。

ちなみに元ネタはこちら。

回路図

f:id:kuwamai:20191216022234p:plain

Arduino UNOにセンサのCdSセルと、動かす対象のサーボモータを接続した。お蕎麦屋さんにモータドライバがなかったため、冒頭の動画はサーボでスイッチを押す方式にしている。逆に他の電子部品がお蕎麦屋さんに揃っていることが驚きである。

プログラム

こんなプログラムを書いた。myservo.write()が書かれている部分にそれぞれ明るくなったときと暗くなったときに実行したい処理を書く。

#include <Servo.h>

Servo myservo;
int cds_pin = 0;
int servo_pin = 3;
int val = 0;

void setup() {
  myservo.attach(servo_pin);
  Serial.begin(9600);
}

void loop() {
  val = analogRead(cds_pin);
  Serial.println(val);

  if(val >= 350){
    //明るくなったときの処理
    myservo.write(90);
  }else{
    //暗くなったときの処理
    myservo.write(0);
  }

  delay(100);
}

あまりオススメはしない

f:id:kuwamai:20191216023436j:plain

ディスプレイにセンサを貼り付ける時点で相当不格好だし、ディスプレイの輝度設定や周囲の明るさの影響を受けやすい。大人しく画面の色を取得するなんらかのプログラムを使うことをオススメします。

VR蕎麦屋アドベントカレンダー

本記事はVR蕎麦屋アドベントカレンダーに登録されています。長らく下書きだった記事を書き上げるきっかけをくださりありがとうございます。

自分の代わりに判子を押してくれるロボットを作る

f:id:kuwamai:20191215171519p:plain クワマイの名の下に勝手に判子を押すロボットをお友達と作った。ハッシュタグ付けてTweetするとロボットが書類っぽく印刷して押印、写真にとってTweetで送り返してくれるもの。この記事はロボットの特徴と思い出の記録。

動いてる様子

珍しく動画内で色々解説しちゃった。この記事いらないかも。 ちなみに動画内でウィーンって鳴ってるのは研究所で放し飼いにされているDQNSegway Drift W1を乗り回している音である。

実際のTweet

こんな感じでTweetすると。

こんな感じで判子を押してもらえる。

写真も結構きれいに印刷できちゃう。これは撮影風景。

GitHub

ロボットないと動かせないけど、思い出として公開。

作った人

このロボットは授業の自由製作課題をきっかけに4人で作った。大体の担当とかはこんな感じ。工作機械や実験の場を提供していただいた研究室に感謝します。

作品のコンセプト

デジタルデータで送られた書類を一旦印刷して判子押してスキャンして再び送り返すナンセンスな行為をロボットにさせたら面白いと思った。

なんとなく世の中はAIブームだし、機械が責任を負う滑稽さをビジュアライズできたらいいな。

ロボットの特徴

大体動画に書いてあるけど文章でも簡単に書いとく。

シンプルでスリムな構造

f:id:kuwamai:20191215182320p:plain

判子とカメラを載せた手先を水平に保ちつつ移動できる機構をタイミングベルトで構成した。よく平行リンク機構を使ってるアームを見かけるけど、ベルトを使った方が部品数が少ないしスリムにできる。

シミュレータを作った

f:id:kuwamai:20191215182430p:plain

期間が短かったので簡易的なシミュレータを作ってソフトの動作確認をしてた。ハードが完成するとほぼ同時に動かせたのでよかった。

シミュレータの作成については以前書いたこの記事見て。

kuwamai.hatenablog.com

軌道生成と逆運動学

点と点を直線で結ぶ簡単な軌道生成プログラムと、その軌道を実現するための逆運動学を実装した。逆運動学は以前記事を書いたので見て。

kuwamai.hatenablog.com

判子を作ってもらった

あ〜クワマイの判子欲しいな〜って思ってたらお友達から「クワマイ判子作らない?」って声かけられた。エスパーかよ。ちなみにそのお友達はさっきのDQNである。作っていただきありがとうございました。

おまけ

f:id:kuwamai:20191215184817p:plain

定期的にTweetを取得したからか、あなたがロボットでないことを証明してくださいとか連絡が来てお友達とめっちゃ笑った。多分Twitterが想像する以上にがっつりロボットだろうから。

あとこの授業課題の発表は12/10だったんだけど、その翌日にデンソー ウェーブがマジの押印電子化ロボットを発表したのでめちゃくちゃびっくりした。

TwitterのCall to action機能でTweetから動画やブログへ誘導する

f:id:kuwamai:20191102164111p:plain

Tweetは見てもらえても本編の動画やブログを見てもらえない問題を解決すべく、Twitter Media studioのCall to action機能を使ってみる。上記スクショみたいに動画やブログへのリンクが表示されるようになるので、多少はアクセスが増えたりしたらいいな。

ちなみにMedia studioは動画や画像の予約投稿とかできてCall to action以外も色々と便利。

設定したTweet

設定の手順

動画をMedia studioへアップロード

まずはCall to actionを設定したい動画をMedia studioにアップロードする。右上のメディアをアップロードボタンか、動画をドラッグアンドドロップする。

f:id:kuwamai:20191102164520p:plain

Call to actionの設定

アップロードが完了したら、動画のサムネイルをクリックしてメディアの詳細を開く。スクショ下部にある設定タブを選択。

f:id:kuwamai:20191102164759p:plain

下へスクロールしていくとCall to actionがあるので、誘導したいリンクを貼ればおしまい。

f:id:kuwamai:20191102164933p:plain

効果はよくわかんない

Call to actionのおかげでどれほどクリック数が増えたのかは謎。確認方法とかあるのかな。少なくともMedia studioのアナリティクス欄には出てこない。

アナリティクス曰く1000~2000人くらいがこの動画をちゃんと見たみたいなんだけど、YouTubeは100再生くらいなので効果はあまりなさそう。でもなんかかっこいいから今後は積極的に設定しておきたい。

VSCodeでURDFをプレビューしながら書く

f:id:kuwamai:20191006191217p:plain

以前記事を書いたURDFとxacro(XML macro)はロボットのシミュレーションに必要な形状とか物理特性、センサーやアクチュエータなどを記述できる形式。確認のためにいちいちrvizを起動してたけど、Visual Studio CodeのROS向けExtensionsにURDFをプレビューする機能があったのでメモ。

以前のxacro記事

kuwamai.hatenablog.com

使用環境

手順

VSCodeのInstallと起動

公式サイトの手順通りにやったらできた。

Installは下記コマンド。

$ sudo snap install --classic code

起動は下記コマンド。

$ code

VSCode extension for ROSのInstall

Window左端下部のアイコンをクリックしてExtensions marketplaceを開いて、ROSで検索すると出てくる。Installボタンを押せばInstall完了。

f:id:kuwamai:20191006192005p:plain

URDF previewを開く

Ctrl + Shift + pVSCodeのコマンドパレットを開いてrosって入力すると候補に出てくる。

f:id:kuwamai:20191006192945p:plain

開いてしばらく待つとこんな感じで出てくる。

f:id:kuwamai:20191006193007p:plain

間違えてるとちゃんと教えてくれる。優しい。

f:id:kuwamai:20191006193050p:plain

数値計算で逆運動学を解く

f:id:kuwamai:20191005173233p:plain Denavit-Hartenberg parametersでマニピュレータを記述し、数値計算で逆運動学を解いた。パラメータさえ書けば色々なマニピュレータに対応できるので便利そう。運動学はにわかなので違うところあったら教えてください。

Notebook

実装の例と式はJupyter Notebookに書いた。だからこのブログは参考にしたサイトの紹介だけ。

Denavit-Hartenberg parametersと同次変換行列

Denavit-Hartenberg parametersはマニピュレータの関節角やリンクの長さを表現する際によく用いられている記法。このパラメータから同次変換行列を求め、順運動学を解く。

こちらのサイトが図や式が豊富で大変わかりやすかったです。

今回はこんな感じの3DoFなマニピュレータを考える。

f:id:kuwamai:20191005182338j:plain

Denavit-Hartenberg parametersは多分こんな感じ。

^{i-1}T_i a_i \alpha_i d_i \theta_i
^{B}T_1 0 0 0 \theta_1
^{1}T_2 0 \pi/2 0 \theta_2
^{2}T_3 1 0 0 \theta_3
^{3}T_E 1 0 0 0

同次変換行列はこれに代入していく。この式をJupyter Notebookに書いてもGitHubで見るとレイアウトが崩れるから発狂しそうだった。ここに書いておく。SやCはそれぞれsin、cosの略。


\begin{align}
^{i-1}T_i&=
\begin{bmatrix} & a_{i-1} \\ I & 0 \\ & 0 \\ O^{T} & 1 \end{bmatrix}
\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & C_{\alpha_{i-1}} & -S_{\alpha_{i-1}} & 0 \\ 0 & S_{\alpha_{i-1}} & C_{\alpha_{i-1}} & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}
\begin{bmatrix} & 0 \\ I & 0 \\ & d_i \\ O^{T} & 1 \end{bmatrix}
\begin{bmatrix} C_{\theta_i} & -S_{\theta_i} & 0 & 0 \\ S_{\theta_i} & C_{\theta_i} & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} \\
&=\begin{bmatrix} C_{\theta_i} & -S_{\theta_i} & 0 & a_{i-1} \\ C_{\alpha_{i-1}}S_{\theta_i} & C_{\alpha_{i-1}}C_{\theta_i} & -S_{\alpha_{i-1}} & -S_{\alpha_{i-1}}d_i \\ S_{\alpha_{i-1}}S_{\theta_i} & S_{\alpha_{i-1}}C_{\theta_i} & C_{\alpha_{i-1}} & C_{\alpha_{i-1}}d_i \\ 0 & 0 & 0 & 1 \end{bmatrix}
\end{align}

同次変換行列を順にかけていくと、ベースから見たエンドエフェクタの位置姿勢がわかる。つまりこれで順運動学が解ける。

^{B}T_E=^{B}T_1 ^{1}T_2 ^{2}T_3 ^{3}T_E

数値計算

まず関節角ベクトルq, 手先位置ベクトルrを下記のように定義する。


\begin{align*}
q&=\begin{bmatrix} \theta _{1} \\ \theta _{2} \\ \theta _{3} \end{bmatrix}\\
r&=\begin{bmatrix}
x \\
y \\
z
\end{bmatrix}
\end{align*}

するとヤコビ行列はこんな感じ。


J\left( q\right) =
\begin{bmatrix}
\dfrac {\partial x}{\partial \theta _{1}} & \dfrac {\partial x}{\partial \theta _{2}} & \dfrac {\partial x}{\partial \theta _{3}} \\
\dfrac {\partial y}{\partial \theta _{1}} & \dfrac {\partial y}{\partial \theta _{2}} & \dfrac {\partial y}{\partial \theta _{3}} \\
\dfrac {\partial z}{\partial \theta _{1}} & \dfrac {\partial z}{\partial \theta _{2}} & \dfrac {\partial z}{\partial \theta _{3}}
\end{bmatrix}

初期値q_0を適当に設定して、下記式を繰り返し計算すると解ける。ちなみに f(q_i)が順運動学。


\begin{align*}
r_i&=f(q_i)\\
q_{i+1}&=q_i-J(q_i)^{-1}(r_i-r_{ref})
\end{align*}

f:id:kuwamai:20191005192553p:plain

計算してみるとこんな感じ。水色の棒がマニピュレータで、赤い丸が目標手先位置。計算を繰り返すごとに手先位置と赤い丸の位置が近づいていくのがわかる。

使用例

書いたコードをそのまんまROSパッケージに入れてアームを動かしてみた。PythonなのでC++と比べて遅いけど、とりあえず動くしわかりやすいのでいいかなと思ってる。

参考

マニピュレータの描画方法を参考にさせていただきました。