活動報告 No.153 公称ICS3.6未対応でもRCB-4HV経由で任意のサーボの現在角度を読み取ったり色々。。
カテゴリ: 未分類

明けましておめでとうございますぁあっす。さすがにヒュー研ブログをサボりすぎた2年のマエダです。
いや仕方ないんですよ…1月は期末期間で2月は大会ラッシュじゃないですか…。。

ま、新年の挨拶よりも言い訳が多くなりそうなのでさっさと本題に入ります。

近藤科学さんのサーボモータの通信規格に関して、ICS3.5以降はコマンドとPWMのどちらかで固定角度を決められますよね。そんなICS3.5ですが、ICS3.6は今まで主流だったICS3.5のコマンド群に加えて、任意のサーボの角度データを抽出できるコマンドが追加されました。
ICS3.5以下はどうやっていたのか明確な答えを見つけることができませんでしたが、サーボに目標値付コマンドを送った後の返り値を見たり、教示機能で読み取っていたんじゃないかと思います。

任意のサーボの角度データを抽出する技術ってのは、今まで皆さんが参加してきたであろうROBO-ONEとROBO-ONE lightから、最近新設されたROBO-ONE autoに機体を流用し易くなるものだと考えています。

あまりピンと来ないかと思いますが、ちょいと図解してみます。
まず、ROBO-ONEなど操縦者が人間の場合、機体とモーション、操作母体の関係は以下の通りです。

スライド1



そして、ROBO-ONE autoなど操縦権限がコンピュータの場合、機体とモーション、操作母体の関係は以下の通りです。


スライド2



 操作母体のやっていることは、「戦況によって限られたモーションデータのどれを再生するか判断している」です。条件分岐と言うことにすると、例えば、相手がちょいと遠ければ近づいて攻撃しよう、とか人間にも明示的ではないもののある程度の条件分岐を試合中にやっています。

ROBO-ONEからROBO-ONE autoに機体を流用しないとなったら、外界認識システムから基板、モーションの分岐、そもそもの機体に至るまでイチから機体を作り直すしかありません。しかし、もしもコンピュータからコントローラのコマンドを送れたらどうでしょうか。コンピュータは自律するコントローラと同等とみなせるので、ROBO-ONEの機体にCOM端子と電源だけ繋いで即ROBO-ONE auto仕様にすることにが出来てしまいます。

上記を理由に、コンピュータからRCB-4HVに適切なコントローラのボタンデータを送ったり、条件分岐するために任意のサーボの角度データを抽出したり指定したりできることは、auto用処理モジュールを製作するのに非常に有用なのです。



使用機器:

  • ラズパイ 3B
  • KRS-2542HV
  • RCB-4HV
  • Serial USB Adapter HS


です。USB経由でラズパイからRCB-4HVにコマンドを送信して、任意のサーボの角度データを持ってきてもらったり指定してあげたりします。



準備


ラズパイに近藤科学製のシリアルUSBを接続して、利用可能な状態にする必要があります。

近藤科学は以下の記事にてLinuxでシリアルUSBを利用する方法を紹介していますが、これではできません。注意です。

http://kondo-robot.com/faq/usb-adapter-for-linux


上記サイトは2010年に書かれたものです。今は以下の記事を参考にセットアップすれば一応使えます。

https://gpsnmeajp.blogspot.jp/2015/07/ftdi-ft232rlusbraspberry-pi.html


root権限じゃないと通らないです。スクリプト作って起動時に実行するようにすれば良いでしょう。



角度を指定する


コマンド方式で指定していきます。

コマンドのルールは以下の通りです。


[0x07, 0x0F, ICS番号, フレーム数, 角度データ(16進数で)下位, 角度データ(16進数で)上位, これ以前の総和]


1つめ:0x07

固定です。変える必要はありません。


2つめ:0x0F

ここも固定です。変える必要はありません。


3つめ:ICS番号

SIO端子が1〜4番ピンに刺さっていれば、「サーボID番号 × 2」がICS番号です。

SIO端子が5〜8番ピンに刺さっていれば、「サーボID番号 × 2 + 1」がICS番号です。


4つめ:フレーム数

まんまフレーム数です。1とか30とか60とか。。


5つめ・6つめ:角度データ(16進数で)下位・上位

近藤科学の定めるサーボの角度データは


35007500(ニュートラル)〜11500


です。これらを16進数で表すと、


0DAC1D4C(ニュートラル)〜2CEC


です。真ん中を例にとると、


角度データ(16進数で)下位 = 4C

角度データ(16進数で)上位 = 1D


です。言葉でいうと、近藤科学規格のサーボポジション数値の16進数版を前半と後半で2文字ずつ分けたとき、それぞれ上位と下位になります。


7つめ:これ以前の総和

1つめ〜6つめの数値を全て足し合わせたものです。


例:

例を示します。

・RCB-4HVの1〜4番ピンのどれかにサーボを接続してある

