syuntoku14の進捗

進捗を書きなぐります

デイビスでの生活と感想(一ヶ月経過)

 

デイビスに来てから約一ヶ月が経過しました。最近日報を書いていなかったので、技術的なことはさておき、ここ一ヶ月の出来事について。

 

ロボット部のマイクロマウスのチームに参加した。メンバーの一人が高校でロボット工学を専攻していたとかぬかすので、何言ってんだこいつってなったが、シリコンバレーに高校があったらしい。ほげえ。日本のマイクロマウスをちょっとだけ見たことがあるが、多分日本のほうがレベルが高い。

 

強化学習のコンペチームに参加している。MARLO 2018っていうコンペ。チームの人がほとんど強化学習初心者。私も初心者。何もわからないので、CS専攻の4年の人と週末に強化学習を勉強する会を開催している。

 

ルームメイトからハッカソンに誘われたので、ノリで申し込んだら通ってしまった。SACHACKSっていうサクラメントで開催されるハッカソン。そもそも一度もハッカソンに参加したこともないので、不安でいっぱい。まあなんとかなるじゃろ。

 

AI部に参加しており、いろいろな恩恵を得ている。来学期から始まる自動運転プロジェクト(4年生用の卒業前にとるやつみたい)に申し込んだら通っちゃった。ただ自動運転を学ぶだけでなく、いい感じだと自動運転をやっている企業にインターンに行けるみたい。センサーフュージョンや自動運転に関するアルゴリズムなど色々学べらしく、非常に楽しみ。強めのGPUとJetsonも割り当てられるらしい。アド。

 

本当なら研究室などに参加して教授と仲良くなったほうが良さそうだが、私の計画性のNASAによって今学期は特にそういうことはない。履修も情報理論とか取ればよかった。履修登録は一番後悔している。 教授とのコネだが、自動運転プロジェクトは教授がサポートについていただけるらしいので、そこで1つは必ず生まれそう。ギリギリセーフ。

 

1,2年で怠けていたせいで結構基礎知識が抜けてるところが多かったので、Courseraでなんとか補填している。 今は信号処理をDigital Signal Processingで復習している。かなり分かりやすいし良い。あと強化学習Practical Reinforcement Learningで学んでいる。なかなか難しいが、面白いので大丈夫。最近になって個人的に最強の勉強法を確立させたので、今度記事にでもまとめるかもしれない。

 

剣道部に参加している。運動は無条件で友達ができるので良い。とても忙しいので二週間に一回くらいしか参加できないが、だいたい皆そんな感じだった。しかし部員は多い。アメリカ人皆侍大好きなので。

 

こっちの学生で勉強していない人間を観測したことがない(私が気づいていないだけかも)。皆すごい勉強していて、自習室は夜中まで勉強している学生でいっぱい。 授業も発言が多い。聞いているだけの生徒があんまりいない。私は聞いているだけで終わった後に質問しに行く人。また、授業外にProblem Solving SessionというTAがひたすら問題を解説する会があり、理解がとても深まって良い。

 

私のルームメイトは夏にNASAインターンをしていたらしく、センサーフュージョンの知見をたくさん持っていてすごいなという気持ち。これで二年生なのが本当にアレ。

 

アメリカ、トイレがしょぼいのホントなんとかして欲しい。ウォシュレットつけて。 マンガONEでこれを読んでいて、日本食を非常に食べたい気持ちがする。早く実家の飯が食べたいが帰りたくはない。

進捗: 2018-10-07

 

8:00~ 起床
10:00~ 散髪
12:00~ Japaneseサークルで焼き肉
15:00~ Rustいじいじ&課題

アメリカの床屋、全てをバリカンで解決しようとしてくるので嫌い。ちょっとだけ切ってくれって言ったのにバリカンを出してきて話が通じねえ。

UCDavisのJapaneseサークルで焼き肉をしたりちょっとしたゲームをしたりした。人間の顔と名前を覚えるのが非常に苦手なので、すでに誰も思い出せない。本当にゴミ。

昨日の夜はルームメイトの友人の誕生日会に誘われたので行ったが、正直赤の他人なので非常にアウェイだった。すぐ帰宅して課題やってた。社交性のNASA

