ロボットシステム(知能系)
ロボットシステム
感覚と動作を結び実環境で行動を計画し実行制御するロボットのシステムに関する基礎を学ぶ.ロボットは実世界を移動し操作する身体をもつ情報システムであり,ロボットの構成要素とシステムのアーキテクチャ,基盤となる計算機システム,身体を構成する要素とモデリング,ロボットオペレーティングシステム,認識行動ソフトウェア,システム開発統合環境,ロボットシステム実装例,ヒューマノイド研究システム等に関する講義を行う.
(1) ロボット計算機システム: 実時間OS、ゴミ集め
(2) ロボット基盤システム: 分散システム, ROS,
(3) ロボット応用システム: 言語処理系,幾何モデル
(4) ロボットモデリング1: 機構,運動学,形状
(5) ロボットモデリング2: キャリブレーション
(6) ロボット認識ソフトウェア:画像処理,物体検出,追跡
(7) ロボット行動ソフトウェア:探索,状態記述,宣言型
(8) ロボット学習ソフトウェア:行動学習、学習型認識
(9) システム統合ソフトウェア:SLAM,記憶管理,開発環境
(10) ロボットの構成要素:行動タスク,基本機能,構成要素
(11) 計算機アーキテクチャ1: マイクロ機構,命令セット,パイプライン
(12) 計算機アーキテクチャ2: 記憶階層,命令レベル並列性
(13) システム化:小型ヒューマノイドでのシステム事例, 組込システム
github
第1講 ガイダンス
ubuntuインストール→rosをインストールせい
ubuntuのversion
ロボットは自分を客観視できない
ロボットが受け取るセンサ情報からしか行動できないので、覚えておく仕組みや忘れる仕組みなど色々なことができないと動けない
いかにセンサ情報から、世の中わかっているふりをして記述する
condaとrosは相性が悪い
分散メッセージ通信の体験
ROSの基本コンセプト
ROSツール
ROSの概要
ROS開発環境の構築
サービスサーバとクライアントのサンプルプログラム
C++でサービスサーバとクライアントを書く
Actionlib:Topicベースの遠隔手続き呼び出し
第2講 分散システム, ROS
AnacondaとROSの相性が悪いのは、お互いどんな環境変数を使っているのか知らないからである
非同期通信が良い
階層が関係ないようなプログラムの書き方をしている
C言語のエラーが一番最初から見ると良い
launchは色々な過程を1つにまとめたもの
terminalで色々立ち上げることは最初だけで、ある程度うまくいったらlaunchファイルを作ってそこで実行するのが良い
コールバック関数について
proxyオブジェクトを作ってそこに呼び出しをかけるのはrosでよくある作戦
サービスコール、トピックリブでできないことをアクションLibを使えばできることがある
ROS自律移動
演習用ロボットの行動プログラミング
画像処理ノードと画像処理結果の可視化
ロボット台車の移動制御
ロボットアームの角度制御
Actionlibを用いたロボットアーム の角度制御
第3講 認識行動プログラミング
ros runで動かないのはいくつかの理由がある
ログを見ればわかる
ROS_PACKAGE_PATHにどこを探すか書いてある
rosのnode名はユニークじゃないと落ちる
プログラムが動く程度に理解して前に進むことが大切
現代では人間よりパソコンが書くコードの方が長くなるので、全部理解しようとしていたらいつまで経っても前に進めない
新しいタイムスタンプの情報を得るのがapt update
ワークスペースは最初にcatkin buildするときに決まる
catkin clean -yでワークスペースをきれいにする
beginner-tutorialに答えのようなものがおいてある
action-libを仕組みを見てみる
ゴールまでの自動運転プログラムを動かしてみた
openGLとcallback関数型では、共存させるためにいくつか作戦があり、最初に作戦を決めることが大切
EusLisp言語
EusLisp拡張
Lispにおけるデバッグ
第4講 言語処理系, 幾何モデル
EusLisp
ROSはOpenGLの座標系などが組み込まれている
座標系など、ロボットに基本的なことが組み込まれている言語
だいたいどのモデルも同じようにロボットモデリングしていることがわかる
bodysetというモデルは便利なので覚えておく
bodyでいくつかのモデルが出来たら親子関係を作る
irteusではロボットリンクを記述するクラスとしてbodyset-linkというクラスが用意されている
今日は要するに、ソフトウェア上でロボットを作って、やかんに手を伸ばしてそれを持ち上げるということができるようになった
ロボットモデリング
ロボットの動作生成プログラミング
ゼロ空間の利用
実際のロボットモデル
ロボット動作と干渉計算
第5講 機構とキネマティクス
今回の内容で今までの総まとめである
ロボットシステムの前半は実質終わりみたいなもん
今回はEusLispをROSにつなげる方法
roseusはEusLispのROSクライアントライブラリ
EusLispのロボットモデリング機能を使いながらROSロボットシステムとのインテグレーションを実現する
まずは基本的なROSクライアントとしての使い方を学ぶ
これはroscppやrospyと同様の機能を提供する
シンプルなパブリッシャとサブスクライバを書く
talker.lとlistener.lを書く
ROSはそれぞれのnodeが固有の名前を持つことを要求する
callback関数の指定にはいくつかのバリエーションがあり、ラムダ関数を使ったコールバック関数を指定することも可能である
シンプルな遠隔呼び出しを書く
ActionLibクライアントを書く
roseusでtfを扱う
EusLispでは座標系を定義できる
ROSでも同じようなものがあるので、コンがらがらないように
tfはROSの世界で一番基本となるデータ構造
ロボットを作ると、そこにtfという座標が紐づけられている
それをEusLisp側に持ってきたい時のサンプルプログラムが書かれている
tfの座標系がパブリッシュしてるのは、順番に連結
roseusを用いた認識行動プログラミング
tfで対象物までの距離を表現する
あとはEusLispに持ってきて合わせ技でなんとかする練習をする
動くことがわかったらそのあとはlaunchファイルにまとめて、一気に立ち上げればOK
複数のターミナルを立ち上げる作業は1つのファイルに書き換えることができる
シミュレーションとインタプリタをつなげる
シミュレーションでは、画像などで実世界の画像をどう扱うか
RVizなどで見れる画像に変換すれば現実世界でも使える
tfで持ってこれたらEusLispにある物体の情報を持ってこれるので、勝ち!
そしたらそこで作戦を考えて、シミュレーションがわにまた命令を送る!
第6講 ロボット用プログラム言語とシステム連携
今回は分散しないプログラムの統合方法!
前回とかよりも簡単
プログラミング言語それぞれ得意なところが違うので、使い分ける
ホスト言語がわとゲスト言語がわで見えている世界が違う
外部関数インターフェース
外部関数インターフェースとはあるプログラミング言語の文法と呼び出し規約を他の言語の文法と呼び出し規則に合わせ、ゲスト言語でかかれた関数やサービスをホスト言語から利用するための機構である
FFIの実行メカニズム
FFIを実行するためには機能はゲスト言語の文法と呼び出し規約を他のホスト言語の文法と呼び出し規則に合わせる方法であり、実行環境やABIなども考慮する必要がある
呼び出し規則は
・パラメータと返り値をどこに置くか、レジスタかスタックか
・パラメータを返す順番
・関数の呼び出しがわとされた側がどのような分担で関数呼び出しの準備と片付けを行うか
・呼び出した側の関数ではどのレジスタを直接、値を保存せず利用して良いか
などがあり、異なるプラットフォーム(CPUアーキテクチャとOS)では異なる呼び出し関数が必要になる
FFIの実行方法
1 ホスト言語の関数をゲスト言語で記述する、通常はライブラリが介在する
2 自動で変換してラップするツールを用いる、SWIGなど
3 ラッパーライブラリを利用する、Pythonのctype
4 ゲスト言語の機能を制限し、ホスト言語を読み込む
FFIのサンプルプログラム
C++言語で書かれた関数をC言語から呼び出す場合にはextern Cをつけて関数を定義する
一般にコンパイラで生成されるオブジェクトコード群はリンカを用いて1つのプログラムオブジェクトに結合される
このときにそれぞれのオブジェクトコードに存在する関数を適切に結びつけるために関数名だけでなくその意味情報が必要になる
名前マンダリングというものが起きる
Java言語におけるFFIはJNIと呼ばれる
PythonではCTypes module
EusLispでもある
FFIの活用例
glutライブラリをdefforeignを用いてeuslispから利用できるようにしたプログラム例
FFIツールSWIGの利用例
SWIGはC/C++でかかれたプログラムをPerl, Python, Ruby, Luaなどの言語に接続するためのツールである
SWIGではインターフェースファイルを用意する必要がある
その他のFFI
JNAはJNIを使わずJavaからC++言語を呼び出すことができるライブラリ
EusLispにおけるFFIの実装
EusLispの関数呼び出しはEUSDIR/lisp/c/eval.cの986行めから定義されている
funcodeから呼ばれる
第7講 外部関数インターフェース
(ry
第8講 ロボットの構成要素
ロボットの構成を見直して、良い構成にする
ROSは全ての構成ができる
通信プロトコルなど
この回は結構重要
画像処理の線画処理など
エピポーラ幾何
目と手の相互関係の認識とビジュアルフィードバックは重要
第9講 認識行動システム・タスク計画システム
MujinはopenRave
Moveitで衝突回避できる
うまく行ったりいかなかったり
というのもランダムベース
産業用ロボットなら、アルゴリズムの性質理解せよ
Scene objectでいれられる
タスクプランニングは別
行為と環境変化の依存関係の理解と推論
モーションプランニングの上位互換
PDDLというプランニング記述言語よい
Folder
Rosdep install
いろんな場所にあったときにうまく動作できると賢い
そういうときにタスクプランニング
タスクプランニングとモーションプランニング組み合わせよう
状態空間の次元と大きさを考えろ
大きいとサンプルベース
PDDL
Planning Domain Descrition Languageの略で最初のIPCのために開発された言語
PDDLで記述したドメインファイルと問題ファイルを入力として与えることで最終的にそのプランニング問題を解くための一連のアクション列を得ることができる
第10講 計算機アーキテクチャ
要するにコンピュータの構成
コンピュータアーキテクチャと同じような内容である,Easy
並列化計算の手法ものってる
OSについても載ってる
入出力装置についても載ってる
第11講 計算機アーキテクチャ2
命令セットなどについて
マイクロ命令せっとについて
インテルのCPUの命令のマニュアルは5000ページもある
応用分野に合わせてそれ用の言語を作ることがある
MATLABもこれ
Easy
第12講 システム化
---------------------------------------------------
ソフトウェア第二
第一講 Linuxプログラミング環境の構築
計算機にubuntuをインストールする方法は3つある。
1.ハードディスク一台全ての領域にubuntuをインストールする。
2.ハードディスクにすでに存在したOSの領域を変更し、空いた領域にubuntuをインストールする。計算機の起動時にはどちらのOSを立ち上げるかを選択する
3.仮想マシンを使ってすでに存在するOSにubuntuをインストールする
リダイレクト・パイプ:一つのことをうまくやる小さいプログラムをパイプで繋げられるのがUNIXの特徴である
プログラムを実行するときに &をつけるとバックグラウンドでジョブを管理するので他の作業ができる。
Emacsが読み込むファイルはEmacsLispという言語で記述されている
Makefileの基本
ターゲット:依存するファイル
コマンド
CMakeはMakefileよりも奥が深いツールであり、Makefileを自動で作成するものである。
test1: main.c hello.c goodbye.c
gcc -o test1 main.c hello.c goodbye.c
と記述する
Gccオプション
-g:デバッガを使うためのオプション
-Wall:警告オプションを全て有効にする、デバッグ中によい
-I:コンパイラが参照するパスに-Iで指定したパスを追加してくれる
-c:コンパイルのみ行う
第2講 デバッグ
・プリント分デバッグ
プリント分によるデバッグ用のコードを必要に応じて挿入し、削除するためにはプリプロセッサを使う方法とコマンドラインスイッチという方法がある。
・対話型デバッガを利用したデバッグ
プログラムにデバッグ情報を埋め込むためには-gオプションをつけてコンパイルする
Gdbはbtでバックトレース、
・告白的方法によるデバッグ
告白的方法によるデバッグとはプログラマが作成したプログラムについて他人に説明することで行うデバッグ。
第3講 EmacsとLisp
Emacsを起動すると、scratchというバッファが起動し、これがEmacs Lispのインタプリタとなっている
EmacsLispでは関数定義の先頭に(interactive)を入れると、キーボード操作で直接呼び出すことができるインタラクティブ関数となる
setqを使って変数を定義する
関数はdefunをオチいて定義する
condを使った制御構造を利用できる
場合わけが2つであればifが使える
宣言文的記述と命令文的記述
プログラムの記述方法にはこの2つがあるが、プログラミングでは命令文的記述として示す必要がある
反復プロセスはwhile文とdo文がある
非ローカル脱出catchとthrow
無名関数、クロージャ
第4講 scheme
schemeはLispの方言の1つとして設計された
Schemeは多くの実装があるが、ここではGaucheを利用してみる
末尾再帰
再帰関数のうち、自分自身の関数がその計算の一番最後に評価されるものを末尾再帰という
第5講 プログラミング言語の歴史
オブジェクト指向について
ロボットなどの複雑なシステムのソフトウェアでは、
1 他の開発者が書いた関数を使っても安全であること
2 コードが他の開発者にとってわかりやすいこと
3 他の開発者や自分が書いたコードを再利用できるようにすること
が重要であり、これらを実現するためのアイデアはオブジェクト指向である
低級言語
高級言語
第6講 アルゴリズムとデータ構造
・ソート
・探索
・問題解決と木・グラフ
・探索木による解の探索
easy
第7講 分散オブジェクト通信
ORBはクライアントオブジェクトとサーバーオブジェクトとの間のメッセージ通信を仲介するためのミドルウェアで、その重要な機能はシリアライズ/デシリアライズである。
これはプロセス内のデータ構造を共通形式であるバイト列やXMLフォーマットに変換し転送し、転送先では復元する機構である。ORBをすることでオブジェクトの位置透過性と実装言語独立性を実現できる。
オブジェクトの位置透過性とは相手オブジェクトがローカルで稼働しているか、リモートで稼働しているかを意識する必要がなく通信が可能であることを指す概念である。
オブジェクトの実装言語独立性とは各言語で異なるデータ形式の違いをORBにより吸収して異なるオブジェクト間で通信が可能であることを指す概念。
インターフェース記述言語とは、ソフトウェアコンポーネント間のインターフェースを記述するプログラム言語であり、オブジェクトの持つ関数の名前や引数、返り値の定義を行う、IDLコンパイラを用いて各言語に対応したコードを生成して利用する。
スタブ:クライアント側から利用され、クライアントのオブジェクトが見た場合、サーバ側にあるオブジェクトをあたかもローカルマシン上にあるかのように見せかけるプロキシオブジェクトである。スケルトンとはサーバオブジェクトのインターフェースをクライアントから利用できるよう公開したものであり、サーバ側のORBではサーバおぶじぇくとを管理するオブジェクトアダプタがスタブと対応づけられているスケルトンを探し出す。
XML-RPC:RPCプロトコルの一種で、符号化にXMLを採用し、転送機構にHTTPを採用している。RPCとはあるプログラムから別のプラグラムのサブルーチンを実行することであり、遠隔手続き呼び出しと呼ばれる。
XMLは文章をコンピュータで読み込み可能にする符号化の規則であり、拡張可能なマーク付言語と訳され、任意のデータ型をテキストとして表現するための機構となっている。
GIOP:OMGが管理するORB間の抽象プロトコルの標準規格であり、IIOPとはGIOPのTCP/IP上での実装である
POAはオブジェクトアダプタの仕様であり、サーバオブジェクトを管理する機能を提供するもの
J2EE/EJBのみがアプリケーションサーバではない
クライアントがネットワーク上に存在するオブジェクトを呼び出すための基盤を提供するのが役割
第8講 オープンソースロボティクス
ROSは近年急速にユーザを増やしているロボット用のOSで、通信機構、ツール、ライブラリ軍、コミュニティから構成されるプロジェクトである。
ROSはディストリビューションと呼ばれるバージョンが存在し、現在はIndigo, Jade, Kineticが利用可能である
kineticをお勧めする
分散メッセージ通信の体験
PythonとC++という異なる言語で書かれているプログラム同士だがお互いを意識せずプログラムを記述することができている
演習用ロボットプログラム環境の構築
第9講 計算機上でのデータの表現
よくあるやつ
-------
ロボットシステム学
良講義!
https://www.youtube.com/watch?v=twM88vv21LM
新しいver
https://www.youtube.com/watch?v=lIMhhh5wd8M&list=PLbUh9y6MXvjeM-lT7UoHix3zxxa6M5Jui&index=2
Planning Domain Definition Language
予測符号化原理に基づく実ロボットの知能化と事例 / 尾形 哲也 氏
https://www.youtube.com/watch?v=9PeL1WWcc8c
自由エネルギー原理