絶縁ICを使ってみた

皆さんこんばんは.アクア研17の煎餅の人です.

こちらはrogy Advent Calender 2020 2日目 まだ寝てないからセーフ! の記事です.昨日の記事でかなり雑に紹介されましたが,ご期待に添えるかな…?

現在アクア研で動いているプロジェクトの片方で,個人的に初めて電源系を絶縁するという試みをしたので,その簡単な報告をします.

作成中の回路.水中ロボットなので防水ケースの中に回路を納める必要があります

書いている人は回路の勉強をしっかりした訳ではないので,内容に誤り等あれば指摘して頂けると嬉しいです.

絶縁ってなにしたの?

作成したパワーモジュール.見た目は完全にただの塩ビパイプだが,中にはモータとバッテリ,マイコンに無線通信機まで入っていて,独立したモータモジュールを構成している.

“絶縁ICを使ってみた” の続きを読む

rogy Advent Calendar 2020 始まりの儀

この記事はrogy Advent Calender 2020 1日目の記事です.

こんにちは.部長のHitomosiです.

rogy Advent Calender 2020が始まります!!!!!!!

毎年恒例のADCでございます.

最近似たようなイベントをやったような気がしますが,そこは気にしない方向で行きましょう.

新入生への勧誘的な話はここ(リンクです)でしたので,リンクでも踏んでください.

そういえば,ADCといえば集まらないもん(だと思ってる)んですが,今年はどうかな?

大いなる可能性を秘めていますね.

明日は先代部長の記事なので,多分すごいと思います.以上です.

水冷ファンの補強をしようと思ったのですが…

この記事はロ技研秋のブログリレー9回目の記事です。

皆さんこんにちは、最近PCの自作・改造ばかりしている17-yotaです。今週の自作PC界隈はRTX3070発売やRDNA2(RX6000番台)発表、そしてZen3のベンチマークの噂などで熱いですね。ですが今回はCPUやGPUなどのPCパーツではなく、とある補強パーツを作成した話をしようと思います。

ここまでの大まかな経緯

私が3か月前に組み立てたPC ですが、こちらの記事でも触れた通り7月中旬に一応ほぼ完成したものの、1つだけ3Dプリンタで作成したい補強パーツが残っており、10月になってようやく着手することにしました。

そのパーツですが、実はPCケースが140mmファンに対応していないのにも関わらず、冷却システムに280mm簡易水冷を採用しました。当然ファンとマザボが物理干渉したので、図のように手前にずらして適当に固定した結果、ファンの取り付けが不安(は?)だったので作ることにしました。

ただ補強するといっても既に接する面でネジ止めしたので外側から固定する必要があります。結果的に図のようにケース(左上のコの字型で固定)とファン(右下の爪で固定)を挟むクランプのようなパーツになりました。できればコの字と爪を別に作成し、ネジで圧着したかったのですが…

部品設計

他の工作機械は扱える自信が全くなかったので3Dプリンタを選びましたが、こちらも使用経験が少なく確実に1回は失敗するだろうと思い、まずはプロトタイプを印刷することにして、PCに嵌まることを優先しサイズ的には少し緩めに作成しました。

1回目

出来上がったものを見てなんか小さい気がしたので取り付けようとしたら…縮尺間違えてました。察してください。

(上 : 2回目, 下 : 1回目)

2回目

縮尺に関してはstl変換前と後で辺の長さを比較した結果、10倍に拡大するのが正解だったようです(cmがmmに変換されたのかも?)。他にも、

  • 上面メッシュフィルタとラジエータの間隔を測ったらとても狭かったのでパーツの該当部分を薄く
  • フィレット(辺を直角ではなく丸くする処理)加工を追加
  • 爪の設計をより細かく

などの修正をしました。

1回目は入力こそ違ったものの印刷自体は正常だったので、ひとまずプロトタイプとして完成するかと思ってました。しかし、印刷が終わったので部室に行ったら…何これ??

3回目

どうやら幅2mmだと積層できないっぽいので3mmに戻しました。爪側は思ったように印刷できたのでPCに取り付けて細かい調整をしました。

結果的に1回目の細部変更バージョンになったので積層では失敗しないと思いながら印刷していたのですが…プリンタの隣で祈りながら記事を書いてたら突然バリバリ!と音を立てたので、何かと思って中をみたら前回失敗した面と同じ箇所が割れていました。1回目は上手く印刷できた箇所なのに、無念。

 

