ローム株式会社様より、支援品を頂きました

ローム株式会社様より、NHK学生ロボコン参加校へのデバイス提供として、支援品を頂きました。

二次ビデオ、本戦に向けた、ロボット製作に活用させていただきます。

ありがとうございました。

株式会社ミスミ様より、支援品を頂きました

報告が遅れてしまいましたが
株式会社ミスミ様より、「ミスミ学生ものづくり支援」の支援品を頂きました。
ロボット製作に活用させていただきます。
ありがとうございました。

  

 

Unityで簡単ゲームを作って操作に慣れよう

Unityをインストールしてみたけど、いまいち使い方が分からなくて一度も触っていない・・・という方は割といらっしゃると思います。そんな方のために、Unityでクソゲーを作って操作に慣れよう!という記事を書いてみようと思います!なお、今回はWindowsを用いて制作しています。

今回は、「洗脳されたロギ犬が地球を襲ってきた!はんだごてで奴らを溶かせ!」という内容のクソゲーを作ってみましょう!

00.png

Step1 インストールしよう

https://store.unity.com/ja#plans-individual

インストールはこちらのページから。まずは「個人向け」をインストールします。

00.png

この先、基本的に画面に表示される案内に従って進んでいけばインストールが完了します。Unityを立ち上げると、初めは「Sign up your Unity ID」という画面が出てくると思いますので、「Create one」をクリックし、メールアドレス等を入力してアカウントを制作しましょう。

Step2 プロジェクトの作成

さっそくゲームを作りましょう!Unityでは3Dゲームの作成が出来ますが、x-y軸のみ用いれば2Dゲームの作成も可能です。今回は2Dゲームを作成します。Unityを立ち上げ、「New」をクリックします。

00.png

 

次に、ゲームの名前を決め、次元を2Dにします。「Create project」を押せばゲームの製作が開始です!

00.png

 

このようなProjectビューが表示されると思います。(配置が異なっている場合がありますが、右上の「Layout」をいじれば変更が出来ます。自分はこの配置が一番好きなので、今回はこれでやらせていただきます。)大きく分けて5つのスペースが存在します。とりあえずは、以下のような役割を覚えておけば良いと思います。

00.png

 

Step4 準備

今回は、ゲームで使う素材も自分で制作してみましょう!Windowsの方は、ペイントソフトを開いてみてください。必ず、PNGファイルで保存してください。描くのがめんどくさいという方は、ダウンロードが出来ますので読み進めてください。

まずは敵キャラのイラストを描きます。その後、PNGファイルでデスクトップなどに保存します。

00.png

 

必要な画像は、「敵キャラ(赤い某犬)」「味方キャラ(飛行機に乗っている某犬)」「背景(宇宙)」「武器(はんだごて)」の四つです。以下に完成画像を掲載しましたので、自分で作りたくない方はダウンロード(名前を付けて保存)してください。

04.png03.png02.png

 

01.png

