2018年10月6日土曜日

ROSじゃない日本のロボットのコミュニティを

ロボットに関する話題ならなんでもOKな日本語のDiscordのサーバー作りました!

招待リンクはこちら

https://discord.gg/uXX2Hh6

(リンクから入れない人は、アプリからサーバーの追加にこのURLを貼ってください。)

Discordはゲーム用のSkype・Slackみたいなもので、今のところ無料で使えます。
ゲーム以外で使っても問題ないようで、私が購読しているのは
Rustの開発用Discordと、自作キーボードのコミュニティーのDiscordです。


すごく機能も名前も似ているものとして、Discourseがありますが、
こちらはOpenSourceで自前でサーバを立てるフォーラム形式のコミュニティーであり、
Rustも公式コミュニティーはDiscourseだし、ROSもDiscourseがありますね。


Discordはゲーム用ということもあって、なんとなくゆるい感じがして好きです。
またアプリの出来がよいのと、サーバー切り替えが非常に簡単(Slackと比較すると)です。

よく考えたらメンバーはROS Slack使っているんだからSlackのほうがよかった気もしますが・・・。ROS関係ないしね。


tl;dr

設立の趣旨としては

ROSのコミュニティーは非常に盛り上がっていて楽しいんだけど、「ROS縛り」みたいになっていて、
ROS関係ない人たちが入り込めないのが非常にもったいないなと。
まあ参加したければ無理やりROSに結びつければいいんだけど、もっと自然に日本のロボットをやっている人たちを
結びつけるようなコミュニティーがあったらいいなぁ、とかなり前から思っていました。

多分過去にはRoboticsメーリングリストとかがそういう役割だったんでしょうけど、今は気軽に議論出来るものではなく、イベント通知専用になっちゃっていますね。
2018年にメーリングリストってのもありえないので、比較的なうい感じのDiscordにしてみました。

個人的には子供を抱っこしながら片手で出来る娯楽を増やしたい、という欲求がありました。

また先日Twitterで公開でやり取りをしている人とか見かけましたが、
Twitterだと、はたから議論入っていくの難しいですよね。
Discordとかのほうが複数人の意見聞いたりするのに便利だと思いますし、これまでこういうコミュニティーは日本にはなかった。

なにか問題が起きるまではゆるーく運営したいと思いますので、仲良くやりましょう。
どんどん広めてください。使い方もどんどん提案してください。

英語だとredditで私がやりたいことに近いことができていると思っているのですが、日本だと2ch(5ch)は匿名なので議論にならないし、他に有力な掲示板はないので出来ません。

2018年7月2日月曜日

C++は難しいという話

最近ハマったのでみなさんにクイズです。

以下のコードをビルドして実行すると何が起きるでしょうか?
実際に実行する前に何が起きるか想像して、出力をノートに書いてみてください。



clangでビルドするなら、

$ clang++ -std=c++11 test.cpp

って感じです。

次に、-DTEST2をつけて

$ clang++ -std=c++11 test.cpp -DTEST2

とするとどうなるでしょうか?


正しく予想出来たらC++を理解していると言ってもいいかもしれません(だめでしょうけど)。

2017年11月6日月曜日

urdf-vizのバイナリリリースの自動化

URDFのビューワーの urdf-viz のバイナリリリースをはじめました。

Linux(たぶんなんでも動く)/MacOS/Windows用の3つがあります。さすがに64bit版だけです。

↓からダウンロード出来ます。

https://github.com/OTL/urdf-viz/releases

Windowsだとurdfファイルをurdf-viz.exeのアイコンにドラッグ・アンド・ドロップでURDF可視化できちゃう(rospackとかPATH通っていれば。もしくはmeshファイルのPathがurdfからの相対で書かれている場合は)ので本当に楽でいいです。(っていうかwindowsでrospack動くのか?)

前回は手動でリリースしたんですが、いい加減めんどくさいので自動化しました。

↓を参考に、というかこれを利用して環境を作りました。

https://github.com/japaric/trust

Linux/MacOS用にはおなじみのtravis-ciを使って、Windows用のCIには Appveryor を使いました。