まとめ

結局3連続で失敗したため目標の10月中には完成できませんでしたが、今後は薄く積層できるようにサポート材をつけたり肉抜きをしたりしつつ、上手くいったら上下別で作成しネジで圧着する仕組みに変えようと思います。

まあ、たまには失敗した話をするのも現実的でいいですよね(逃避)

 

画像処理&機械学習で水の世界を鮮やかに!~Sea-thru法~

皆様こんにちは.18のhiraと申します.普段は水中ロボットを作るアクア研で活動し,情報通信系の平均点を底から支えています(引きずり下ろしているともいう).

さて,海で泳いだことがある人も多いかと思いますが,水の中はどうも見えにくいですよね.特に「青緑がかっていて暗い」と感じるのではないでしょうか.そして肉眼だけでなく,カメラで撮った写真も同様に色味の無く暗い写真になってしまいます.

この画像の様に水中においては,それも遠ければ遠いほど急速に青緑がかり暗く写ってしまいます.せっかく極彩色で美しいサンゴ礁を撮っても,見直したくなる画像とはならないでしょう.

せっかくダイビングをしたというのに真っ暗な写真ばっかりでは面白くありません.理系が恥も外聞も耐え忍びキラキラした海に繰り出すというのなら,桃色のサンゴ,真っ黄色の魚,紫の貝殻などなど,ただ海を楽しみに来た至極真っ当な方々の目では見ることのできない総天然色の「本物の色」を見てみたいですよね?

“画像処理&機械学習で水の世界を鮮やかに!~Sea-thru法~” の続きを読む

ニコ生の予定をGoogleカレンダーと同期するやつ

この記事はロ技研秋のブログリレー6回目の記事です

こんにちは、16のマッキーです。
みなさんはアイドルマスターシャイニーカラーズをやっていますでしょうか?やっていない方は今すぐ始めよう!→ https://shinycolors.idolmaster.jp/

現在そのアイドルマスターシャイニーカラーズの声優さんが個人で出演されているニコ生の番組が無限に増えています。今年に入ってから新しいニコニコチャンネルが10個以上できて、元からあったチャンネル内の番組としても10個ほど番組が新しくできています。
つまり何がいいたいのかというと
_人人人人人人人人人_
> 時間が足りない <
 ̄Y^Y^Y^Y^Y^Y^Y ̄
そして番組のスケジュールが把握しきれないという問題があります。
(番組にもいろいろあって毎週完全に時間が決まっている番組もあれば、月一回で時間は不定の番組も数多くあるのです)

そこでニコニコ生放送の予定をGoogleカレンダーと同期するやつを作りました。

Googleカレンダーがこんな感じになります。明らかに番組被りすぎてるところがあるんだよなぁ…

やることは簡単
1.Googleカレンダーから現在登録されている番組を取得
2.チェックするチャンネルのこれからの番組をニコニコのAPIから取得
3.未登録の番組をGoogleカレンダーに追加

この3つです。今回はこれをPythonでやってみました(Pythonを選んだ理由は自分が慣れていただけなので深い理由は特にないです)

今回解説するのは・PythonからGoogleカレンダーにアクセスする部分とニコ生APIから番組の取得する部分です。

Googleカレンダー

最初にGoogleカレンダーについてですが、GoogleカレンダーのAPIのページにいろいろ書いてあります。 https://developers.google.com/calendar/quickstart/python
またこちらのページを参考にしました。
https://non-dimension.com/python-googlecalendarapi/

1.Google Calender APIの有効化Google Calender APIよりEnable the Google Calendar APIボタンから
credentials.json
をダウンロード

2.以下のコマンドよりクライアントライブラリのインストールする
pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

3.以下のコードを実行するとGoogleカレンダーの権限を要求されるので許可するとtoken.pickleというファイルが生成されます。
このファイルがあると次回から何も聞かれずカレンダーにアクセスできます。
操作したいGoogleカレンダーの操作したいカレンダーの”設定と共有”からカレンダーIDをコピーしてきてgoogle_calendarIdに代入して操作するカレンダーを指定します。
以下Googleカレンダーの読み書きをする例です。

import os
import pickle
import os.path

from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request

from datetime import datetime, timezone, timedelta

TIMEZONE = '+09:00'

google_calendarID='ここにカレンダーID'
SCOPES = ['https://www.googleapis.com/auth/calendar']