・サーボのIDは0番

・フレーム数は30

・サーボの目標位置は近藤規格で3500(-135度)

のとき、

[0x07, 0x0F, 0x00, 0x1E, 0xAC, 0x0D, 0xED]

というコマンドを送信すればサーボが3500の位置に動いてくれます。「0x」は16進数であることを示しています。ちなみに10進数で表すと、

[7, 15, 0, 30, 172, 13, 237]

です。

[0x07, 0x0F, ICS番号, フレーム数, 角度データ(16進数で)下位, 角度データ(16進数で)上位, これ以前の総和]

と比較してみてください。



ほんで、以下のプログラムをゴリゴリ書いていきます。Python3.5.3推奨です。ちなみにまだ未完成ですので、コピペは後でお願いします。


↓ 横スクロールできます ↓ ※ まだ未完成

import serial
from time import sleep


def set_pos(ser, sio_pin, servo_id, frames, deg):
# sioピンのチェック
if 1 <= sio_pin <= 4:
ics = servo_id * 2
elif 5 <= sio_pin <= 8:
ics = servo_id * 2 + 1
else:
return False

# 普通の角度か近藤規格の角度データかチェック
if -135 <= deg <= 135:
kondo_deg = 800.0 * deg / 27.0 + 7500.0
elif 3500 <= deg <= 11500:
kondo_deg = deg
else:
return False

deg_16 = hex(int(kondo_deg)) # 16進数に変換
deg_16 = deg_16[2:].zfill(4) # 0x以降を抽出して0パディング
deg_16_H, deg_16_L = int(deg_16[:2], 16), int(deg_16[2:], 16) # 上位と下位で分割
tail = 0x07 + 0x0F + ics + frames + deg_16_L + deg_16_H # 送信するコマンドの末尾に必要らしい(用途不明)
com_line = [0x07, 0x0F, ics, frames, deg_16_L, deg_16_H, tail] # 完成!!

ser.write(com_line)
sleep(2) # どう設定しようか。。

return True


def main():
ser = serial.Serial('/dev/ttyUSB0', 115200, parity=serial.PARITY_EVEN, timeout=1)
print('シリアルポートを開きました')

_ = set_pos(ser, 1, 0, 30, 0)

ser.close()
print('シリアルポート閉じました')


if __name__ == '__main__':
main()


set_pos関数にはPySerialでシリアル接続した際の返り値とsioピンの番号、サーボのID、フレーム、角度が引数として必要です。

上の例ではsioピン1番に接続されたID0のサーボをフレーム数30でニュートラルの位置まで動かしています。

-135 ~ 135の間で指定すれば自動的に単位が[度]として処理されますし、3500 ~ 11500の間であれば近藤規格のパラメータで処理されます。


set_pos関数の最後の方にあるsleepでは小数点使用可能で秒単位の待ち時間が指定できますが、どれくらい待てば良い

のやら。。例では適当にとりあえず2秒待っています。


動いてくれたら嬉しいっス。。


しかしバグ発生!!


先ほど送信コマンドのルールとして


[0x07, 0x0F, ICS番号, フレーム数, 角度データ(16進数で)下位, 角度データ(16進数で)上位, これ以前の総和]


と紹介しましたが、これの7要素目の「これ以前の総和」が256以上になると16進法で2バイトになってしまうので送信できませんでした。分割してもダメです。

RCB-4リファレンスを読み返してみると、


「チェックサム: 1byte⽬のサイズからチェックサムの1byte⼿前までのデタを加算した下位1byte」


と書いてありました。

というわけで、10進法で256以上の場合は下位1byteだけを抜き出してみます。


先ほどのset_pos関数を以下に書き換えます。


 
def set_pos(ser, sio_pin, servo_id, frames, deg):
""" 任意の1つのサーボをフレーム数と角度を指定して動かす """
# sioピンのチェック
if 1 <= sio_pin <= 4:
ics = servo_id * 2
elif 5 <= sio_pin <= 8:
ics = servo_id * 2 + 1
else:
return False

# 普通の角度か近藤規格の角度データかチェック
if -135 <= deg <= 135:
kondo_deg = 800.0 * deg / 27.0 + 7500.0
elif 3500 <= deg <= 11500:
kondo_deg = deg
else:
return False

deg_16 = hex(int(kondo_deg)) # 16進数に変換
deg_16 = deg_16[2:].zfill(4) # 0x以降を抽出して0パディング
deg_16_H, deg_16_L = int(deg_16[:2], 16), int(deg_16[2:], 16) # 上位と下位で分割
com_line = [0x07, 0x0F, ics, frames, deg_16_L, deg_16_H]

tail = 0x07 + 0x0F + ics + frames + deg_16_L + deg_16_H # 送信するコマンドの末尾に必要らしい(用途不明)
if tail >= 256:
# 10進数でいう256以上は16進数で2byteになるけど,下位を採用して切り抜ける
tail_16 = hex(tail)
com_line.append(int(tail_16[-2:], 16))
else:
com_line.append(tail)