今日はRustをいじっていた。vscodeデバッグ環境と競プロ用のスニペットの登録などをした後、二問くらい解いた。別に何か目標があるわけではないが、何もしないと本当に何もしない人間なので、何もしないよりはマシ。

そろそろ強化学習のコンペ用の申し込みプログラムを書かないといけないし、Samurai用のコードもいじっていかないといけない。あとマイクロマウスもやりたいので、割と死期が近い。

あれだけCourseraやっていて、今日Courseraに英会話を学ぼうみたいなコースがあることに気がついた。アメリカに来る前にやれってn回言ってる。

use std::io;

fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    io::stdin().read_line(&mut s).ok();
    s.trim().parse().ok().unwrap()
}

fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    read::<String>()
        .split_whitespace()
        .map(|e| e.parse().ok().unwrap())
        .collect()
}

fn read_vec2<T: std::str::FromStr>(n: u32) -> Vec<Vec<T>> {
    (0..n).map(|_| read_vec()).collect()
}

fn str_cmp(str1: &str, str2: &str) {
    let vec1: Vec<char> = str1.chars().collect();
    let vec2: Vec<char> = str2.chars().collect();

    let l1 = vec1.len() as usize + 1;
    let l2 = vec2.len() as usize + 1;

    let mut length = vec![vec![0; l1]; l2];

    for j in 1..l2 {
        for i in 1..l1 {
            if vec1[i - 1] == vec2[j - 1] {
                length[j][i] = length[j - 1][i - 1] + 1;
            } else {
                length[j][i] = std::cmp::max(length[j][i - 1], length[j - 1][i]);
            }
        }
    }
    println!("{:?}", length[l2 - 1][l1 - 1]);
}

fn main() {
    let n: i32 = read();
    for i in 0..n as usize {
        let str1: String = read();
        let str2: String = read();

        let str1 = str1.as_str();
        let str2 = str2.as_str();
        str_cmp(&str1, &str2);
    }
}
  • Heiankyo Walking:
use std::cmp;
use std::io;

fn read() -> Vec<i32> {
    let mut string = String::new();
    io::stdin().read_line(&mut string).unwrap();
    string
        .trim()
        .split_whitespace()
        .map(|word| word.parse().unwrap())
        .collect()
}

fn change_matatabi(matatabi: Vec<Vec<i32>>) -> Vec<(i32, i32, i32)> {
    let mut vec = Vec::new();
    for m in matatabi {
        if m[0] == m[2] {
            vec.push((m[0], cmp::max(m[1], m[3]), 1));
        } else if m[1] == m[3] {
            vec.push((cmp::max(m[0], m[2]), m[1], -1));
        }
    }
    vec
}

fn calc_map(matatabi: Vec<(i32, i32, i32)>, map: &mut Vec<Vec<i32>>) {
    for y in 0..map.len() as usize {
        for x in 0..map[y].len() as usize {
            //println!("xy: {}, {}", x, y);
            let mut iter = matatabi
                .iter()
                .filter(|m| m.0 == x as i32 && m.1 == y as i32);

            let mut direction = -2;

            if x == 0 {
                direction = -1;
            } else if y == 0 {
                direction = 1;
            }

            loop {
                match iter.next() {
                    Some(m) => {
                        if direction == -2 {
                            direction = m.2;
                        } else {
                            direction = 0;
                        }
                    }
                    None => {
                        break;
                    }
                }
            }
            //println!("direction, {}", direction);

            if x == y && x == 0 {
                map[0][0] = 1;
            } else if direction == -2 {
                map[y][x] = map[y - 1][x] + map[y][x - 1];
            } else if direction == -1 {
                map[y][x] = map[y - 1][x];
            } else if direction == 1 {
                map[y][x] = map[y][x - 1];
            }
        }
    }
}

fn main() {
    let N = read();
    let n = N[0];

    for i in 0..n {
        let XY = read();
        let M = read();
        let gx = XY[0] as usize;
        let gy = XY[1] as usize;
        let m = M[0];
        let mut matatabi = Vec::new();
        for i in 0..m as usize {
            matatabi.push(read());
        }
        let matatabi = change_matatabi(matatabi);
        //println!("matatabi");
        //println!("{:?}", matatabi);
        let mut map = vec![vec![0 as i32; gx + 1]; gy + 1];
        calc_map(matatabi, &mut map);
        if map[gy][gx] == 0 {
            println!("Miserable Hokusai!");
        } else {
            println!("{:?}", map[gy][gx]);
        }
    }
}