タグをpushするとgithubのreleaseを自動で作ってくれて、そこにバイナリを配置してくれるようになっています。
githubのdeploy用のキーをさらに暗号化して 設定することでこういうことが出来るようです。

2017年9月2日土曜日

このロボットがすごい2017東洋大学 川越キャンパス

毎年ロボット界の幅広く面白い登壇者が一般の人向けに超面白い話をする
「このロボットがすごい」に登壇することになりました!

このロボットがすごい2017
http://konorobo.main.jp/

日時: 2017年9月12日(火) 14:30~17:30
場所: 東洋大学 川越キャンパス (7号館721室)

個人的な思い出としては、2015年のTadakuma先生の「ドロクサロボティクス」という名言が忘れられません。

このような超面白イベントに、たんなる場末のBloggerの私が出演するのは非常に僭越です。

とはいえ出来る限り頑張りたいです。

主催者の方が私にROSの黎明期から見てきた私の話を聞きたい、ということで
出演が決まったので、この機会にぜひ読者の皆様も私に聞いてみたいことがあれば教えてほしいです。

どうか少しでも話を面白くするために助けてください!

コメント欄かtewitter @OTL までおねがいします

2017年8月26日土曜日

robotics.rs

ロボット界におけるRustの情報を集めるためにドメインを取得しました。
Rustは .rs ドメイン(セルビア)を使うのが一般的です。
日本のレジストラだと高くて、取得難易度も高いので、
http://www.istanco.com というセルビアのサイトを使いました。

http://robotics.rs/

Rustのロボットライブラリを集めるサイトにしています。
とりあえず自分のライブラリ(ひどい)と自分が使っているライブラリを
載せてみました。

何かオススメライブラリあったらPRお待ちしております。

2017年8月21日月曜日

Rustで書かれたURDF Viewer: urdf-viz

今やロボットに最も適した言語として有名になりつつあるRustでURDFを可視化するツールを作りました。

http://github.com/OTL/urdf-viz

ぶっちゃけRustを勉強するために作り始めたのですが、やっと実用的な状態になったのでアナウンスしました。


Rustにはすでに

あたりを自分で作りました。


特徴的な機能として以下があります。
  • Rustなのでシングルバイナリで動く
  • 関節角度Limitを考慮して関節を動かせる
  • 逆運動学(ヤコビアン)で手先を動かせる
Ubuntu16.04 64bitを使っている人は↓からダウンロードできます。

Rust使っている人は

$ cargo install urdf-viz

でインストールできます。

使い勝手は正直かなり悪いですが、やりたいことはなんとかできるのではないでしょうか?
フィードバックお待ちしております。

今回これを作ってみて、URDFフォーマットに少し詳しくなりました。

2017年5月19日金曜日

ポエム:Rustはロボットプログラミングのデファクトスタンダード言語となりえるか

RustはMozillaが開発するプログラミング言語で以下のような特徴のあるらしい。

Rust は安全性、速度並列性にフォーカスした現代的なシステムプログラミング 用のプログラミング言語です。 ガベージコレクション無しでメモリ安全であることが、これを可能にしています。

速度、並列性、GC無し、などは制御の人だったら魅力的に感じるのではないだろうか。

ロボットのプログラミングというと、C++かPythonあたりを使っている人が多いだろう。私はPythonが大好きで趣味ではPythonばかり書いていた。そして仕事ではC++がほとんどだ。
だが、ここ2ヶ月くらいRustにハマっている。ひょっとしたらRustはロボットと非常に相性がいいのではないかと思っている。

Rustのいいところ


RustはC++に似た特徴がいくつかある。
効率がよい、GCがない、低レベルまでかける、といったロボットならではの要求を満たすところだ。

そしてC++より以下の点でロボット開発に向いていると思う。

とくにチャレンジングなロボット開発をしていて、リアルタイムな制御もしていて、最終的な品質も担保したいような場合にマッチすると思う。



1. 柔軟で強力なエラーハンドリング