ser.write(com_line)
_ = ser.readline()

return True




角度を読み取る


角度を読み取るときに使う特別なコマンドのルールはありません。


手順としては、まずHeartToHeart4のモーション作成パネルにて、「GetValue」を引っ張り出してきます。


キャプチャ



GetValueのブロックをダブルクリックしたら、以下の画面のように設定します。


キャプチャ2



現在値読み取りで返り値をCOMポートに出力します。ラズパイは4HVから返ってくる値を読み取れば良いだけです。


サーボの現在位置は人によって違うと思うので、ここは適宜対応お願いします。


設定したら、一番下にコマンドが出てくるので、メモしておきます。これが任意のサーボの角度を読み取るコマンドになります。


Python側のプログラムは関数だけ見せると以下になります。



↓ 横スクロールできます ↓

from time import sleep

def get_pos(ser, com_line, krs_deg=False):
""" コントローラに配置されたボタンを用いて任意のサーボの現在角度を読み取る """
for _ in range(100):
sleep(0.01)
ser.write(com_line)
data = ser.readline() # バイト列で受信
r_data = data.hex() # バイト列から16進数に変換
'''
r_data[0:2] = '05': 0x05はサーボの角度読み取り返り値を示す
r_data[2:4] = サーボモータのID番号 <- 使っていないけど一応
r_data[6:8] + r_data[4:6] = 角度データ(3500 ~ 7500:ニュートラル ~ 11500)
'''
if r_data[0:1] is '0' and r_data[1:2] is '5':
deg_16 = r_data[6:8] + r_data[4:6]
kondo_deg = int(deg_16, 16) # 16進数から10進数に変換
return kondo_deg if krs_deg is True else int(0.03375 * (kondo_deg - 7500))

return None



ざっとこんな感じです。0.01秒間隔で100回のループを行なっているのは、角度によって値が返ってくるまでの時間にばらつきがあるからです。



引用: http://kondo-robot.com/faq/ics3_6function

kondo.png 

上のグラフはICS3.6で角度を読み取るコマンドを発行したのち返ってくるまでの時間経過を表しています。

今回は4HV経由で指令を出していますが、上と同様なことが言えます。角度によって得たい数値が返ってくるまでにラグがほとんどなかったり0.5秒以上あったりです。なので、そこのばらつきを関数内にてfor文とsleepを使って吸収しています。


get_pos関数の引数にkrs_deg=Falseとありますが、これは返り値が近藤規格の角度データにするか否かを設定します。デフォルトのFalseであれば-135 ~ 135度の間で返ってきますし、Trueにすれば3500 ~ 11500の間で返ってきます。


get_pos関数は自律制御に使うカメラの角度に使おうとしているので、使用目的に合わなければ関数が宣言されている行の引数をkrs_deg=Trueとしてもらえればデフォルトで3500 ~ 11500の間で返ってきます。



今まで紹介してきた関数群の使用例は以下の通りです。


↓ 横スクロールできます ↓

import serial
from time import sleep


def set_pos(ser, sio_pin, servo_id, frames, deg):
""" 任意の1つのサーボをフレーム数と角度を指定して動かす """
# sioピンのチェック
if 1 <= sio_pin <= 4:
ics = servo_id * 2
elif 5 <= sio_pin <= 8:
ics = servo_id * 2 + 1
else:
return False

# 普通の角度か近藤規格の角度データかチェック
if -135 <= deg <= 135:
kondo_deg = 800.0 * deg / 27.0 + 7500.0
elif 3500 <= deg <= 11500:
kondo_deg = deg
else:
return False

deg_16 = hex(int(kondo_deg)) # 16進数に変換
deg_16 = deg_16[2:].zfill(4) # 0x以降を抽出して0パディング
deg_16_H, deg_16_L = int(deg_16[:2], 16), int(deg_16[2:], 16) # 上位と下位で分割
com_line = [0x07, 0x0F, ics, frames, deg_16_L, deg_16_H]

tail = 0x07 + 0x0F + ics + frames + deg_16_L + deg_16_H # 送信するコマンドの末尾に必要らしい(用途不明)
if tail >= 256:
# 10進数でいう256以上は16進数で2byteになるけど,下位を採用して切り抜ける
tail_16 = hex(tail)
com_line.append(int(tail_16[-2:], 16))
else:
com_line.append(tail)

ser.write(com_line)
_ = ser.readline()

return True