日課

  • [ ] Control Systems の予習と復習
  • [ ] Probabilistic Analysis の予習と復習
  • [x] Lang-8に日記を投稿
  • [x] Rustで競プロ
  • [ ] Algorithms at Coursera

進捗: 2018-10-05

 

進捗: 2018-10-05

08:00~ 起床
09:00~12:00 お絵かきの授業
13:00~17:00 睡眠
18:00~24:00 Rustの練習とか

なんで私はアメリカに来てまでお絵かきをしているのか。でもお絵かきの授業全然課題でないから好き。教授が言っていることは英語力が足りないので大体わからない。

今日のお絵かき:

Blinder Contour Drawingを学んだ。その後インクを使ったお絵かきをした。紙は見ないで、描く対象だけ見て輪郭を描くことで目の動きと手の動きの同期を練習するみたいなアレ。よくわからん。弟は現役の美大生だが私は美術全然知らないので何も分からん。

f:id:syuntoku14:20181005164447p:plain

f:id:syuntoku14:20181005164519p:plain

ルームメイトのResumeを見て、賞がたくさんあってすごいなと言う気持ち。自分のResumeを見てみたが何もなかった。つれえ〜。

AIクラブが強化学習のコンペのメンバーを募集してて、強化学習やっときゃよかったと言う気持ちにもなっている。とりあえず顔を出して強化学習を教えてもらおうかな。

暇な時間をRustで競プロにあててる。暇な時間あんまりないけど。Rustがそもそも難しい。私は何故Rustをやっているのか。

Rustが好きすぎて生徒から文句を言われている教授を見つけた。授業取りたかったが、Rustが難しいので学部から文句を言われて今年からPythonになったみたい。悲しい。

* 入力関係:https://qiita.com/penguinshunya/items/cd96803b74635aebefd6

* タプルのソート:

fn main() {
    let mut tuple_list = vec![(1, 5), (9, 2), (4, 8)];
    tuple_list.sort_by_key(|k| k.1);

    print!("{:?}", tuple_list);
}

* VectorのSum:

let sum: i64 = array.iter().fold(0, |sum, a| sum + a.count);

今日解いたやつ:

* Rummy:

fn read<T: std::str::FromStr>() -> T {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim().parse().ok().unwrap()
}

fn read_vec<T: std::str::FromStr>() -> Vec<T> {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).ok();
    s.trim()
        .split_whitespace()
        .map(|e| e.parse().ok().unwrap())
        .collect()
}

fn is_same_number(a: i32, b: i32, c: i32) -> bool {
    a == b && a == c
}

fn is_sequense_number(a: i32, b: i32, c: i32) -> bool {
    a + 1 == b && b + 1 == c
}

fn is_good_set(a: i32, b: i32, c: i32) -> bool {
    is_same_number(a, b, c) || is_sequense_number(a, b, c)
}

fn remove_good_set(vec: &mut Vec<i32>) {
    let vecsize: usize = vec.len();
    let mut flag: bool = false;
    //println!("{}", vecsize);
    for i in 0..vecsize {
        for j in i + 1..vecsize {
            for k in j + 1..vecsize {
                //println!("{}, {}, {}", i, j, k);
                if is_good_set(vec[i], vec[j], vec[k]) {
                    vec.remove(k);
                    vec.remove(j);
                    vec.remove(i);
                    flag = true;
                }
                if flag {
                    break;
                }
            }
            if flag {
                break;
            }
        }
        if flag {
            break;
        }
    }
}

fn main() {
    let n: i32 = read();
    for i in 0..n {
        let mut vec_num: Vec<i32> = read_vec();
        let vec_mark: Vec<String> = read_vec();

        // modify the vector for simplification
        for i in 0..9 as usize {
            if vec_mark[i] == "G" {
                vec_num[i] = vec_num[i] + 10;
            } else if vec_mark[i] == "B" {
                vec_num[i] = vec_num[i] + 20;
            }
        }

        vec_num.sort();
        let mut ans: i32 = 0;
        for i in 0..3 {
            remove_good_set(&mut vec_num);
        }
        if vec_num.len() == 0 {
            ans = 1;
        }

        println!("{}", ans);
        //println!("----");
    }
}