C++だと例外を投げたり、返り値でエラーハンドリングする。しかしこれは簡単に無視できてしまう。
一旦例外を捕捉しないでコードを書いてしまえば、どこで何をキャッチすべきかなかなか解らなくなってしまう。
一方RustではResult型という返り値でエラーハンドリングするようになっていて、これは基本的に無視出来ない。無視するにはunwrap()関数を呼ぶなどする必要がある。なのであとでエラーハンドリングをちゃんとしようとしたときに、unwrap()を検索すれば、どこのエラーをハンドルすればいいかが分かりやすい。
もとからちゃんとハンドリングしてコード書ければいいが、開発の段階では書いたコードが実際にロボット上でうまく動くか確かめるために、とりあえずコードを動かしたい要求がある。一旦エラーを無視して書いたコードがあとで高品質に出来るというのがとても素晴らしい。
ロボットのコードは本質的に失敗が発生するもので、そのハンドリングはロボットの品質に直結する。

2.なれるまではコンパイルが大変=テストなくてもそれなりに動く?


Rustはコンパイル時に厳密に型チェックがあり、なかなかコンパイルが通らない。所有権という概念もなかなか慣れず、初心者はコンパイルを通すのに苦労する。
一方でこれはテストを書かなくてもそれなりに動くことが期待できるということでもある。型のない言語だとユニットテストがないと本当に動くか分からないが、Rustではコンパイル出来たコードは大抵動く。ロボット開発ではコードを動かすのにロボットへ転送したり、ロボットを充電したり、準備したり、とにかくコストがかかる。コンパイル時にエラーを出せるだけ出せればトータルコストを大きく下げることになる。
型は書くのが面倒だが、Rustは型推論があるので型を省略できることが多く、それほど苦にはならない。includeファイルがいらないから新しい型を追加するもの簡単だ。
ちなみにテストもコードと同じ場所に書くことが出来るため、テストも書きやすい。

3.並列性


ロボットではマルチプロセス、マルチスレッドは当たり前になっているが、スレッドの取扱はC++では非常に難しい。人間の理解の範疇を超えていると思う。Rustではオブジェクトの所有権が厳密に定まっているためマルチスレッドでも安全にデータアクセスしやすい。まだあまり試してないので本当に便利かは分かっていない。

4.現代的なビルドとパッケージシステム


cargoというビルドツールが標準で提供される。また、crateという外部ライブラリとの連携ツールも統合されている。crateはnpmやpipのようなものだ。現代的な言語ではあるのが当たり前となっているが、C++にはないので嬉しい。
ビルドもCMakeのよく分からないマクロと格闘したり、automakeのようや過去の遺産も必要ない。また、code styleなども公式に決まっているから、rustfmtというフォーマットツールを使えば、スタイルの統一も容易。


5.Roboticsのどのフィールドにでも使える



ロボットプログラミングというと、知能系はPythonで決まりだし、画像処理や制御はC++だし、マイコンはCだったり最近はRaspiでもPythonだったりするけど、Rustはそのどこにでも最適だと思う。
LLVMだからWebでも使えるらしいし。(つかわなけど)
ロボットのプログラムが全部Rustになったら幸せな世界ではないか。



もちろんRustはC++と同じようになんでも出来る言語をめざしているから、だめなことも出来てしまう。ただ危険なことはunsafeブロック内でしかできないので分かりやすい。

あとは個人的趣味だけど、ifが値を持つとか、最後の式がreturnされるから明示的にreturn書かなくていいとか、lambdaが書きやすいとか、元lisperには非常に馴染みやすい。マクロも強力らしい。


Rustの悪いところ


一方で悪いところも結構ある。


  1. 歴史がないのでググってもあまり情報が出てこなかったりする。また、決定的なライブラリがまだなかったりする。ただ、Webとかの人に比べて、Roboticsの人たちは自分でライブラリを作るのに慣れているからそれほど問題にならないのでは、と思う。
  2. 難しすぎる。新しい概念についていくのがつらい。仲間もなかなか増えなさそう。
  3. ツリーやグラフが書きにくい。ロボットだとわりとグラフとかツリー構造とかよく出てくるけど、Rustの所有権モデルだとtreeの表現が非常にやりづらい。ロボットモデルはTreeだし、RRTとかもろTreeだし。
  4. Mozillaが開発元っていうのがちょっと不安 (cf: Swift, Go)

私は結構気に入ったので、少しロボットの人たちに布教してみようと思う。


参考



Goとの違いを知りたい人むけ
C++との違いを知りたい人むけ