## Add calender
creds = None
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
print(creds)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
print(token)
service = build('calendar', 'v3', credentials=creds)
event = {
'summary': 'title',
'location': 'location',
'description': 'description',
'start': {
'dateTime': '2020-10-27T20:00:00+09:00',
'timeZone': 'Japan'
},
'end': {
'dateTime': '2020-10-27T21:00:00+09:00',
'timeZone': 'Japan'
}
}

print(event)
event = service.events().insert(calendarId=google_calendarID,body=event).execute()

## Read calender
creds = None
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token/token.pickle', 'wb') as token:
pickle.dump(creds, token)

service = build('calendar', 'v3', credentials=creds)

timefrom=datetime.now().isoformat()+TIMEZONE
timeto= (datetime.now() + timedelta(days=60))
timeto=timeto.isoformat()+TIMEZONE

events_result = service.events().list(calendarId=google_calendarID,
timeMin=timefrom,
timeMax=timeto,
singleEvents=True,
orderBy='startTime').execute()
events = events_result.get('items', [])

print(events)

ニコ生API

次にニコニコのAPIについてです。例えば

https://api.search.nicovideo.jp/api/v2/live/contents/search?q=%E4%B8%80%E8%88%AC%28%E3%81%9D%E3%81%AE%E4%BB%96%29&targets=tags&fields=contentId,channelId,title,startTime,liveEndTime,description&filters[channelId][0]=2644423&filters[liveStatus][0]=reserved&_sort=-startTime&_context=nico%20live%20to%20google%20calendar&_limit=60

のようにAPIエンドポイントhttps://api.search.nicovideo.jp/api/v2/live/contents/search
の後ろにクエリパラメータをいろいろ付けてあげるとデータが返ってきます。これをブラウザなどのURLを入れるところに入れれば検索結果が返ってきます。

pythonでの例は以下の通り

import requests
import urllib.parse

nicolive_API_endpoint='https://api.search.nicovideo.jp/api/v2/live/contents/search'
q_='一般(その他)' #タグ
q=urllib.parse.quote(q_)
targets='tags' #タグ検索

fields='contentId,channelId,title,startTime,liveEndTime,description'
filters_channelId='&filters[channelId][0]='+str('2644423') #チャンネルのID
filters_liveStatus='&filters[liveStatus][0]=reserved' #enum('past','onair','reserved')

_sort='-startTime'
_context='nico live to google calendar'
_limit=str(60)

url=nicolive_API_endpoint+'?q='+q+'&targets='+targets+'&fields='+fields+filters_channelId+filters_liveStatus+'&_sort='+_sort+'&_context='+_context+'&_limit='+_limit 
res = requests.get(url).json()
print(res)

ニコニコのAPIの説明はこちら
https://site.nicovideo.jp/search-api-docs/search.html

基本的にはこれでいろいろ取得できるはずです。

最終的にできたもの

以上の2つを使っていろいろ見やすくしたり、LINE LIVEに対応したりして実際に使ってるのはこちら↓

https://github.com/mmaakkyyii/NicoLive2GoogleCalendar

私はこれを毎日自動で実行するようにしているので最新のニコ生の情報が同期するようになって最高になりました(番組を見る時間は足りない)

なるだけ安く光学式エンコーダーを自作する

ロ技研秋のブログリレー2020の4回目の記事です。

こんにちは.皆さん,回転数計測してますか?

ロボットの関節がどれくらい曲がったかや,タイヤが何メートル進んだかを知るには,それを駆動するモーターがどれくらい回転したのかを知る必要があります.

一般的にこの測定にはエンコーダーと呼ばれる機器を使用することをご存じの方も多いでしょう.

一口にエンコーダーといっても色々な種類が存在しますが,これらは主に「磁気エンコーダー」「光学式エンコーダー」「容量性エンコーダー」に分類できます.

容量性エンコーダー・ディスク、光学エンコーダー・ディスク、磁気エンコーダー・ディスクの比較 (CUI Devices:容量性エンコーダー、磁気エンコーダー、光学エンコーダー – 技術比較 より)

今回は構造も簡単でモーターが発生させる磁気の影響もうけにくい「光学式エンコーダー」を自作していきます. “なるだけ安く光学式エンコーダーを自作する” の続きを読む

楽しいjulia

ロ技研秋のブログリレー2020の2回目の記事です。

みなさんこんにちは。ふらいです。