* Princess's Marriage

use std::io;

fn read() -> Vec<i32> {
    let mut s = String::new();
    std::io::stdin().read_line(&mut s).unwrap();
    s.trim()
        .split_whitespace()
        .map(|e| e.parse().unwrap())
        .collect()
}

fn main() {
    loop {
        let NM = read();
        let N = NM[0] as usize;
        let mut M = NM[1];

        if N == 0 && M == 0 {
            break;
        }

        let mut DP_tuple = Vec::new();
        for i in 0..N {
            let DP = read();
            DP_tuple.push((DP[0], DP[1]));
        }
        DP_tuple.sort_by_key(|k| k.1);
        DP_tuple.reverse();

        for i in 0..DP_tuple.len() as usize {
            let DP = DP_tuple[i];
            let remain = M - DP.0;
            if remain >= 0 {
                DP_tuple[i].0 = 0;
                M = remain;
            } else {
                DP_tuple[i].0 = -remain;
                break;
            }
        }
        //println!("{:?}", DP_tuple);

        let ans = DP_tuple
            .iter()
            .fold(0, |acc, tuple| acc + tuple.0 * tuple.1);
        println!("{}", ans);
    }
}

* Space CoconutCrab

use std::io;

fn main() {
    loop {
        let mut s = String::new();
        std::io::stdin().read_line(&mut s).unwrap();
        let mut iter = s.split_whitespace();
        let e: i64 = iter.next().unwrap().parse().unwrap();

        if e == 0 {
            break;
        }

        let mut min_ = 1e8 as i64;
        let mut flag: bool = false;
        for z in 0..101 as i64 {
            for y in 0..1001 as i64 {
                let x = e - z.pow(3) - y.pow(2);
                //println!{"{}, {}, {}", x, y, z};
                if x < 0 {
                    break;
                }
                if min_ > x + y + z {
                    min_ = x + y + z;
                }
            }
        }
        println!("{}", min_);
    }
}

日課

  • [ ] Control Systems の予習と復習
  • [ ] Probabilistic Analysis の予習と復習
  • [ ] 英会話の練習
  • [ ] 確率ロボティクス
  • [ ] Algorithms at Coursera
  • [ ] 大学生からの確率統計

Fusion360からURDFを一撃で生成するスクリプトを書いた話

作ったもの

URDFを書くのが最高にめんどくさかったので、Fusion360のモデルからURDFを一撃で吐き出すアドインを作りました。

github.com

詳細や使い方、インストール方法などは全部READMEに書きました。そっちを参照してください(英語ですが、自信が無いです... 誰か添削してくれると喜びます)

吐き出すのは

  • URDFファイル
  • gazeboでシミュレーションするためのlaunchファイル

などです。

urdfだけでなく、確認用にlaunchファイルも吐き出します。

roslaunchすると、Fusionで作ったモデルがgazeboでシミュレーションできます。

例えば、

f:id:syuntoku14:20180920160144p:plain こんな感じのFusionのモデルが

f:id:syuntoku14:20180920160213p:plain

gazeboでシミュレーションできます(やったね)。

もちろんrvizでも確認可能です。

f:id:syuntoku14:20180924085234p:plain

欠点

Fusion側でモデルをきちんと定義しないと正しく動作しません。

例えば

  • リンクを全部コンポーネントとして定義する必要がある(Bodiesで全部保持してもダメ)
  • それぞれのコンポーネントをつなげるジョイントを定義する必要がある
  • revジョイント以外には対応していない

など、Fusion側での調整が必要になります。まあそれでもゴリゴリURDFを書くよりはずっと楽な上、デバッグも楽になると思うので...

コンポーネントさえきちんと定義すればちゃんと動作するはずですが、まだバグがあるかもしれません。 何か問題があればissueを投げてくれると泣きながら喜びます。スターをくれると更に喜びます。

Fusion360のアドインの開発について