def get_pos(ser, com_line, krs_deg=False):
""" コントローラに配置されたボタンを用いて任意のサーボの現在角度を読み取る """
for _ in range(100):
sleep(0.01)
ser.write(com_line)
data = ser.readline() # バイト列で受信
r_data = data.hex() # バイト列から16進数に変換
'''
r_data[0:2] = '05': 0x05はサーボの角度読み取り返り値を示す
r_data[2:4] = サーボモータのID番号 <- 使っていないけど一応
r_data[6:8] + r_data[4:6] = 角度データ(3500 ~ 7500:ニュートラル ~ 11500)
'''
if r_data[0:1] is '0' and r_data[1:2] is '5':
deg_16 = r_data[6:8] + r_data[4:6]
kondo_deg = int(deg_16, 16) # 16進数から10進数に変換
return kondo_deg if krs_deg is True else int(0.03375 * (kondo_deg - 7500))

return None


def main():
ser = serial.Serial('/dev/ttyUSB0', 115200, parity=serial.PARITY_EVEN, timeout=1)
print('シリアルポートを開きました')

# 角度を読み取るコマンド(HTH4GetValueから要確認)
get_com_line = [0x0A, 0x00, 0x20, 0x00, 0x00, 0x00, 0x96, 0x00, 0x02, 0xC2]

_ = set_pos(ser, 1, 0, 30, 135) # 指定角度に固定
sleep(1)
d = get_pos(ser, get_com_line, krs_deg=False) # 現在角度検出

print('検出角度: ' + str(d))

ser.close()
print('シリアルポート閉じました')


if __name__ == '__main__':
main()



set_pos関数とget_pos関数の間にsleepを入れています。今は適当ですが、sleepをいい感じで入れないと、サーボが目標値に達する前に読み取りが呼び出されます。


一応set_pos関数内にser.readline()を入れてみたんですが、非ブロッキングなのかな?返り値が来るまで止められないっぽいです。


set_pos関数の仮引数にタイムアウトを置きつつ、返り値が来るまでwhile文で回して、返ってきたらブレイクするのがいいのかなぁ、と思ったり。。



おわり


てなわけで今回は公称ICS3.6未対応でもRCB-4HV経由で任意のサーボの現在角度を読み取ったり角度を指定したりをPythonで制御する記事でした。







スポンサーサイト
編集 / 2018.02.11 / コメント: 0 / トラックバック: 0 / PageTop↑
活動報告 No.150 完全畳み込みニューラルネットワーク(仮)をC言語で実装する際にやってしもたミスとその他 for ROBO-ONE auto
カテゴリ: 未分類

どうも、おはこんばんにちは。キャンパーレベル24の2年マエダです。
ポケ森と全然関係ないんですが、先日の東京ビッグサイトで開催された国際ロボット展に行きました。私は初日に参加しましたが平日というだけあって99%はビジネスマンだったので、学生に対してビラ配り的なやつは大抵無視でしたorz。
ま、しゃーない。

んでんで、私が更新するブログは1ヶ月ぶりですかね。ここ数週間はヒュー研内部で来年度に向けての云々やらタイトル通りのことをやっておりました。
完全畳み込みニューラルネットワークでよくやってしもたミスを上げて行くので、全結合層については何もありません。畳み込み層と最大プーリング層についてだけです。
あと、今回も機体は登場しません、ごめんなさい。次の日曜日にロボジェネレーションという大会があるので、来週か再来週はそれに関連してちゃんとロボットの画像載せます。
ロボジェネレーションのリンク:
http://denken.ws.hosei.ac.jp/robot_generation/




ちょっと前置き...

私はPythonを使ってきた身なので、ニューラルネットワークなんて大規模なCプログラムを書いてきたことはありません。2ヶ月ほど前に物体検出の勉強を論文や解説サイト等でやり始め、実際にCプログラムで構築し始めたのはほんの数週間前です。

Cを本格的に使い始めてちょっと経ちますが、Pythonより文法というか面倒なお約束事が多いのでサクサク記述できない所を不満に思います。しかし計算問題に関してはPythonより覚えること少なくて、「こんな記述初めて見た!」なところが少ないと思いました。Pythonはライブラリ関連が超強力ですが、それらがブラックボックスと化しているのでこう思うのも必然ですかね。





ミス1:mallocの初期値


mallocは配列に使用されるメモリの量をこちらで指定して確保する際に使います。たとえば、


#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int num = 10;
double *array = (double *)malloc(sizeof(double) * 10);

for (int i = 0; i < num; i++) {
printf("%f ", array[i]);
}

return 0;
}

てな感じでstdlib.hを宣言してからmallocを使うと上の例では要素数10の配列を確保できます。
私はトライ&エラーな人間なので、書き方だけどこかのサイトで見たらあとは自習していくスタイルなので、とりあえず実行してみました。結果は以下です。


no150-1.png 

!?!?


全部 0 でした。当時の私はこう思いました。

「あ、mallocって宣言したら全部 0 で初期化されるんだ、便利だなぁ〜」
...実際はそんなことありません。上のように解釈して数週間もこの違う事実に気づかなかったせいで地獄のコアダンプ不回避事件が起きました。


複数回コンパイル&実行を繰り返すとわかるのですが、


no150-2.png no150-3.png 

このように不特定な数が出ることもあります。ニューラルネットには数千万、ときには億単位もの要素が必要とされるので、、、