次に、この4つの画像を透過処理します。今回はインターネット上のサイト(https://www.peko-step.com/tool/alphachannel.html)に画像をドラッグアンドドロップし、白い部分をクリックします。透過処理出来たら、右クリックして名前を付けて保存を押し、元の画像に上書き保存します。

00.png

00.png

Step5 配置しよう

それでは、この4つの画像を、UnityのProjectView内のAssetsファイルにドラッグアンドドロップします。00.png

まずは、宇宙の背景をSceneにドラッグアンドドロップします。Game画面にぴったりで見えるように大きさを調整します。Scene画面上にはカメラが空間固定されています。このカメラから見ているものがGame画面上に表示されている仕組みです。カメラは複数台置くこともできます。00.png

ここで、Hierarchy画面上に宇宙の画像の名前が表示されたと思います。ゲームに要素が追加されたということです。この一つ一つの部品をオブジェクトと呼びます。このオブジェクトの詳細はInspector画面上に表示されています。一番上の「Transform」をいじれば、大きさや角度、座標を決めることが出来ます。また、Hierarchy画面にはMainCameraがもともとあります。このカメラも一つのオブジェクトということになります。00.png

他のオブジェクトはそれぞれにプログラムを追加して動かす必要がありますが、とりあえずSceneにドラッグアンドドロップしておきます。00.png

Step6 プログラムを書く

色々な方法がありますが、今回は一つのオブジェクトに一つのプログラムを乗っけることを基本としてみます。まずProject画面で右クリックし、C#スクリプトを追加します。名前は適当に「TekiScript」とします。名前の付け方とかプログラムに関しては適当すぎて怒られそうですが、何でもいいです。00.png

00.png

ファイルが完成したら、プログラムを書きます。VirtualStudioで開きます。インストールされてない場合は適当にインストールしてください。敵が下に降りてくるプログラムです。左右方向(x方向)の初期位置をランダムに設定し、そこから一定のスピードで降りてきます。下に降りてきて一定の座標を超えたら、オブジェクトを消去します。とりあえずはコピペでいいと思います。

Start()関数は、一番はじめに一度だけ呼ばれます。Update()関数はゲーム中何度もループします。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TekiScript : MonoBehaviour
{
public float x;
public static bool End;

// Use this for initialization
void Start ()
{
x = Random.Range(-2f, 2f);
transform.position = new Vector3(x, 6.0f, 0.0f);
}

// Update is called once per frame
void Update ()
{
this.gameObject.transform.Translate(0, -3.0f * Time.deltaTime, 0);
if (transform.position.y < -2.0f)
{

Destroy(this.gameObject);
End = true;
}
}

void OnTriggerEnter2D()
{

Destroy(gameObject);
}

}

 


このスクリプトを保存したら、続いて、スクリプトを敵オブジェクトにドラッグアンドドロップします。00.png

ここで、GameOverオブジェクトを作るのを忘れていました。以下をダウンロードして、Assetsに入れておきます。そして、このGameOverオブジェクトを画面全体に広がるようにsceneに配置します。Inspectorのチェックを外すと見えなくなります。

GameOver.png

00.png

 

次に、敵オブジェクトに当たり判定をつけます。いたって簡単で、Inspector内のAdd Component内からCircle Collider2Dを見つけ、クリックするだけです。今回は「isTrigger」にはチェックをつけておくと良いです。ぶつかった際に跳ね返らなくなります。

00.png

同じく、はんだごてにもColliderを追加します。はんだごてと敵がぶつかったときに、当たり判定が出るようにするためです。今回はPolygonColliderを導入します。また、RigidBody2Dも追加します。00.png

次に、敵を一秒ごとに出現させるスクリプトを作ります。今度は「TekiSyutugen」などというようなスクリプトを作ります。InvokeRepeating(“SyutugenTeki”, 1, 1);で、1秒に一回SyutugenTenkiを呼び出します。SyutugenTenki内ではTekiを生成します。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TekiSyutugen : MonoBehaviour {

public GameObject Teki;
public GameObject GameOver;
// Use this for initialization
void Start ()
{
InvokeRepeating(“SyutugenTeki”, 1, 1);
}

// Update is called once per frame
void Update ()
{
bool end;
end = TekiScript.End;
if(end == true)
{
GameOver.SetActive(true);
}
}

void SyutugenTeki()
{
Instantiate(Teki);
}
}


次に、Assetsに敵オブジェクトをドラッグアンドドロップします。これで敵オブジェクトのクローンが出来ました。これをプレハブと呼びます。00.png

ここで、CreateEmptyによって空のゲームオブジェクトを追加します。そこに今のスクリプトを入れます。

00.png

00.png

そして、Tekiに敵プレハブとゲームオーバーオブジェクトをアタッチします。これで、スクリプト内のpublic GameObjectのオブジェクトが決まりました。Sceneに残っている敵オブジェクトは消去します。

00.png

ここで、再生ボタンを押すと、ゲームが始まります。敵が落ちてきて、はんだごてに当たると消えるか、そしてこちらまで来るとゲームオーバーになるか確認します。00.png

ここで、スクリプトの内容を説明します。00.png00.png

ここまで来たら、はんだごてと飛行機犬を動かせるようにすれば完成です。新たなスクリプトを作ります。キーボードの右を押したら右に移動、左を押したら左に移動です。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HikoukiScript : MonoBehaviour
{

// Use this for initialization
void Start()
{

}

// Update is called once per frame
void Update()
{
if (Input.GetKey(KeyCode.LeftArrow))
{
transform.Translate(-0.1f, 0, 0);
}
if (Input.GetKey(KeyCode.RightArrow))
{
transform.Translate(0.1f, 0, 0);
}
}
}


 

このスクリプトを、飛行機犬にアタッチします。飛行機犬の中にはんだごてもいれます。

00.png

00.png

とりあえずはこれで完成でいいでしょう!

 

今までに作ったゲームはこんな感じです、もしよろしければダウンロードしてみてください!これらのゲームは一見作るのが難しそうに見えても、実際は今回使ったような、オブジェクトの移動やスクリプト間での変数の受け渡しなど、基本的な要素を組み合わせて作っているだけです。Unity操作に慣れるためにはとにかくいじることが大切だと思います。https://play.google.com/store/apps/developer?id=HAKOT&hl=en_US

最後まで見てくださり、ありがとうございました!

 

 

 

データサイエンティストへの道

投稿2日ほど遅刻しました、すみません。

初めに。
この記事は機械学習をかじり始めの僕自身のためのものとなっております。ご了承ください。
この記事はデータサイエンティストを目指す人、または機械学習を少し勉強したが少し不安がある人向けのチェックシートのようなものとなっております。

  1. どのような場合にGDではなくSGDを使うべきか。また逆も然り。

2. データセットがある場合にそれを訓練データ(training data)、検証データ(validation data)、テストデータ(test data)に振り分けるべきか。

3. ニューラルネットワークの長所・短所




答えが見たい人はスクローーーール






















【答え】
1. GDはデータセットが小さい時に、SGDはデータセットが大きい時に使用するのが良い。
 ただ、大抵の場合SGDが用いられています。理由は各自考えてみてください。

2. 特に決まった指標はないが、training(training, validation data)に80%を、test dataに20%を割り振るのが良いとされている。trainingの80%はそこから更に交差検証用に振り分ける必要が足ます。

3. 利点:非構造化データ(unstructured data)に対しては機械学習手法の中で群を抜いて効果的。例) 画像、動画、音声など
難点:モデルを確立する(収束する)までに大量な訓練データが必要となる。など