公式のwebページ以外、書籍やネットにあんまり情報がない気がします。特に日本語の情報は全く無いんじゃないかな。とりあえず公式のリファレンスをひたすら参照しました。

公式のリファレンス:

https://help.autodesk.com/view/fusion360/ENU/?guid=GUID-A92A4B10-3781-4925-94C6-47DA85A4F65A

http://help.autodesk.com/cloudhelp/ENU/Fusion-360-API/images/Fusion.pdf

そもそも私がFusion360を触ったことがなかったので、結構苦労しました。 はまりかけたこと:

  • occuranceとcomponentの違いに気をつけよう。occuranceがオブジェクトでcomponentがクラスに当たるのかな?
  • モデルの原点に気をつけよう。モデルの原点がいちいち異なってるとURDF的に正しく計算されないので、スクリプト上では一回全てのoccuranceのコピーを作成し、モデルの原点をworld座標系の原点と合致させている。
  • コンポーネントの作り方:
occs = allOccs.addNewComponent(transform)

ただし、この書き方で返ってくるのはComponentではないので注意。

  • 対応していないライブラリを入れるやり方が分からん。numpyなど入ってないので、行列演算はnumpyでできない。Matrix3D.transformByなどで出来そう。要調査。
  • ジョイントはrootcomponent.jointsに入っている。回転をrevoluteにしているなら、jointsのjoint.jointMotion.rotationAxisVector.asArrayで回転軸が得られる。
  • URDFにおいて、Inertiaは全部重心を原点に計算している。APIでは重心原点のInertiaを返す関数がないので、(returnValue, xx, yy, zz, xy, yz, xz) = physicalProperties_var.getXYZMomentsOfInertia()で得られた値を平行軸の定理と"Parallel plane theorem"(和名はわかんないです)を使って重心原点のものを計算しよう。 式はここに載っているので: Parallel Axis And Parallel Plane Theorem

  • physicalProperties_var.getXYZMomentsOfInertia()だが、多分公式のリファレンスが間違っている。返り値が(returnValue, xx, yy, zz, xy, yz, xz) と書いてあるが、計算してみたら返ってきた値は(returnValue, xx, yy, zz, xy, xz, yz)だった。むかつく。

進捗: 2018-09-20

 

8:00~ 起床
10:00~15:00 fusion2urdfの修正
15:00~17:00
18:00~20:00 剣道部に参加
21:00~ ルームメイトとおしゃべり

剣道部に参加してきました。思ったより身体が動く。だてに十年以上やってないので。

デイビスの体育館はとても綺麗。大会なんかもやるらしく、チケットを販売する場所が存在している。やたらデカイ。

f:id:syuntoku14:20180920155025p:plain

fusion2urdfのバグを修正した。多分殆ど完成かも。そのうち記事にでもしようかと思う。気が向いたら。

github.com

友人の論文を読んだり読まなかったりしている。(いそがちいの ゆるちて)

ぶっちゃけると必須の予定はほとんど入っていないのでぶっちゃけあんまり忙しくない。大体がどこかにでかけたり遊んだりなので、仕事で忙しいとかではないのである。 でもアメリカの生活に慣れてないので非常に疲れる。毎日ぐっすり寝ている。

ルームメイトとおしゃべりした。明日は友人と一緒に大リーグを見に行ってそのあとシリコンバレーを散策する。ぶっちゃけ野球はほとんど興味がない。 しかし、野球には興味が無いが、余り馴染みのない文化や英語を覚えるチャンスなので、そうした面では楽しみである。シリコンバレー散策はだいぶ楽しみ。テック博物館とか行く予定。

今日の英語

It's OKをめっちゃ使ってきたが、これはニュートラルな意思表示なので、あまり好ましくないみたい。今後は使用を控える。

席を外したいからちょっとどいてって英語でなんて言えばいいんじゃろ。誰かおしえて。

日課

  • [ ] 大学生からの確率統計
  • [ ] 確率ロボティクス
  • [ ] rustで何か
  • [ ] Algorithms at Coursera

進捗: 2018-09-15(UCDのキャンパスをぶらぶら)

 

07:30 起床
08:30~ 大学生の統計
12:30~ キャンパスをぶらぶら
18:30~ 帰宅&無