why we created julia を読むと多くの人がjuliaを使ってみたくなると思います。

僕たちが欲しい言語はこんな感じだ。まず、ゆるいライセンスをもったオープン ソース言語。 そこに、Cの速さとRubyの動的さが欲しい。 Lispのような同図像性があって真のマクロを使えるけど、Matlabのように分かりやすくて自然な数学的記述もできる言語だ。 そのうえ、Python並みに汎用プログラミングに使えて、R並みに簡単に統計分析ができて、Perl並みに文字列処理を自然にできて、Matlab並みに線形代数計算に強くて、シェル並みにうまくプログラムをつなぎ合わせることができる。 さらに、すっごい簡単に覚えられるけど、凄腕ハッカーも満足させられるものだ。 インタラクティブに使えて、かつコンパイルもできる。

 

どんな人にでも使ってみて欲しいですが特に

  • 宗教上の理由でpythonが使えない人
  • ライセンスの問題でmatlabが使えない人
にはおすすめです。

 

juliaはパッケージ管理機能があって、標準ライブラリで行列演算ができて、Cの関数を呼び出せて、pythonも呼び出せて、ROSのパッケージもあって、webフレームワークもあって、…と紹介しているときりがないので、今回は特にjuliaではこんな書き方ができて楽しいよというのをいくつか紹介しようと思います。

“楽しいjulia” の続きを読む

[2020新歓]ロボット制御シミュレーション体験してみた!!part2

皆さんこんにちは、19のみたらし団子です(例によって今考えた仮の名前なのでハンドルネーム大募集中です)。
今日もテーマは「ロボット制御シミュレーションしてみた!!」となっております。

前回の続きなので読んでない方は下にスクロールして読んでみてください。
またurlを貼っておきますのでぜひ皆さんも参加してみてください
https://www.rogiken.org/shinkan/2020/introduce.html

さて、前回は光センサを使ってロボットにライントレースをさせるところまでをやりました。そこで、今回は様々なフィールドを使ってライントレース課題に挑戦していきたいと思います。

では早速やっていきましょう!!

課題1:

ラインセンサ1つを用いて,フィニッシュゾーンに到達せよ

  • 難易度☆☆
  • フィールド番号:02
  • 初期状態:init_state = [200; 600±20; 0];
  • センサ制限:ラインセンサ1つ
  • 目標時間:-

フィールド変更

↑フィールド02はこんな感じ。黒いのがラインで、茶色いのは壁です。例によって右側の丸がゴールです。

しかし、センサーひとつとはなかなかむつかしいような気がします。

前回やったように、センサの値の大小で左右の速度を変えるのがよいでしょう。というかそれくらいしか知りません。

そういう方針でとりあえず書いてみました。

 

コントローラープログラムの方は、センサの値が基準の値より大きいか小さいかで左右の速度を変えるようにしています(前回の記事でやりましたね)。

また、センサの位置ですが、機体の中心からは少しずらしています、フィールド図を見てもらうと分かりますが、結構壁との距離が狭いので機体の中心がラインの真ん中を通るくらいじゃないとぶつかっちゃうと思います。まあ見てなって。

それではやってみましょう。

いけました。完璧ですね。文句なしだと思います。カクカクしてる?

あんまり細かいこと気にしてると禿げますよ….

課題はクリアしましたが、カクカクしてるのが気になりますね。

ということで、これまた前回やったp制御を試してみましょう。センサーひとつはバカなので(?)、センサーを5個に増設しました。

↑センサーが

いっぱいあって

嬉しいね。

プログラムは以下のようにしてみました。

少し説明します。今回やりたいのは線からのズレの程度によって速度も変えるということです。そういう訳で、センサーの値にセンサーの配置による補正をかけたものの和をズレとして使うことにしました。このズレを前回やったように速度に反映させているのですが、このままだとフィールド図を見てもらうと分かる通り、直線から円に移るところで、うまく曲れません。そこで、すべてのセンサーが黒線を感知したら大きく曲るようにしています。

上手くいくかは分かりませんが、まあやってみましょう。やってみないと分からないって大科学実験も言ってた。

行けましたね、行けました。それ以外に感想はないですが、いいんじゃないですか?ほかにも課題はいくつかありますが、この辺にしておきましょう。

授業が延期になって暇な新入生の皆さん、ぜひこのロボット制御体験に参加してみましょう、周りの人はみんなやっています、知らんけど。