【おまけの問題】 no free lunch theoremとはなにか

はじめての電子工作を

こんにちは!「さくしゅん」がロ技研でだんだん定着してきたことが嬉しいさくしゅん(1年)です。

最近arduinoを使った電子工作を始めたので、やってみたことを書いてみようと思います。やったことがない人は電子工作を始めるきっかけにして、知ってる人は「へえ〜初心者ってこんな風に思うんだ」と思ってくれれば嬉しいです。

〜使ったもの〜

ultimate starter Kit for arduino

3千円ちょいで買えました。安価ですね。早速やってみようと思い説明書を見てみる。

この日は寝ることにしました。

〜Lチカ〜

定番のLEDを光らせる実験をしました。

マイコンに直接刺しているのは今考えるとやばいですね。先輩に助けてもらいなんとか成功。

〜LED点滅〜

普通にできました。綺麗ですね。点滅の間隔を変えるなどして遊んでみる。

〜LEDを複数接続してみる〜

クリスマスカラー。だんだん調子に乗っていきます。

〜CdSセンサ〜

見事に抵抗値が変わっています。

〜7セグ〜

?????????

何度やってもわからないのでこの日はこの辺でやめました。

〜自分でプログラムを書く〜

3本のLEDのうち、いずれかだけが消えているようなプログラムを自分で書いてみる。こんな感じ?

???赤が光っぱなしに。なんで?…あ。

間違いがわからなかった人は探してみてください。

〜暗いと光るLED〜

今までと比べたら役立ちそうですね。

〜7セグの限界〜

なんとか頑張った結果。

来年はオリジナリティを求めて頑張ります…😓

ロ技研の活動を今後も温かく見守ってください!

この記事を読んでくださった受験生または塾生の方、ロボットに興味があればぜひご一報を!部員が待ってます😊

Slack Botで自動化生活: その2 GAS

これは慶應義塾大学ロボット技術研究会 その2 Advent Calendar 2019 21日目の記事です

5日目 | 25日目→

こんにちは、ADCが空いているのをいいことに連載を始めたFastriver(@fastriver_org)です。前回分で終わらなかったのでSlack Botの作成を引き続きやっていきます。

前回分

GASとの連携

さて、前回はSlackとGoogle Cloud Functionsを連携してオウム返しをするところまで作りました。次はCloud Functionsで受け取ったデータを他に送って処理してみましょう。今回はGASを使います。

GASとは?

GAS(Google Apps Script)はExcelで言うところのVBAマクロのようなもので、G Suite(Drive, Sheet, Docs etc.)上のファイルの操作、中身の動作などを自動化できます。開発言語はJavascriptをベースとしたScript言語で、ブラウザ上でコードを書くことが可能です。Visual Basicを書きたくない人におすすめ。

Apps Scriptの作成

https://script.google.com/home にアクセスしましょう。”G Suite Developer Hub”というページらしいです(別にG Suiteじゃなくても使える)。※keio.jpのアカウントだとscriptの公開で引っかかるので外部公開を目指している人は一般のアカウントを使いましょう