キャンパスをプラプラした。そろそろ落ち着いてきたので勉強モードに入る。 しかし明日はエリックとサクラメントをプラプラするのでまだ進捗は出ない。

初めてサンドウィッチを注文した。サブウェイに行ったこともなく、カスタマイズ形式の飯を食べたこと無いので、注文にひたすら手こずった。 そもそも店員が何言ってるのか聞き取れねえ。適当に頼んだ結果カチカチのサンドウィッチが出てきて心の中でブチギレてた。英語力が足りねえ。

図書館を訪ねてみました。

 

f:id:syuntoku14:20180915132611p:plain

檻みたいな勉強スペースがあって面白かった。院生しか利用できないらしい。闇が深い。

f:id:syuntoku14:20180915132551p:plain

気づいたこととして、授業みたいな場所でも、日本と違ってめっちゃ生徒が質問する。私も簡単に質問した。 やっぱり授業に能動的に参加することは日本だろうが大事なので、ロ技研の後輩も積極的に質問するような姿勢を身につけて欲しい。 1,2年の頃は全然質問とかしなかったが、KCSとロ技研の先輩の必ず質問する姿勢を真似して、2年の後半くらいから頑張っている。もっと早くからやればよかった。

全然関係ないが、結構東大は畏怖されている。東大生はすごい天才まみれだと思われているみたい。Are you from Tokyo University?(二回目)に対して苦悶の表情を浮かべながらNOと答えた。

マルチエージェント制御の本をちょっとだけ読んだ。さっさと読むんご。

今日の英語

サブウェイでの注文

難しすぎひん??なにこれ。

英語が難しいというよりサブウェイが難しい。でもサブウェイみたいなカスタマイズ形式のやつが結構多いので早く慣れたい。

日課

  • [x] 大学生からの確率統計
  • [ ] 確率ロボティクス
  • [ ] rustで何か
  • [x] Control of Mobile Robots

進捗: 2018-09-14(サンフランシスコに行ったり英語でディスカッションしたり)

 

 

7:30~ 起床
9:00~ 買い物
13:00~ オリエンテーション
18:00~ English Caffe

自転車を手に入れた。アメリカは日本と交通ルールが違っているので、ハンドシグナルなどを覚える必要があり、気をつけないといけない。交通事故には気をつける。

デイビスは自然が豊かなので、色々な動物が普通にいる。キャンパス内にリスがめっちゃいる。かわいい。

f:id:syuntoku14:20180914162156p:plain

 

オリエンテーション修士課程の中国人留学生と仲良くなった。俺くらい英語がガバガバな人間がいない。日常会話についていけねえ。

English Caffeでは留学生と話し合いながら英語の練習をしよう!みたいな趣旨がはがきに書いてあったが、実際には神の存在について語り合うなど、真面目に議論する感じだった。 話の内容が普段馴染みのないものなので、正直ほとんど聞き取れなかった。(馴染みがあったとしても聞き取れたか怪しい)

English Caffeに来てた人の一人が、Tea Scienceの専攻だったのが非常に面白かった。UC Davisはでかすぎるので、全然知らない学問が専攻として存在していて面白い。

京都大学からきた修士課程の人とたまたま出会って、仲良くなった。なんだかんだで海外の大学院で一番大事なのは教授の推薦だよって言ってて希望を抱いた。専攻が全然違うので適用されるかはわからないが。

リスニング力がゴミすぎる。おわり。

f:id:syuntoku14:20180914162427p:plain

 

先日はサンフランシスコに遊びに行ったが、あんまり時間がなかったのでちゃんと観光できなかった。そもそも私はあんまり観光などを楽しむ方ではないのでアレではあった。個人的には、観光とかで街をぶらぶらするより確率ロボティクスとかを皆で進めたりするほうが楽しい。

 

今日の英語

とっさの時に的確な英語がすっと出てこねえ 何時から始まるの?とか、今日はWhen is it? って聞いたけど、What time does it start?とかのほうがいいのかな。 どこでやるの?は Where will it take place? とかかな。 何にせよさっさと慣れてしまいたい。

日課

最近忙しいので無理だよっていう言い訳をしている

  • [ ] 大学生からの確率統計
  • [ ] 確率ロボティクス
  • [ ] rustで何か
  • [ ] Control of Mobile Robots