Layer *l;
l = (Layer *)malloc(sizeof(Layer) * LAYER_NUM);
for (i = 0; i < LAYER_NUM; i++) {
l[i].input_data = (double *)malloc(sizeof(double)
* CFG[i][0] * CFG[i][0] * CFG[i][1]);
l[i].filter = (double *)malloc(sizeof(double)
* CFG[i][2] * CFG[i][2] * CFG[i][1] * CFG[i][4]);
l[i].bias = (double *)malloc(sizeof(double)
* CFG[i][1] * CFG[i][4]);
l[i].output_data = (double *)malloc(sizeof(double)
* CFG[i][3] * CFG[i][3] * CFG[i][4]);
}

※ 横幅が入るように変なところで改行しています。


もうこれLAYER_NUMが156層だったりしたらえらいことですよ。まあ数層でもえらいことになりますが。。



というわけで...

mallocも通常配列同様に初期化しよう。





ミス2:プーリング層で逆伝播用配列の要素数を間違えた


ネットワークを構成する際、以下の様に層番号と層における処理の種類、入出力サイズ、フィルタサイズの情報を配列に格納し、それをもとに順伝播と逆伝播をfor文で回しています。

あと、出力テンソルのサイズがアレなのは物体検出アルゴリズムのYOLOを参考にしているからです。


// { 0 , 1 , 2 , 3 ,
// { number, type, input_size, input_channel,
// 4 , 5 , 6 }
// filter_size, output_size, output_channel }
// type : 0 = convolition, 1 = max_pooling
int LAYER_INFO[LAYER_NUM][7] = {
    { 0, 0, 416, 3, 3, 416, 32 },

    { 1, 1, 416, 32, 0, 208, 32 },

    { 2, 0, 208, 32, 3, 208, 64 },

    { 3, 1, 208, 64, 0, 104, 64 },

    { 4, 0, 104, 64, 3, 104, 128 },
    { 5, 0, 104, 128, 1, 104, 64 },
    { 6, 0, 104, 64, 3, 104, 128 },

    { 7, 1, 104, 128, 0, 52, 128 },

    { 8, 0, 52, 128, 3, 52, 256 },
    { 9, 0, 52, 256, 1, 52, 128 },
    { 10, 0, 52, 128, 3, 52, 256 },

    { 11, 1, 52, 256, 0, 26, 256 },

    { 12, 0, 26, 256, 3, 26, 512 },
    { 13, 0, 26, 512, 1, 26, 256 },
    { 14, 0, 26, 256, 3, 26, 512 },
    { 15, 0, 26, 512, 1, 26, 256 },
    { 16, 0, 26, 256, 3, 26, 512 },

    { 17, 1, 26, 512, 0, 13, 512 },

    { 18, 0, 13, 512, 3, 13, 1024 },
    { 19, 0, 13, 1024, 3, 13, 512 },
    { 20, 0, 13, 512, 3, 13, 1024 },
    { 21, 0, 13, 1024, 3, 13, 512 },
    { 22, 0, 13, 512, 3, 13, 1024 },
    { 23, 0, 13, 1024, 3, 13, 1024 },
    { 24, 0, 13, 1024, 3, 13, 1024 },
    { 25, 0, 13, 1024, 3, 13, (BBOX * 5 + CLASS) }
};


このとき逆伝播用の配列の要素数は LAYER_INFO[][5] * LAYER_INFO[][5] * LAYER_INFO[][6] で決定されます。畳み込み層は。。


私は畳み込み層しか見ていなかったのでプーリング層にも上の法則を適用してしまいました。そのため、上位層に伝播できる誤差が本来の4分の1となってしまい、うまく学習できませんでした。

というわけで...

プーリングを挟んだ畳み込み付近で間違いを犯しやすいので、怪しい挙動をみせたら誤差をちゃんと上位層に伝播できているのか、配列要素数のレベルから見直そう。




ミス(というかオススメ)3:ノート、大切


ライブラリや小規模プログラムしかしていなかった人間なので、その場で考えながらポチポチとコードを組んでいると多チャンネル対応の畳み込みでfor文回す際や順伝播・逆伝播の変数と関数の引数との関係が意味わからなくなります。

IMG_0245 (1) 

上は左側が下位層、右側が上位層で逆伝播をしています。薄く囲ってある範囲が各層のパラメータの塊です。下位層からの誤差データと上位層からの順伝播データを用いてフィルタの勾配を求め、誤差データと転置フィルタを用いて上位層へ伝播する誤差データを生成します。


実際の問題は上の画像のように単純ではなくて、畳み込み・活性化関数・バッチ正規化・バイアス加算を経ているので、逆伝播用の関数内はえらい関数の羅列になり、各関数の引数を考えると、とても頭の中だけでどうこう出来るお話にはなりません(たぶん)。