左上の[+ 新しいプロジェクト]を押すとエディタに飛びます。ここの”コード.gs”というところを編集して関数を作っていくわけです。

claspの導入

先にも言ったとおりGASはJavascript(みたいなもの)で記述します。案の定私はJavascriptを書きたくないので、claspを導入してローカルで開発します。

claspは本家Googleが開発した、GASをローカルで書かせてくれるツールです。clasp自体がTypeScriptに対応しているため、Cloud Functionsのように一度buildしてからDeployするのではなくそのままDeployしてくれます。

まずclaspをグローバルでインストール。GASのプロジェクトを作成したアカウントでログインします。

$ npm i @google/clasp -g
$ clasp login

続いて先程作成したプロジェクトをローカルに持ってきます。

$ mkdir tipsBot_KRA_gas
$ cd tipsBot_KRA_gas
tipsBot_KRA_gas$ clasp clone [YOUR_SCRIPT_ID]
Warning: files in subfolder are not accounted for unless you set a '.claspignore' file.
Cloned 2 files.
└─ appsscript.json
└─ コード.js
Not ignored files:
└─ appsscript.json
└─ コード.js                                                                                                                                                                          Ignored files:
└─ .clasp.json

script IDはエディタのページの ファイル > プロジェクトのプロパティ > スクリプト ID です。プロジェクトの保存を求められるので適当に名前をつけましょう。

TypeScriptの導入

./srcフォルダを作成し、./src/main.tsで編集していきます。後はclasp側がよしなにやってくれる模様です。うれしいね!

動作確認

連携確認のため、main.tsに以下を記述します(TSを一切生かしていないとかは気にしない)。

//main.ts
function doPost(e) {
    var param = JSON.parse(e.postData.getDataAsString());

    console.log(param.text);
}

そしてpushしましょう

tipsBot_KRA_gas$ clasp push
└─ appsscript.json
└─ src/main.ts
Pushed 2 files.

ここまでやったら再びWebのエディタにアクセスしましょう。JSに変換されたdoPost関数が存在することがわかります。

Deploy

さあ、とりあえず公開しましょう。リボンの公開 > ウェブアプリケーションとして導入… からDeployします。Project versionはNew、アクセスはAnyoneにします(セキュリティ的にアレなのでこれで運用はやめようね!)。

完了するとURLをもらえます。

Cloud Functionsの編集

前回作ったCloud Functionsのプロジェクトに移動しましょう。HTTPリクエストを叩くのでrequestパッケージを追加します。TSで使うのに @types/requestも必要です。

tips_kra$ npm i request
npm WARN tips_kra@1.0.0 No description
npm WARN tips_kra@1.0.0 No repository field.

+ request@2.88.0
added 43 packages from 53 contributors and audited 141 packages in 12.18s
found 0 vulnerabilities

tips_kra$ npm i @types/request
npm WARN tips_kra@1.0.0 No description
npm WARN tips_kra@1.0.0 No repository field.

+ @types/request@2.48.4
added 3 packages from 14 contributors and audited 151 packages in 4.11s
found 0 vulnerabilities

そして./src/main.tsを以下のように書き換えます。

import { WebClient, WebAPICallResult } from '@slack/web-api';
import * as request from "request"; //追加

//略

export const tipsBot_KRA = async (req: any, res: any) => {

    //略

    if (payload.event && payload.event.type === 'app_mention') {
        //追加
        request.post({
            uri:"[YOUR_SCRIPT_URL]",
            headers: { "Content-type": "application/json" },
            json: {
                "text": payload.event.text
            },
            followAllRedirects: true,
        }, async function (error: any, response: any, body: any) {
            return res.status(200).send('OK');
        });

        const result = await web.chat.postMessage({
            text: payload.event.text.split(" ")[1],
            channel: payload.event.channel,
        });

    }
    else {
        console.log("this is not mention");
    }

    //res.status(200).send('OK'); コメントアウト
}

Deployしましょう。

tips_kra$ tsc
tips_kra$ gcloud functions deploy tipsBot_KRA --runtime nodejs8 --trigger-http

これで接続完了です!

GAS側のログはエディタの 表示 > StackDriver Logging から見られます。そのときGCPプロジェクトとの接続を求められる場合がありますが、その時は リソース > Cloud Platformプロジェクト からGCPプロジェクトの番号を入力します(番号はGCPの IAMと管理 > 設定 > プロジェクト番号)

GASでメッセージを受け取れていますね!

説明

突っ走りましたが多少コードの説明をしていきましょう。

//main.ts GASのコード
function doPost(e) {
    var param = JSON.parse(e.postData.getDataAsString());

    console.log(param.text);
}

