ロボット界におけるRustの情報を集めるためにドメインを取得しました。
Rustは .rs ドメイン(セルビア)を使うのが一般的です。
日本のレジストラだと高くて、取得難易度も高いので、
http://www.istanco.com というセルビアのサイトを使いました。
http://robotics.rs/
Rustのロボットライブラリを集めるサイトにしています。
とりあえず自分のライブラリ(ひどい)と自分が使っているライブラリを
載せてみました。
何かオススメライブラリあったらPRお待ちしております。
2017年8月26日土曜日
2017年8月21日月曜日
Rustで書かれたURDF Viewer: urdf-viz
今やロボットに最も適した言語として有名になりつつあるRustでURDFを可視化するツールを作りました。
http://github.com/OTL/urdf-viz
ぶっちゃけRustを勉強するために作り始めたのですが、やっと実用的な状態になったのでアナウンスしました。
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 は安全性、速度、並列性にフォーカスした現代的なシステムプログラミング 用のプログラミング言語です。 ガベージコレクション無しでメモリ安全であることが、これを可能にしています。
Rust は安全性、速度、並列性にフォーカスした現代的なシステムプログラミング 用のプログラミング言語です。 ガベージコレクション無しでメモリ安全であることが、これを可能にしています。
速度、並列性、GC無し、などは制御の人だったら魅力的に感じるのではないだろうか。
ロボットのプログラミングというと、C++かPythonあたりを使っている人が多いだろう。私はPythonが大好きで趣味ではPythonばかり書いていた。そして仕事ではC++がほとんどだ。
だが、ここ2ヶ月くらいRustにハマっている。ひょっとしたらRustはロボットと非常に相性がいいのではないかと思っている。
Rustのいいところ
効率がよい、GCがない、低レベルまでかける、といったロボットならではの要求を満たすところだ。
そしてC++より以下の点でロボット開発に向いていると思う。
とくにチャレンジングなロボット開発をしていて、リアルタイムな制御もしていて、最終的な品質も担保したいような場合にマッチすると思う。
1. 柔軟で強力なエラーハンドリング
一旦例外を捕捉しないでコードを書いてしまえば、どこで何をキャッチすべきかなかなか解らなくなってしまう。
一方RustではResult型という返り値でエラーハンドリングするようになっていて、これは基本的に無視出来ない。無視するにはunwrap()関数を呼ぶなどする必要がある。なのであとでエラーハンドリングをちゃんとしようとしたときに、unwrap()を検索すれば、どこのエラーをハンドルすればいいかが分かりやすい。
もとからちゃんとハンドリングしてコード書ければいいが、開発の段階では書いたコードが実際にロボット上でうまく動くか確かめるために、とりあえずコードを動かしたい要求がある。一旦エラーを無視して書いたコードがあとで高品質に出来るというのがとても素晴らしい。
ロボットのコードは本質的に失敗が発生するもので、そのハンドリングはロボットの品質に直結する。
2.なれるまではコンパイルが大変=テストなくてもそれなりに動く?
Rustはコンパイル時に厳密に型チェックがあり、なかなかコンパイルが通らない。所有権という概念もなかなか慣れず、初心者はコンパイルを通すのに苦労する。
一方でこれはテストを書かなくてもそれなりに動くことが期待できるということでもある。型のない言語だとユニットテストがないと本当に動くか分からないが、Rustではコンパイル出来たコードは大抵動く。ロボット開発ではコードを動かすのにロボットへ転送したり、ロボットを充電したり、準備したり、とにかくコストがかかる。コンパイル時にエラーを出せるだけ出せればトータルコストを大きく下げることになる。
型は書くのが面倒だが、Rustは型推論があるので型を省略できることが多く、それほど苦にはならない。includeファイルがいらないから新しい型を追加するもの簡単だ。
ちなみにテストもコードと同じ場所に書くことが出来るため、テストも書きやすい。
一方でこれはテストを書かなくてもそれなりに動くことが期待できるということでもある。型のない言語だとユニットテストがないと本当に動くか分からないが、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の悪いところ
一方で悪いところも結構ある。
- 歴史がないのでググってもあまり情報が出てこなかったりする。また、決定的なライブラリがまだなかったりする。ただ、Webとかの人に比べて、Roboticsの人たちは自分でライブラリを作るのに慣れているからそれほど問題にならないのでは、と思う。
- 難しすぎる。新しい概念についていくのがつらい。仲間もなかなか増えなさそう。
- ツリーやグラフが書きにくい。ロボットだとわりとグラフとかツリー構造とかよく出てくるけど、Rustの所有権モデルだとtreeの表現が非常にやりづらい。ロボットモデルはTreeだし、RRTとかもろTreeだし。
- Mozillaが開発元っていうのがちょっと不安 (cf: Swift, Go)
私は結構気に入ったので、少しロボットの人たちに布教してみようと思う。
参考
Goとの違いを知りたい人むけ
C++との違いを知りたい人むけ
ラベル:
Rust
ROS Japan UG #10 勉強会
明日 5/20 14:00- 10回目となるROS勉強会が開かれます。
https://rosjp.connpass.com/event/55125/
私も一応発表します。
最近ハマっているRustというプログラミング言語の話をする予定です。
先立ってポエムじみたRustのアピール文をかいたのでこちらも読んでもらえるとうれしいです。
http://ros-robot.blogspot.jp/2017/05/rust.html
残念ながら懇親会までは行けそうにないですが、発表時間中に楽しめたらと思います。
よろしくおねがいします〜。
Twitterでは #rosjp でつぶやきまくると思うので、 #rosjp 見ておくと楽しいかも。
https://rosjp.connpass.com/event/55125/
私も一応発表します。
最近ハマっているRustというプログラミング言語の話をする予定です。
先立ってポエムじみたRustのアピール文をかいたのでこちらも読んでもらえるとうれしいです。
http://ros-robot.blogspot.jp/2017/05/rust.html
残念ながら懇親会までは行けそうにないですが、発表時間中に楽しめたらと思います。
よろしくおねがいします〜。
Twitterでは #rosjp でつぶやきまくると思うので、 #rosjp 見ておくと楽しいかも。
ラベル:
ROS
2017年1月7日土曜日
Anki cozmoをROSで動かす
前回CozmoSDKのインストールをしました。
SDKが出たら当然ROS化したくなるのが心情です。
なので作ってみました。以下です。
https://github.com/OTL/cozmo_driver
マニアックな動画も用意しました。rqt_ez_publisherで動かして、rvizで表示しています。
https://www.youtube.com/watch?v=1RK-Mo6DGEw
SDKが出たら当然ROS化したくなるのが心情です。
なので作ってみました。以下です。
https://github.com/OTL/cozmo_driver
マニアックな動画も用意しました。rqt_ez_publisherで動かして、rvizで表示しています。
https://www.youtube.com/watch?v=1RK-Mo6DGEw
出来たもの
いまのところ以下のようなことが出来てます。
- カメラ画像のPublish (sensor_msgs/Image)
- 台車の操作 (geometry_msgs/Twist)
- 首とリフトの操作(面倒だったのでstd_msgs/Float64でやっちゃってます)
- 発話 (std_msgs/String)
- 背中のLED操作 (std_msgs/ColorRGBA)
- 首とリフトの角度をPublish(sensor_msgs/JointState)
- 見えたCubeの位置姿勢をPublish, /tf
- バッテリ残量 (sensor_msgs/BatteryState)
- IMU (sensor_msgs/Imu)
今後できそうなこととしては
- trajectory_msgs/JointTrajectoryのサポート
- キューブ関係
があります。Cozmo SDKは機能が豊富なのですべてをカバーするのは結構大変です。公式からなかなか出ないのも納得。機能的にSDK自体が豊富でよく出来ているのでROSでラップするありがたみもあまり感じないかもです。SDK自体がそもそもAndroidとの単なるブリッジだし、それをさらにラップするのもなぁ、って感じ。
Cozmoは発売してかなり経つのですが、いままでROS対応した人が(おそらく)いなかったのには理由があります。
Cozmo SDKがpython3.5必須なので、python2.7が必要なrospyとは同居出来ないのです。
私はその事実を知って驚愕しましたが、(危険な?)ハックでなんとか動かしました。なのでしばらくは日の目をみなそう(公式にReleaseできなかったり、動かしたくないと思う人もいるかも。)
やっても動くものは限られるので今回のようなシチュエーションじゃないと意味ないです。今回作ったcozmo_driverが使うのはrospyとメッセージ定義くらいだったのでなんとか動きました。(最近のROSはpython3でも動くように推奨されているので公式に近いコードは本質的には動くが、バイナリインストールとの兼ね合いで問題が発生している。)
Cozmo(WiFi Station) <---WiFi---> Android Phone() <--- USB cable ---> PC (SDK and ROS)
となっています。なのでROSは完全に手元のPCで動いていて、それが携帯に送られ、Cozmoが動きます。ちょっと微妙ですが、Cozmo SDKとはそういうものなのです。
Cozmoは発売してかなり経つのですが、いままでROS対応した人が(おそらく)いなかったのには理由があります。
Cozmo SDKがpython3.5必須なので、python2.7が必要なrospyとは同居出来ないのです。
私はその事実を知って驚愕しましたが、(危険な?)ハックでなんとか動かしました。なのでしばらくは日の目をみなそう(公式にReleaseできなかったり、動かしたくないと思う人もいるかも。)
Python3でrospy?
一応Python3でROS(のごく一部)を動かす方法を下に書いておきますが、真似しないようにしましょう。やっても動くものは限られるので今回のようなシチュエーションじゃないと意味ないです。今回作ったcozmo_driverが使うのはrospyとメッセージ定義くらいだったのでなんとか動きました。(最近のROSはpython3でも動くように推奨されているので公式に近いコードは本質的には動くが、バイナリインストールとの兼ね合いで問題が発生している。)
sudo apt-get install python3-yaml
sudo pip3 install rospkg catkin_pkg
ハードウェア構成
Cozmo SDKを使ってないとわかりにくいのですが、ハードウェア的には結構ややこしいことになっています。Cozmo(WiFi Station) <---WiFi---> Android Phone() <--- USB cable ---> PC (SDK and ROS)
となっています。なのでROSは完全に手元のPCで動いていて、それが携帯に送られ、Cozmoが動きます。ちょっと微妙ですが、Cozmo SDKとはそういうものなのです。
2017年1月6日金曜日
Anki Cozmo SDKをUbuntu16.04にインストールする
AnkiのCozmoを米アマゾンから買いました。非常に良く出来ています。
https://anki.com/en-us/cozmo
http://www.itmedia.co.jp/news/articles/1606/28/news124.html