なんか題名の割に内容薄くてスミマセン。。あと1つか2つくらい書こうかなと思いましたが、早く家に帰りたいのでこれまでにします。
冒頭でも触れた通り、明日はロボジェネがあるので来週か再来週にはその記事を書こうと思います。


昨年まではヒュー研の部内戦的な何かでしたが、今年は元部長がニソコンで声掛けした結果なのか千葉工さんから4台ほど出場すると聞きました。盛んになるといいっすなぁ。


ロボジェネ終わった後ですが、最近CUDAプログラミングに手を出したので、今後もその点などコアなお話が続くと思います。
なんかこう、技術的なお話よりも雑談の方が得意なので、ヒュー研ブログではその雑談が多くなっちゃうと思います。技術的なお話しは私の個人ブログの方で勘弁してください。「シミズさんのたわごと」でググれば多分出てきます。ヤホーはわかりません。

ほんじゃまったのー(=゚ω゚)ノ



編集 / 2017.12.16 / コメント: 0 / トラックバック: 0 / PageTop↑
活動報告 No.149 Fusion360×Eagle×Elecrowが最高だった話。
カテゴリ: 未分類
こんにちは。Autodesk信者の3年高橋です。今回の更新で自分はブログ担当を引退し今後は完全に後輩の前田君が担当となります。なので最後に3年間の振り返り的な所感を書こうかと思います。

まずは先に表題の通りFusion360×Eagle×Elecrowについてまとめます。
「てめー、それロボ研の活動じゃ...」というツッコミもありそうですが個人的には二足歩行ロボット用マイコンボード[1](以下ボードを省略)より自作マイコンないし汎用マイコンを使った方が制御という側面ではいいのかなと思っています。

 制御とは「対象物の動作を目標とする動作になるように操作を加えること

この定義に基づけば「二足歩行ロボットをこけずに歩かせる」ということが制御に内包されていることがわかるかと思います。ただここで重要であるのは制御するのは対象物ではなく対象物の動作であることです。広義でいえば時間的な応答、すなわちダイナミクスです[2]これを扱うには微分積分などが必要になってきます。こうなってくると二足歩行ロボット用マイコンのGUIでは限界があるんじゃない?って話です[3]。

以上がマイコンごと作っちまおうぜって話の前振りです。

はい。具体的な方法に入ります。
Fusion360はご存知の通りAutodesk社の3DCADです。Eagleも2016年の買収を経てAutodesk社の回路CADとなりました。こういった経緯からFusion360とEagleの連携が可能となっています。

Fusion360の使い方はFusion360の使い方(リンクあり)が良いかと思います。手っ取り早く形を作りたい人は自分が作ったチュートリアルやってください。今一番キテるCADです。乗るしかないでしょこのビックウェーブに。


 Eagleの使い方は基礎からのプリント基板製作(リンクあり)を使いました。Eagleの本は他にもありますがこれが一番新しいです。前述のとおりAutodesk社から買収された以降アップデートを繰り返しているのでできるだけ新しい情報を参照すべきです。

Fusio360とEagleの連携は公式の動画見るのが良いかと思います。3Dデータから基板の外形をそのまま送り込めます。またその逆の基板から3Dデータを送り込むことも可能です。今のところは連携機能はまだBETA版であまり知られていません。


ElecrowへのEagleからの発注のしかたはHow to export gerber files from Eagle file(リンクあり)を参照しました。日本語じゃないとわからんわという方のためにも親切にHow to export gerber files from Eagle in Japanese(リンクあり)が用意されています。Eagleの顧客が日本に多いことが伺えますね[4]。注文からは1週間程度で届きました。中国はもはや国外ではなく国内です。「宛名は~で品名は~」の領収書くれとコメントをつけても領収書をくれないので発注の際はNote欄に自分で宛名と品名を書いてしまう方がよいかと。そのままそれを含めた紙っぺら1枚が領収書として同封されてきます。

実際に完成したもの
S_7047490732067.jpg 左上 基板図、右上 組図、下 回路図。機械系設計はFusion360で回路系設計はEagleで済む。これはAutodesk信者になりますよ。ちなみにプログラミング開発環境はVisualStudio。

手順としては3Dデータと回路図を同時並行に設計。んでそれらを完成させたうえで連携させ基板を設計しました。チームでやるなら3Dデータと回路図は分業してもいいかと。でも一人ですべてやった方が楽しいよ? 以上でFusion360×Eagle×Elecrowについては終わります。

3年間を振り返って
ヒュー研&ロボ研に入ったことは自分の興味関心を大きく変えたと思う。大学入学したては機械に興味があり、1年を通してそれがメカトロニクスに変わり、2年を通して電子制御に変わり、3年を通して制御工学に変わった。こういった興味関心の変化は座学ではなく実際にモノを扱うことにより得たことだと思う。今後はその興味関心を卒研等にぶつけられればと思っている。
 こういった興味関心の追及こそが学生の特権であり、そのための環境は社会的に保障されている。企業でいえば前述のFusion360やEagle、VsialStudioは学生なら無償で使え、国でいえば自分が大学2年で地球の裏側まで行けたことがあげられるだろう。残念ながら多くの人はこのことに気が付かない。また電大生はアニメ/ゲームで忙しかったり、稀ではあるが不幸にも彼女が出来てしまいロボットへの愛を失ってしまうケースもある[5]。「学生は興味関心を追求できる特権的階級にある」後輩にはこのことを意識して行動してほしいと思う。