GAS側のコードです。GASでは並列して複数の関数を作れますが、doGet()とdoPost()関数は特別で、先程公開するときに使用した”ウェブアプリケーションとして公開”のURLにアクセスしたときに呼ばれる関数になります。doGet()はGETリクエストしたときに呼ばれ、例えばHTMLをreturnしてあげればそのページが表示されます。doPost()はPOSTリクエストしたときに呼ばれます。そのデータが引数の”e”に乗ってくるわけです。

eの中身については公式に書いてあるのですが、そのとおりにしてもあまり思うように動きません。ということで上のコードが試行錯誤して得られた、上手く送られたパラメータを取得する方法となります(せっかくTSなのでinterfaceとか定義しようね!!)。

console.log()ではログを出力しています。これとは別にGASにはLogger.log()というのがあるのですが、こちらは一回実行するごとにログがリセットされるなど使い勝手が悪いので却下し、GCPのログで確認ができるconsole.log()を採用しました。Apps Scriptだけで完結したいなどの時はLoggerを使うのも良いと思います。

//index.ts Cloud Functionsのコード
import { WebClient, WebAPICallResult } from '@slack/web-api';
import * as request from "request";

// Read a token from the environment variables
const token = process.env.SLACK_TOKEN;

// Initialize
const web = new WebClient(token);

export const tipsBot_KRA = async (req: any, res: any) => {
    const payload = req.body;

    if (payload.type === 'url_verification') {
        return res.status(200).json({ 'challenge': payload.challenge });
    }

    if (payload.event && payload.event.type === 'app_mention') {

        request.post({
            uri: "[YOUR_SCRIPT_URL]",
            headers: { "Content-type": "application/json" },
            json: {
                "text": payload.event.text
            },
            followAllRedirects: true,
        }, async function (error: any, response: any, body: any) {
            return res.status(200).send('OK');
        });

        const result = await web.chat.postMessage({
            text: payload.event.text.split(" ")[1],
            channel: payload.event.channel,
        });
    }
    else {
        console.log("this is not mention");
    }
}

Cloud Functionsのコード全体像です。非常にガバガバです。俺たちは雰囲気でNode.jsを弄っている。なので言うことは特に無いです。コードのとおりです。

続けている

まだ続く…

なんかまだできていない区切りがよいので今日の分はこの辺にしておきたいと思います。

開発しながらブログを書く、というのも結構いいですね!自分の通った道を振り返って整理しながら進めるので効率は悪いですが再現性が上がります。今後もやっていこうかな。

その1

5日目 | 22日目→

汎用型マイクロマウスシミュレーター

この記事は、慶應義塾大学ロボット技術研究会アドベントカレンダーその1の20日目です。また、10日目の続きになります。え?投稿が24日?気にしない気にしない

←19日目|21日目→

こんにちは。電子工学科3年のKeitakatzです。マイクロマウスシミュレーターの汎用型作成について報告します。そもそもマイクロマウスシミュレーターってなんぞや?という人は、10日目の記事を参照してください。

さて、前回の記事でのシミュレーターは、トレモー法の不完全なシミュレーションしかできませんでした。しかし、それでシミュレーターと言えるのでしょうか。そう思い、現在は汎用型のシミュレーターを開発中です。そこで、現在完成している部分を公開しようかと思います。

〇タイトル画面

タイトル

アプリケーションを起動すると、KRAのロゴが表示された後にこの画面になります。Mainを選択するとシミュレーション画面に、Editを選択すると編集画面に、Quitを選択するとアプリケーションを終了します。

 

〇編集画面

エディット

タイトル画面でEditを選択するとこの画面に移動します。ここでMazeを選択すると迷路編集画面に、Mouseを選択すると機体編集画面に移動します。

〇迷路編集画面

迷路

この画面では迷路を自作し、保存することができます。ここで作成した迷路でシミュレーションを行います。

〇機体編集画面

マウス

この画面では、主に壁検知センサーの不可視化を行うことができます。Algorithmを選択するとプログラム作成画面に移動します。

〇プログラム画面

アルゴリズム

 

この画面ではシミュレーションに使うプログラムを、ブロック線図で作成することができます。画像作成が間に合わなくて、ブロックのイラストは適当。MatlabのSimulinkのようなものだと考えてください。

〇シミュレーション画面

前回の記事の流用。

 

まだ未完成ではありますが、現時点のバージョンを一部非公開で共有します。ここに置いてある『汎用型』が現在のバージョンです。

完成版は12/31公開予定です。