日本で買うと4万円近いですが本当は$180です。amazon.comから買いましょう。
https://www.amazon.com/dp/B01GA1298S
SDKが用意してあって、自由にプログラミングすることができます。
カメラが付いていて、かわいいロボットが$180で手に入るのはすばらしいですね。
SDKの情報は以下から入手出来ます。
https://developer.anki.com/en-us
Python3.5を使うことから、古いOS(Ubuntu14.04)だとインストールがちょっと厄介なので、Ubuntu16.04にインストールしてみます。MacやWindowsもサポートされています。
Linux用インストール手順
http://cozmosdk.anki.com/docs/install-linux.html#install-linux
あとはAndroid/iOSでやることが違います。これはSDKが携帯を経由してロボットを動かすという仕組みだからです。そもそもcozmoは家庭内LAN・インターネットに接続しません。
ロボット自体がWLANステーションとなって、携帯とだけつながります。
今回はAndroidでやります。
本当はadbは公式から入れないといけないみたいですが、端折って標準のやつを入れてみましたが今のところ動いています。(が、真似しないほうがいいでしょう)
あとはAndroidを開発者モードにしてUSBデバッグを有効な状態にすればOK。("Android USBデバッグ" ググってください)
最後に動作確認として以下の4行をPython3で実行してcozmoが喋ればOK!(必ずpython3で実行する必要があります)
これは以下のものをコピペしたものです。(Apache License, Version 2.0)
https://github.com/anki/cozmo-python-sdk/blob/master/examples/tutorials/01_basics/01_hello_world.py
まだチュートリアルとかはあまり充実していませんが、色々できそうです。
APIも良く出来ていると思います。
次回ROSで動かします。
https://anki.com/en-us/cozmo
http://www.itmedia.co.jp/news/articles/1606/28/news124.html
日本で買うと4万円近いですが本当は$180です。amazon.comから買いましょう。
https://www.amazon.com/dp/B01GA1298S
SDKが用意してあって、自由にプログラミングすることができます。
カメラが付いていて、かわいいロボットが$180で手に入るのはすばらしいですね。
SDKの情報は以下から入手出来ます。
https://developer.anki.com/en-us
Python3.5を使うことから、古いOS(Ubuntu14.04)だとインストールがちょっと厄介なので、Ubuntu16.04にインストールしてみます。MacやWindowsもサポートされています。
Linux用インストール手順
http://cozmosdk.anki.com/docs/install-linux.html#install-linux
Python3と依存関係のインストール
sudo apt-get update
sudo apt-get install python3 python3-pip python3-pil.imagetk
SDKインストール
pip3 install --user 'cozmo[camera]'
あとはAndroid/iOSでやることが違います。これはSDKが携帯を経由してロボットを動かすという仕組みだからです。そもそもcozmoは家庭内LAN・インターネットに接続しません。
ロボット自体がWLANステーションとなって、携帯とだけつながります。
今回はAndroidでやります。
Android&Linux用手順
http://cozmosdk.anki.com/docs/adb.html#adb
sudo apt-get install default-jre adb
本当はadbは公式から入れないといけないみたいですが、端折って標準のやつを入れてみましたが今のところ動いています。(が、真似しないほうがいいでしょう)
あとはAndroidを開発者モードにしてUSBデバッグを有効な状態にすればOK。("Android USBデバッグ" ググってください)
最後に動作確認として以下の4行をPython3で実行してcozmoが喋ればOK!(必ずpython3で実行する必要があります)
Hello Worldプログラム
import cozmo
def cozmo_program(robot: cozmo.robot.Robot):
robot.say_text("Hello World").wait_for_completed()
cozmo.run_program(cozmo_program)
これは以下のものをコピペしたものです。(Apache License, Version 2.0)
https://github.com/anki/cozmo-python-sdk/blob/master/examples/tutorials/01_basics/01_hello_world.py
まだチュートリアルとかはあまり充実していませんが、色々できそうです。
APIも良く出来ていると思います。
次回ROSで動かします。
ラベル:
cozmo
2016年11月23日水曜日
メーリスからdiscource.ros.orgへの移行
本家のROSメーリスであるros-users (http://lists.ros.org/mailman/listinfo/ros-users)のメーリングリストが http://discourse.ros.org/ に移行するようです。
http://discourse.ros.org/t/ros-users-welcome-to-discourse-ros-org/551
これによって自分の興味あるトピックだけ通知を受け取ったり、過去ログを探したり、など柔軟に議論に参加出来るようになります。
背景として、このメーリスでは求人情報が流れまくっているので、それがうざい、というような議論が以前有りました。それに対して対策をちゃんとうった形になります。
今はどっちに投稿してもいいようですが、メーリスはなくなるようですね。ちゃんとアカウント作って、自分の興味あるトピックの通知をしておけば今までと同じように使えるし、興味ないものはMuteしておくことも出来ます。
早速GitHubと連携させてアカウント作りました。
メーリスへの転送はしばらくされるようですが、メーリスへのポストは出来なくなって、discourceへのポストしかできなくなるようです。
OSRFはコミュニティーのための環境に非常に力を入れてますね〜。
http://discourse.ros.org/t/ros-users-welcome-to-discourse-ros-org/551
これによって自分の興味あるトピックだけ通知を受け取ったり、過去ログを探したり、など柔軟に議論に参加出来るようになります。
背景として、このメーリスでは求人情報が流れまくっているので、それがうざい、というような議論が以前有りました。それに対して対策をちゃんとうった形になります。
今はどっちに投稿してもいいようですが、メーリスはなくなるようですね。ちゃんとアカウント作って、自分の興味あるトピックの通知をしておけば今までと同じように使えるし、興味ないものはMuteしておくことも出来ます。
早速GitHubと連携させてアカウント作りました。
メーリスへの転送はしばらくされるようですが、メーリスへのポストは出来なくなって、discourceへのポストしかできなくなるようです。
OSRFはコミュニティーのための環境に非常に力を入れてますね〜。
登録:
投稿 (Atom)