では今後はブログの更新楽しみにしてます。
またどこかの大会で。

補足
[1]近藤マイコンよりはVstoneマイコンの方がモーション付けやすいし、センサーも豊富で応用がききやすい。ただし近藤サーボを使うと通信規格の問題で脱力できない。これを解決するためには大阪電気通信大学の関様が資料を作ってくれているので「近藤 Vstone 脱力」でggr。関様ありがとうございます。
[2]ダイナミクスとは機械では動力学、電気では動特性にあたる。制御の対象はダイナミクスなので経済なんかも含まれたりする。経営工学はたぶんそれ。
[3]数理的モデリングが出来たとしても現状のヒュー研の手加工モヤシ剛性機体ではおそらく制御不可能。そのためにもCNCを買うか買ってもらうべき。もっとも数理的モデリングとか云々の水準に達するまでには自主的な学習が必要。感覚でものを作るなら職人や芸術家と変わらない。
[4]設計は米国のAutodesk、生産は中国のElecrowと日本産業衰退をこの手で再現している。よくこの手の話をすると「日本は技術力があるのに価格競争で負けた」と言われるが、本質は「デジタル化によるモジュール型産業への移行とそれに伴う設計と製造の分離へ対応ができなかった」というビジネスモデルで負けたのが正しい。この点は米国のIntelやQualcomm、台湾のTSMCで説明がつく。
[5]苦しんで作るマイクロマウスより引用。作者からしたら「そこかよ!」と思うに違いない笑
編集 / 2017.11.26 / コメント: 0 / トラックバック: 0 / PageTop↑
活動報告 No.148 "新部長の就任"と鳩祭終わったお話
カテゴリ: 未分類


どうも、おはこんばんにちは、鳩山祭でいろんなOBの方とお話しできてよかったなと思えた広報担当2年のマエダです。


私的なことなのですが、最近Adobeソフトを最新の2018年モデルにしようとCreativeCloudを開いたら、いつの間にか"XD beta"が"XD CC"になっていました。しかもMacだけではなく、Windowsにも対応されているっぽい(?)です。私にはチームで大型なWEB制作をすることは無いと思うのでこのソフトを使う機会はなさそうですが、β時代にMacで遊んでいたのを思い出しました。あと、今まで使っていたLightroomがclassic(=古いタイプ)として扱われていました。最近メジャーアップデート無いなと思っていたらこれですか。。


んでんで、私のぼやきはこれくらいにしておいて、ちょっと重要なヒュー研の内部と近況をお伝えしていきます。






まず、第41回鳩山祭無事終わりました



s_H29-hato-01.jpg




お客さんの入りはとても良かったです。具体的にカウントしていないですが、7割くらいのイベントでは25席近くある会場が満席で、立ち見の人もチラホラです。3日間で計9回やったので、イベント外のお客さん対応も含め、数百人の方にお越し頂けたのでは無いでしょうか。


s_H29-hato-02.png




イベントではロボット同士のバトル体験でしたが、それ以外ではペットボトル相手の操縦や、ミニゲームをやっておりました。このミニゲームなのですが、去年の1年生小型2班が、去年の鳩山祭でやろうと思っていたロボットで「釣り」をする、という企画が元になっています。


s_H29-hato-03.png


去年の釣り企画は残念ながら実現されませんでしたが、1年を経てリベンジした企画は、今年大成功を収めたと言えるでしょう。二足歩行ロボットで釣りをするということで、それに興味を持って足を止めてくれた人が多かったです。


釣りミニゲームは後世に残した方がいいんじゃないかなぁ。。今年だけで終わってしまうのはもったいない!



ヒュー研Twitterや当ブログでチラホラと


「アカン…1年生の機体ができん…」


と嘆いていましたが、、まぁ、あまり良い結果で終われませんでした…。


今年の1年生は2班に分かれてそれぞれ1機体ずつ製作しようとしました。が、1つの班は鳩山祭最終日にかろうじて1回だけバトルイベントに出れたものの、もう1つの班は未だに作り終わっていません…。


鳩山祭に来てくれたOBの先輩方には今年の1年生機体がお見せできなくて例年以上のスケジュール管理の甘さが出てしまいました。来年はいち早くヒュー研の技術進歩に向けて行動を移せるよう1年次の機体製作はROBO-ONEを目指すって形にしたほうがいいのかな。。


s_IMG_0103.jpg