乗るっきゃない、このBigWave!!!

ノマドワーカーのイラスト

ということで、今回はこのへんでお別れしたいと思います。

下にリンクを貼っておきます

https://www.rogiken.org/shinkan/2020/introduce.html

 

[2020新歓]ロボット制御シミュレーション体験してみた!!

皆さんこんにちは、19のみたらし団子です(今考えた仮の名前なのでハンドルネーム大募集中です)。

さて、20の皆さんご入学おめでとうございます。
とは言っても入学式が中止になったようなのでまだ実感はないと思います。なんか大変やね…(笑)
ところで、今日のテーマは「ロボット制御シミュレーションしてみた!!」となっております。
ロ技研では毎年様々な新歓イベントを行っていますが今年はコロナが…なので、オンラインで皆さんにロ技研の魅力を知っていただこう!ということでこういうことを試みています。
そこで、ほぼ新入生と言っても過言ではない私も新入生と一緒に参加してみた!というわけです。urlを貼っておきますのでぜひ皆さんも参加してみてください
https://www.rogiken.org/shinkan/2020/introduce.html

ではやっていきましょう!
優秀な先輩部員が作った懇切懇切丁寧なwikiがあるのでこれに従って進めていくことにします。
トップページからzipファイルをダウンロードしてきました,私のpcには既にmatlabが入っているので早速動かしていきます
どうやらコントロール用、ロボット機体用のマトラボプログラムを弄ってシミュレーションをするようですね..まずは速度をいじってみます!
二つの数字が左右の車輪のモーターに与える電圧に対応しているみたいです、とりあえずまっすぐ進んでほしいので左右の値を共に2.5としました。
右側の丸い所に乗ればゴールなのですが、、、、

はいゴールしました。本当にお疲れ様でした。ロ技研来てね!さよなら~~

手を振る男の子のイラスト「バイバイ」

 

……とまあうまくいくのは稀です。

だいたいこのように壁にぶつかってしまいます。というのはこのロボット、キチンとまっすぐには進まないようになっているんですね。
それをどうにかしてゴールさせてやろうというのが制御のお仕事なわけです。今はやりのテレワークというやつですね、知らんけど。

理論上は左右の速度が一緒ならまっすぐ進むのですが、このロボットのようにうまくいかないということは,実際のロボットでも起こります、車輪にかかる摩擦力が左右で異なったりするからですね。多分そうだと思う。
ラジコンのように操作しているならば多少曲がっても問題ありませんが、今回のように自動で動くロボットではドンドンズレが大きくなってしまいますからこれは良くないでしょう。
プログラムを書いて制御するためにも,とりあえずどのくらいロボットが基準線からずれているかを何らかの方法で取得したいですね。
ということで、センサーを導入してロボットの位置を取得してみたいと思います。
導入したものがこちらになります。

上の画像の小さい赤丸がそうですね。こいつは光センサーを模したもので、黒い線上だと小さい値、白いフィールド上だと大きい値を返してきます。これを使ってなんとかまっすぐ進ませたい‼!
ということで、二つの光センサーを取り付けて、大きい値が帰ってきたら,つまり左右にズレが発生したら、左右の速度を変えてライン上に復帰するようにしてみました。

うまくいきました。本当にお疲れ様でした。ロ技研来てね!!さよなら~

手を振る男の子のイラスト「バイバイ」

 

….はい、うまくいったはいいけどなんかすっごいカクカクしてる。これは嫌ですね、嫌じゃないですか?
これどうやったら直るかなって一晩中考えたんですが(大嘘)、線からの離れ具合によって左右の速度をうまく変化させればよいのではないでしょうか。ちょっとしかずれていないのに猛スピードで戻そうとしたらそらいかんでしょ。ということでやって見ます。

☝0.3に左右のセンサーからの値を掛けています、センサーからの値が小さければ車輪の速度もあまり変わりません。
さてさてどうかな…?

だいぶ良くなりましたね。良くなりました。制御の知識皆無の僕の見解によるとこれがいわゆるP制御というやつです。無知をさらしたくないのでこれ以上は触れません。みんな、勉強…しよう!

ここまででもはや私はロボットを自由自在に動かせるようになりました。
そこで次回はライントレース課題にチャレンジしたいと思います。
では今度こそさようなら~

ロボット制御体験は以下のリンクから!

https://www.rogiken.org/shinkan/2020/introduce.html