個人的な見解ですけど、今年の1年生は部と部以外の両立性および機体製作に対する責任感が大きく欠如していると思われるので、大学生としてもっと合理的に行動してもらいたいものです。直接言わなきゃならんかなぁ…とこちらがアタマを抱える最近です。。

まぁ、何はともあれ、今年も発火等の事故なく鳩山祭を終えられて良かったです!
お客さんに怪我をさせてしまったら来年以降開催できないと思いますし、安全第1ですっ!




鳩山祭の終了と合わせて、「新部長」が就任したことをここにご報告させていただきます。

3年ODA先輩から2年CHIBAさんへと引き継がれました。新部長のCHIBAさんからひとこと頂いて、この記事の〆とさせていただきます。


新部長 CHIBA さんから ひとこと:
みなさんこんにちは。
今期の部長に就任した千葉です。
私は私なりに頑張っていこうと思うのでよろしくお願いします。
前期は一年生が少数だったこともあり、鳩祭に出す機体が少なくなってしまったので、今期の新部員は沢山集めますよ!





編集 / 2017.11.11 / コメント: 0 / トラックバック: 0 / PageTop↑
活動報告 No.147 【お知らせ】来週、鳩山祭でヒュー研もイベントやります!
カテゴリ: 未分類

どうも、おはこんばんにちは、ようやくYOLO v2の損失関数とハイパーパラメータの設定度合いがつかめてきた2年のマエダです。
先週は衆議院選挙のために台風が近づいてくる中、実家に帰ると共に、FPGAの入門書を買ったので、アルゴリズムをハードウェア言語に落とし込めるよう勉強します。高位合成は後回しで良いかなぁ。
そういえば、選挙は不在者投票が出来るので、実家に帰れない高坂組も皆んな、それを使って投票したことでしょう(?)

さてさて、来週、11月3日(金)から、東京電機大学 理工学部 にて、第41回 鳩山祭 が開催されますっ!


ヒューヒュー ドンドン パフッパフッ


期間は11月3日から5日までの3日間となります。


公式サイトのリンク
http://hatosai.sunnyday.jp/39th/index.html


リンクに「39th」のディレクトリ名が入っていますが、今回は41thなので、更新者が前のサイトを使いまわしているのでしょう(笑)。
日本でも50%を超えたというhttps化もできていませんなぁ。ヒュー研のウェブサイトはFC2が対応してくれない限り暗号化できないけどね!

ま、ウェブに関するツッコミは見ていてつまらんと思うので、鳩山祭でのヒュー研のイベントと、現在の進捗を書いていこうと思います。


s_鳩祭ポスター改 (1) 


やることは「バトルイベント」の1種類です。


ルールはゆるゆるで、


3分3ダウン制・有効な攻撃で倒した時のみダウン判定・絡みやコケはスリップ判定・テクニカルノックアウト有り・1回のみタイム取得可能


これだけです。


機体は(当たり前ですが)ヒュー研が出すので、とりあえず鳩山祭にさえ来てもらえれば、ヒュー研機体を体験操縦できます。


他にやる事と言えば、紙媒体で何かしらの技術的な掲示物出して、興味を持ってくれた人に説明するくらいですかね。昨年はそれに関しては、ブラジル行って自律歩行レースやってきたよって感じの模造紙を張っていました(合ってるかな…)。

去年は早稲田大学さんの理工展に行った関係もあり、機体数が一時的に減りましたが、最近の会議の動向だと、今年はどこにも大会は行かないで、鳩山祭に専念する方針です。鳩山祭中には理工展や法政さんのロボジェネ、大阪電気通信大学さんのOECU杯など色々固まってるんですよね。機体数が増えて、余力ができたら来年こそ行けたらなぁと。


ちなみに鳩山祭時点で動けるであろう機体は、1年生から2機体、2年生から3機体、3年生から3機体の計8機体ですね。8機体ってそこそこ多いようだけど、バッテリやサーボ休憩を考慮して1日中お客さんへの対応をこなすのは結構厳しい。


2年生の3機体のうち1機体は現在製作中ですが、そろそろ出来上がりそうなので大丈夫でしょう。


1年生の2機体は、4人が製作に関わっていて先日1人が加工に入り始めました。


間に合う…のか…?


まぁ、3日くらい寝なくても大丈夫だよねっ!


以上、今年の鳩山祭と機体の進捗でした...


s_鳩祭ポスタ2017byShim (1) 



編集 / 2017.10.27 / コメント: 0 / トラックバック: 0 / PageTop↑
プロフィール

ヒュー研の中の人

Author:ヒュー研の人
このブログは東京電機大学理工学部ヒューマノイド研究部の公式ブログです。2012年から部に昇格しました!
その日の活動や大会の記録をできるだけ更新していきたいです!!

☆だいたい金曜日前後に更新します☆

FC2カウンター
カレンダー
01 | 2018/02 | 03
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 - - -
リンク
ブロとも申請フォーム
携帯でみるには↓
QR