Robot Integration

Yasunori NAGASAKA

2021 年 04 月 16 日

iContents:
第1章

はじめに

1

第2章

講義の進め方、取り上げる内容について3

2.1

ハードウェアについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3

2.2

ソフトウェアについて . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4

2.3

Web インタフェースの付加 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

4

2.4

準備 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5

2.5

必要とされる知識 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5

2.6

開発環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5

日程

7

毎週の作業内容の記録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

8

第4章

文献検索について

9

第5章

Raspberry Pi, Ubuntu の設定と使い方

11

5.1

凡例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

5.2

重要なコマンド. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

11

5.3

起動とログイン. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

5.4

ネットワークの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

5.5

ネットワーク稼働後の設定、リモートログインの方法. . . . . . . . . . . . . . . . . . . . . . . .

14

5.6

プログラムのコンパイルと実行方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

5.7

参考資料、利用しているライブラリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

16

5.8

その他 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

16Gazebo 上でのロボットモデルの作成

19

6.1

サンプルパッケージ mri????.tgz の使い方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19

6.2

rviz で関節の動きを確認する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

20

6.3

gazebo 上でプログラムによりモデルを動かす . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

6.4

制御プログラムの解説 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

21

6.5

モータの制御の仕方 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

22

6.6

20200622 追加分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

6.7

20200630 追加分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

6.8

20201201 追加分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

25

第3章

3.1

第6章

6.9

20210111 追加分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

26

6.10 20210311 追加分 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

第7章

Flask

29

7.1

環境の準備 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

7.2

起動と動作確認. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

7.3

Flask のプログラミング . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

7.4

RasPi に接続した USB カメラの画像を Flask で扱う方法 . . . . . . . . . . . . . . . . . . . . . . .

35

7.5

Gazebo 上のロボットモデルが備えるカメラの画像を Flask で扱う方法 . . . . . . . . . . . . . . .

36

参考資料

39

8.1

Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

8.2

ROS, Gazebo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

8.3

Flask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

40

Indices and tables

41

第8章

第9章

ii

1

第1章

はじめに

大学院の講義「ロボット・インテグレーション」では、ロボットを構成する様々なハードウェア、ソフトウェアの技術を組み合わせて、ロボットをシステムとして構成する方法を学ぶ。
個々の技術については機械、電気、情報、制御などの各分野における永年の研究、開発成果の蓄積で文献や書籍が数多くあるが、それらを組み合わせて一まとまりのロボットシステムとしてどう構成するかという点については文
献、書籍がまだない。よって教科書はない。

ROS が広く使われるようになったことで、システムとしてのロボットが注目されるようになり、共通の開発基盤が整ってきた。ROS の使い方に関する書籍は増えてきたが、その上のレベルの汎用的なシステムとしてのロボッ
トの構成方法については、まだ発展途上で確立された理論がない先端の分野といえる。
よってこの科目では、キチンとまとめられた内容についての講義や輪講ではなく、代わりに複数の技術を組み合わせて実際に小さなロボットをシステムとして製作してみる。そこから、様々な技術の統合（インテグレーション）
について、経験を通して知見や気付きを得ることを目指す実践的な内容、実習を中心にして進める。
具体的な内容は、マイコンボード Raspberry Pi (以後 RasPi と表記), Ubuntu, ROS, その他デバイスを組み合わせてロボットを製作する。３人または４人でチームを構成して、メンバーで作業を分担、協力して 1 台のロボットの製作に取り組む。

3

第2章

講義の進め方、取り上げる内容について

３人または４人でグループを構成して、グループ内のメンバーで作業を分担、協力して、1 台のロボットおよびGazebo シミュレータ上のロボットモデルを製作／制作する。最後の発表会では、ハードウェア、ソフトウェアのロボットが動作する様子のデモンストレーションを行う。また最後の成果物の提出では、ロボットが動く様子を撮
影した動画と、開発過程と結果をまとめたレポートを提出する。

2.1 ハードウェアについて
Raspberry Pi と、いくつかのデバイスを配布するので、それらを組み合わせて、何らかの動作をする小さなロボッ
トを製作する。センサ、アクチュエータ、ROS, インターネット経由の入出力が使える。

2.1.1 使えるパーツ、ソフトウェア
ハードウェアについては、次のパーツ、機能は各グループに標準で配布する。

• Raspberry Pi, 電源• サーボモータ• デジタル入出力• 音声出力、スピーカ• ３軸加速度センサ• AD 変換• USB カメラ
次のパーツは個数が限られているので希望があれば抽選で配布する。

• Leap Motion (1 台)Robot Integration
サーボモータは、2 個以上使いたい場合は申し出る。在庫に余裕がある範囲で提供する。
ここで示したデバイス以外に、個人所有のデバイスを使いたい場合は持ち込んで併用して構わない。
ハードウェアに関係する次のソフトウェアはすぐ使える状態で配布する。

• Ubuntu 18.04 server (Raspberry Pi 用)• ROS• 各種デバイスを使うためのサンプルプログラム• Flask, Web フレームワーク ( https://ﬂask.palletsprojects.com/en/1.1.x/ )次のソフトウェアは必要に応じて自分でインストールする。

• ROS のトピック、サービスを使った通信• OpenCV による画像処理
各デバイスの使い方、Gazebo 上でのモデルの動かし方など、必要な情報は準備できたものから順次公開する。
ロボットの本体を構成するフレームなどは、3D CAD で設計して、• 3D Printer で出力できるものは、学科所有の 3D Printer で出力する。
• 金属材料の加工が必要な場合は、工学デザインルームで加工する。
ことができる。ロボット理工学 II で使用したアルミ板の残りが保管してあるので、使いたい場合は申し出る。その他、ネジやプラスチック板などは在庫がある範囲で提供できる。

2.2 ソフトウェアについて
ROS, Gazebo を連携させて、ハードウェアで製作するロボットの Gazebo 上で動くシミュレーションモデルを制作する。学部 3 年生の科目「ロボットインテリジェンス」では、関節で動く脚を備えた歩行ロボットを制作したが、それにカメラや他のセンサを組み合わせて、センサで得た情報から必要な判断をして動くロボットを目指す。

2.3 Web インタフェースの付加製作するロボットを操作する環境として、Flask を利用したユーザインタフェースを付加することを目指す。Flaskとは Python をベースとした Web アプリケーションを作成するためのシンプルなフレームワーク、開発基盤である。これにより、Web ブラウザからロボットの起動、停止、ロボットの状態確認、機能やオプションの指定などが可能となる。
もし Flask 以外の別の環境を使いたい場合は相談する。

4

第 2 章 講義の進め方、取り上げる内容について

Robot Integration

2.4 準備• Ubuntu が動くノート PC を用意する。
• 各自、製作するロボットの内容とそこで使用するソフトウェア、ハードウェアの要素技術を考える。必要なパーツを考えておく。

• 自分が作ろうとするロボットで必要となる技術で、例えば次に示す必要とされる知識で不足する分野があれば 事前に勉強しておく。

• ソフトウェアを選択する場合、ROS, Gazebo が使えるようにしておく。

2.5 必要とされる知識• Linux, Ubuntu の基本操作• Python のプログラミング• ROS の基本的な機能の理解とツールの使い方、簡単なプログラム作成• ROS のトピック、サービスを使った簡単な通信プログラム作成• RasPi の機能、デバイスを接続するための電子回路の基礎知識• URDF で記述したロボットモデルを GAZEBO 上で動かす方法• Web 上のインタフェースを作成するための HTML の基礎知識
これらは、学部のいくつかの科目で学んだものが多いと思われるが、未知のもの、知識が不十分なものは自分で補っておくこと

2.6 開発環境
ハードウェアの開発、製作に関して、リモート講義の期間に研究室や自宅で開発ができる環境、機器が必要になる。次に示す、ローカル、有線 LAN、無線 LAN を利用するいずれかの環境を用意することで、Raspberry Pi 上での開発ができる。
ローカル HDMI 入力ができるディスプレイ、USB キーボード、USB マウスがあればネットワークに接続しなくてもローカルに作業が可能。ただし可能であればネットワークに接続できる環境が望ましい。
有線 LAN

前述の機器がない場合、PC からネットワーク経由で接続して作業する。有線接続が可能なら設定は難しくない。DHCP のサービスを提供するルータに接続することで、自動的に IP アドレスが割り当てられ PC
から接続できるようになる。

2.4. 準備5

Robot Integration
無線 LAN

無線でしか接続できない場合はルータ等の設定が自分でできる必要がある。167A であれば自動的に接続されるように設定されている。

Gazebo 上のシミュレーションについては、各自の PC に ROS, Gazebo の環境を用意すれば開発ができる。

6

第 2 章 講義の進め方、取り上げる内容について

7

第3章

日程

１週

グループ分け、機材の配布、使い方の説明製作するロボットの内容をグループで相談して決め、企画書にまとめる、作業内容の記録

２週

企画書の提出ロボットインテグレーションの現状の調査とまとめ、グループで製作するロボットに関連する文献の調査とまとめ、製作、作業内容の記録

３週

製作、作業内容の記録

４週

製作、作業内容の記録

５週

調査結果をまとめたレポートの提出製作、作業内容の記録、中間報告のレポート作成と提出

６週

製作、作業内容の記録

７週

製作、作業内容の記録

８週

製作、作業内容の記録

９週

製作、作業内容の記録

10 週 製作、作業内容の記録、中間報告のレポート作成と提出
11 週 製作、作業内容の記録
12 週 製作、作業内容の記録
13 週 製作、作業内容の記録
14 週 製作、デモンストレーションとデモムービーの用意、レポート作成、作業内容の記録
15 週 発表会、レポートに基づく発表、ロボットのデモンストレーションの披露、デモムービーとレポート提出、作業内容の記録

Robot Integration

3.1 毎週の作業内容の記録
リモートでの講義が多くあるため、各週の学習内容、製作作業の取組状況を記録を残す。９０分×１５回を満たす
ように、グループのメンバー１人ずつについて、日時、時間、各回に何に取り組んでどのような進展があったかを記録して、中間報告、および最後のレポートに含める。
「〜〜をやった。
」という記述だけではなく、作成したモノの写真、作業中の画面をキャプチャした画像、作成したプログラムなどを一緒に記録すること。週によって作業の進み具合がある程度異なるのはやむを得ないが、毎週少しずつでも進めるように取り組む。

8

第 3 章 日程9第4章

文献検索について

文献検索については、• ロボットインテグレーションの現状、すなわち、様々な技術を統合してロボットを構成するための元になる
考え方や理論• 自分たちが製作するロボットに関連する過去の開発事例を調査してみる。
インターネットやデータベースなどを使って、上記に関連する資料があるかどうかを調べる。もし参考になる良い
文献や資料が見つかったら PDF をダウンロードしておく。また、それらを読んでまとめたものを１回目の中間報
告の内容の一つとして含める。
検索するときは、インターネットでの検索は通常の検索に加えて、学術用の Google Scholar など、データベースの検索は図書館のページから、
中部大学附属三浦記念図書館↓
外部データベース↓

CiNii Articles (日本の論文)
Web of Science（海外の論文）
日経 BP 記事検索サービス -> 日経 Robotics（ロボット関連の最新の記事）などを利用するのがよい。他にも適切な調査手法があれば、それらも駆使してもらって構わない。
上記の 3 個のデータベースは学外からの利用だと個人認証を求められるものがあるが、中部大学の ID が通るはず。
図書館の提供する外部データベースは、学内からなら様々なものが利用できるが、学外からの利用が可能で役に立ちそうなものは意外と少なくそれ程ない。
データベースの検索ではキーワードの組み合わせを求められるが、その組み合わせによって結果が全く変わってくるので、関係ありそうな様々なワードの組み合わせをなるべく多く試すと、望みの結果を得られる可能性が高く
なる。

11

第5章

Raspberry Pi, Ubuntu の設定と使い方
5.1 凡例// 以降はコメントを表す。
# は管理者でのコマンド実行を表す。
# cat /etc/shadow// これはコマンドの例

行頭の $ は一般ユーザでのコマンド実行を表す。
$ cat /etc/shadow// これもコマンドの例

次の 2 行はほぼ同じ指示になる。
# cat /etc/shadow$ sudo cat /etc/shadow

5.2 重要なコマンド
root 権限を継続して得るには、$ sudo -s# date// コマンドの例

その後抜けるときは exit を実行する。
# exit$

再起動は次のどちらかを実行する。

Robot Integration$ sudo reboot$ sudo shutdown -r now

OS を停止させるには、次のいずれかを実行する。
$ sudo poweroff$ sudo halt
$ sudo shutdown -h now[★重要] 基板上の電源スイッチを切るのは、OS 停止後オレンジの LED の点滅が止まってから数秒後まで待つ。
[★重要] RasPi は、起動時や何かコマンドを実行した時に、長時間に渡って反応がないときがあるが、実行に時間がかかっているだけの場合が多いので反応が帰ってくるまで待つ。急いで再起動したり電源を切ると壊れるので注意する。

5.3 起動とログイン
microSD を RasPi に挿した状態で、基板上の電源スイッチを ON にすると起動する。電源スイッチは、基板の角の方向に倒れているときが OFF 、辺の中央に向かって倒れているときが ON である。場合によって起動の途中で３分弱程度ネットワークの起動を待つ時間がかかることがあるが、そのうち進むので気長に待つ。
スピーカから「シャー」、「ジャー」という小さい音が聞こえれば動作中の証拠。周期的に大きめの音で「ガリガリ」というのは、無線 LAN のデバイスが定期的に接続を試みている証拠である。ガリガリが聞こえるときは Ubuntu
が動作している。ガリガリがうるさいときは、後述の方法で無線 LAN を停止させてもよい。
起動処理の終盤で電源電圧と IP アドレスを音声でアナウンスする。IP アドレスは１回目が有線 LAN、２回目が無線 LAN を表すので、自分が使う方の内容を覚えておく。IP アドレスが割り当てられていないアダプタはアドレ
スが ゼロ とアナウンスされる。
最初から使える管理者アカウントは ubuntu , パスワードは ubuntu1804 となっている。アカウント pi , パスワード

raspberry が一般アカウントとして使用可能、sudo も指定可能。普段は pi を使い、必要に応じて ubuntu も使ってよい。

5.4 ネットワークの設定
LAN は有線、無線ともに DHCP で設定されるアドレスを使用する。
Ubuntu 18.04 からネットワークの設定の方法が変更された。
無線 LAN を使う場合は、事前に以下の方法のいずれかで設定をしておくとよい。

• PC に microSD を挿して PC 上の Ubuntu で次の netplan の設定ファイルを自分の環境にあわせて書き換える。

12

第 5 章 Raspberry Pi, Ubuntu の設定と使い方

Robot Integration• 有線 LAN で接続して、PC 等からリモートでログインして編集する。
• キーボード、マウス、ディスプレイを接続してログインして編集する。
編集時に TAB は使えないので、空白はすべて SPACE で書く。

166B, 167A の無線 LAN のエントリは初期状態から用意してある。自分の研究室や自宅で作業する時は、下記の内容を参考にして無線 LAN ルータの SSID とパスワードを追加する。
$ sudo vim /etc/netplan/50-cloud-init.yaml

ファイルの最後に以下のようなアクセスポイントの設定がある。もともとある記述を真似して研究室や自宅の無線

LAN ルータの SSID と password を追加する。
access-points:"robolabC":
password: "roboticslab""robolabB1":
password: "roboticslab""robolabB2":
password: "roboticslab""robolabD":
password: "roboticslab"

microSD を RasPi に挿して起動すると設定が反映される。
一旦無線 LAN が使えるようになれば、その後は ssh で接続したターミナルから上記のような設定変更をすることが可能になる。

ssh で接続している時は、次のコマンドで変更が反映されて有効になる。
$ sudo netplan apply

または再起動してもよい。
$ sudo reboot

もしネットワークのデバイスを有効／無効にする場合は次のようにコマンドを実行する。
$ ifconfig wlan0 up$ ifconfig eth0 down// 無線 LAN を有効にする// 有線 LAN を無効にする

無線 LAN を使わない場合は、無効にすることでガリガリを消すことができる。

ifconﬁg がインストールされていない場合は以下でインストールする。
$ sudo apt install net-tools

5.4. ネットワークの設定

13

Robot Integration
デバイス毎の状態の確認の仕方$ ip addr show

5.5 ネットワーク稼働後の設定、リモートログインの方法
有線 LAN を挿しておくと、DHCP が使える環境なら IP アドレスが起動時に自動で割り当てられる。無線 LAN は
前述のアクセスポイントの設定後に起動すれば IP アドレスが自動で割り当てられる。
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen,→1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group,→default qlen 1000
link/ether b8:27:eb:35:6a:48 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.4/24 brd 192.168.0.255 scope global dynamic eth0....
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group,→default qlen 1000
link/ether b8:27:eb:60:3f:1d brd ff:ff:ff:ff:ff:ff
inet 192.168.0.5/24 brd 192.168.0.255 scope global dynamic wlan0...

RasPi では初期状態で ssh が有効にしてあるので、 IP アドレスを確認した後は ssh を使って別のマシンから IP ア
ドレスを指定してログイン後操作できる。
例$ ssh pi@192.168.0.4

最初は ssh のキーの登録を確認されるので yes を指定して進める。
The authenticity of host '192.168.0.4 (192.168.0.4)' can't be established.
ECDSA key fingerprint is SHA256:eAU2OdLfL45G6XGmeOzd+ltnBwkhfEr7CIadujIRGBk.
Are you sure you want to continue connecting (yes/no)?

初期状態では、すべての個体が同じ名前 ubuntu0 になっているので、グループの番号などを含めた固有の名前に変更しておく。次回起動後から有効になる。
$ sudo vi /etc/hostname

追加したいアプリケーションがあればインストールすることができる。

14

第 5 章 Raspberry Pi, Ubuntu の設定と使い方

Robot Integration$ sudo apt install something

もし次のエラーが出たら、E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily,→unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another,→process using it?

再起動すると直ることが多い。

5.6 プログラムのコンパイルと実行方法
今回使っている OS は、Ubuntu 18.04 Server である。通常の作業はアカウント pi で行う。
コンパイルの仕方、例として xxx.cpp をコンパイルするときは、// Ubuntu$ g++ -o xxx xxx.cpp rs405cb.cpp -lwiringPi -lpthread -lcrypt -lrt -lm

実行ファイル名は xxx になる。実行時に音声以外でハードウェアをアクセスする時は sudo が必要$ sudo ./xxx

サンプルプログラムは、~/raspidemo/ にある。
$ cd raspidemo$ lstestall.cpp が入出力の一通りの機能を確認するプログラムである。testall.cpp のコンパイルの仕方はファイルの先頭を見る。
$ head testall.cpp$ g++ 指定されたオプションなど ...
$ sudo ./testall

各種デバイス、機能は個別のソースファイルに分けてある。利用の仕方は testall.cpp を真似する。

• ジャイロセンサ、加速度センサ

mpu6050.cpp• サーボモータ rs405.cpp• 音声出力 speech.cpp• AD 変換

adc.cpp5.6. プログラムのコンパイルと実行方法

15

Robot Integration• デジタル IO

io.cpp5.7 参考資料、利用しているライブラリ• デジタル入出力は WiringPi http://wiringpi.com/• 音声合成は http://open-jtalk.sp.nitech.ac.jp/• サーボモータは双葉 RS405CB http://www.futaba.co.jp/robot/command_type_servos/rs405cb
サーボモータのプログラムでは、公開されているコマンドプロトコルにあわせて通信する関数を作成してある。

5.8 その他
コマンド入力に対して稀にレスポンスが悪く、２，３秒から 10 秒程度待たされることがあるが、気長に待つ。調
べたところ、Update 可能なアプリに関するなんらかの処理をしているらしい。しばらく経って、処理が終わればレスポンスがよくなる。
電源断のタイミングが早くて OS が入っている microSD が壊れたことがあったので、緑色の LED が消えてからしばらく待つ。
紫色、赤色の基板のモータ用の電源のスイッチは基板の角に近い方が OFF、反対が ON である。電源ケーブルの抜き差しをする時は、T 字型のコネクタで行う。基板上の白い小さいコネクタはなるべく抜き差ししない。

nmap のインストール、ネットワークに接続されている PC 等の確認に使える$ sudo apt install nmap
$ nmap -sP 192.168.XXX.0/24// XXX は自宅ルータに依存

raspbian と ubuntu でコンパイル時に必要なライブラリが異なるので注意する。インターネット上で RasPi のプロ
グラミングを調べると、多くは raspbian を前提として記述されているので、必要に応じて読み替える。
// Raspbian$ g++ -o xxx xxx.cpp rs405cb.cpp -lwiringPi -lm// Ubuntu$ g++ -o xxx xxx.cpp rs405cb.cpp -lwiringPi -lpthread -lcrypt -lrt -lm

電源とスピーカの 2 ピンコネクタ、サーボモータの４ピンコネクタは向きがあり、正しい向きでしか挿せない。コ
ネクタは小さな穴から端子が見える面と、白一色の面があるが、小さな穴が隠れない向きに挿す。
サーボモータ附属のサーボホーンには、他のものが固定できるようにネジを２個付けてある。
音量調整には、~/raspidemo/vol.sh を使う。

16

第 5 章 Raspberry Pi, Ubuntu の設定と使い方

Robot Integration
モータの回転角度は、±150 度まで、限界を超えると動かなくなることがあるので、使うときは ±120 度程度に留めておく。
音声出力は、Open JTalk でテキストデータから WAV ファイルを生成し、WAV ファイルを再生している。よって、音楽の WAV ファイルを用意すればそれを再生することもできる。
サーボモータの ID は 1 に設定されている。複数個のサーボモータを使う場合は 2 以上の ID を持つモータを追加する。

OS を停止させた後でも、AC アダプタからの電源供給は続いているので、最後は基板上のスイッチで物理的に電源を切断する。赤色 LED が消えれば物理的に電源が切断されたことがわかる。

5.8. その他

17

19

第6章

Gazebo 上でのロボットモデルの作成
6.1 サンプルパッケージ mri????.tgz の使い方
Gazebo 上で動かすサンプルのロボットとして、6 脚ロボットのパッケージを公開する。ファイルをダウンロード
したら展開する。
$ tar zxvf ./mri????.tgz

事前に用意した workspace を仮に ~/WS とする。展開した mri を WS/src/ に移動させる。
$ mv mri ~/WS/src/

設定ファイルの読み込みを端末起動時に実行するように登録しておくと毎回手動で実行する必要がなくなる。
$ cd$ vim .bashrc
開いたファイルの末尾に次の 2 行のコマンドを書き加える

source /opt/ros/VERSION/setup.bash
source ~/WS/devel/setup.bash
VERSION (kinetic, melodic 等) は自分の環境に合わせて書き替える。

変更した内容を保存、実行する。

Robot Integration$ source ~/.bashrc

6.2 rviz で関節の動きを確認する※これは必須ではないので、何か問題があればスキップしても構わない。
$ roslaunch mri prog_rv.launch$ roslaunch mri prog_rv.launch.kinetic(kinetic, indigo の場合)

rviz が起動したら、左下の Add ボタンから RobotModel を追加する。左上の map と書いてあるところを body に変更、改行する。赤いロボットのモデルが現れる。白い柱が中央に現れたら無視する。各関節のスライダを左右に動かすとそれにあわせてモデルが動く。

図 6.1 rviz

20

第 6 章 Gazebo 上でのロボットモデルの作成

Robot Integration

6.3 gazebo 上でプログラムによりモデルを動かす
catkin_make してから、実行する。
$ cd ~/WS$ catkin_make$ roslaunch mri prog_gz.launch$ rosrun mri prog

※ prog_gz.launch の先頭部分で myworld.launch か empty_world.launch を選択できるので、使わない方を <!-- , -->で囲んでコメントアウト、無効にする。表示を軽くしたいときは empty_world.launch がよい。

図 6.2 gazebo

6.4 制御プログラムの解説
main() の処理では、ロボットの動作、制御に必要な処理をオブジェクトの生成やタイマーによる処理として登録したあとは最後に ros::spin(); を呼び出して、以後の処理は ROS の制御下に渡してしまう。よって、通常のプログラムであるような、 main() の処理を最後まで実行したら終了するという形態になっていない。どこで何が実行されるのかわかりにくいかもしれないが早く慣れる。

main() で一通りの設定が終わったら最後に ros::spin(); に制御を渡して、以後は、すべてタイマーによる周期的な6.3. gazebo 上でプログラムによりモデルを動かす

21

Robot Integration
関数の呼び出しで処理が進んでいく。処理の中心になるのは、次に示す 3 個の関数で、それぞれが連携して、ロボットの動作が決まる。現在のサンプルプログラムは、単純な動きで 3 個の関節を周期的に動かしているだけであるが、後にセンサが使えるようになれば、センサからの情報でロボット周囲の状況を把握して、それに対して何らかの働きかけをするプログラムを作成する。
行動計画 AI の計算 intelligence()、モータ角度の検出 monitorJointState()、モータの目標角度の指示 timerCallback()
は、現在はすべて 1 秒に 100 回実行される。これらはすべてタイマーに登録されて、一定の時間間隔で実行されるようになっている。一般的な処理のイメージとしては、次の形に近い。
while (TRUE) {monitorJointState(); // モータの角度を調べてintelligence();// 次の行動（目標角度）を決めて
timerCallback();// モータに指示を送る
sleep();// 1 秒に 100 回になるように時間待ち}

ROS のプログラムとして書くと次のようになる。タイマーを使わずにこのようにも書ける。
ros::Rate rate(100); // 1 秒に 100 回になるように設定
while (ros::ok()) {monitorJointState(); // モータの角度を調べてintelligence();// 次の行動（目標角度）を決めて
timerCallback();// モータに指示を送る
ros::spinOnce();// ROS の処理を 1 回行う
rate.sleep();// 1 秒に 100 回になるように時間待ち}

ただし、実際の処理では 3 個の関数は同期しているわけではないので、順番に実行されることは保証されない。その後、ros::spin(); はマルチスレッドの実装に変更された。

6.5 モータの制御の仕方
モータの制御の仕方は３種類用意してあり、• シンプルな PID 制御の MODENONE 、• プロファイルにより細かく目標角度を決める MODEPROFILE 、• シンプルなプロファイルの MODEPROFILE2がある。
一般に、MODENONE は動きが速いが慣性で振られる動きが大きい。MODEPROFILE はゆっくり動くが、慣性で振られにくいという違いがある。MODEPROFILE2 はその中間で、プロファイルの前半は徐々に速度を上げ、後半は MODENONE と同じである。プログラム中の指定 (prog.cpp の 220 行付近) で３種類を一定の時間間隔で入れ替えて比較できるようにした。確認しておくとよい。使う時には関節毎に目的に合った制御を選べばよい。

22

第 6 章 Gazebo 上でのロボットモデルの作成

Robot Integration
プロファイルは、回転に要する時間 duration と、回転させたい角度から 1/100 秒毎の目標角度を計算により求めておいて、順次それを送信してゆっくりした動きを実現している。特に、動き始めと動き終わりの回転速度を遅くすることで、慣性による振れを少なくしている。duration は初期値としてある値になっているが、変更して構わない。ただし 10 秒を超えると現在はプロファイルの配列が不足する。対処は配列のサイズを大きくすればよい。また短い時間を指定すると、慣性で振られる動きが大きくなることが予想される。短時間で動かしたい場合はMODENONE を指定する方が良い場合があるかも。
ロボットの構造では、アーム、脚は合計で 6 本あり、1 本が多関節のアーム、残り 5 本が本体を支えるための脚となっている。アームの関節は根本から、水平、垂直、垂直、（X,Y,Z の 3 軸）、指の開閉の回転を実現している。

URDF ファイルに記述されている。
自分で作るロボットのモデルは URDF に従って、自分で記述する必要がある。その後、プログラムを作る時には、

intelligence() で 1/100 秒周期でその時々の関節の目標角度を設定してやれば、あとは残りの関数群が動かしてくれる。

6.6 20200622 追加分
カメラを使えるようにした。例として本体前方と手首に付けてある。必要であれば台数を増やすことができる。
カメラの機能は class ImageConverterにまとめられている。カメラを使えるようにするために、main() 中で以下のようにオブジェクトのインスタンスを定義している。
ImageConverter ic?();

この定義はカメラ 1 台につき 1 回必要になる。カメラの定義は URDF ファイルの中にあって、解像度や撮影間隔が定義されている。現在は 640x480 の解像度で、30frames/sec で撮影する。画像の取り込みや加工は ImageConverter
クラスのメンバ関数 imageCallback() で行われる。これはサブスクライバのコールバック関数として登録されていて、取り込んだ画像のメッセージが届くと、それにあわせて実行される。現在は取り込んだ画像と、その半分の大きさの画像を表示して、2 台のカメラの確認用で画像をファイル /tmp/cam?.ppm に 1 回記録している。この関数の呼び出しに合わせて画像処理の機能を追加すれば、ロボット周囲の状況を認識できる。
取り込んだ画像のサンプルを /tmp/cam1.ppm などとして記録する。
環境内の目印として、赤色の箱をロボット周囲に置いた。
ロボットは一部のリンクの長さや重さを現実に近くなるように URDF ファイル中で変更した。また慣性の影響を指定するパラメータ ( <inertial>内の <inertia> ) を標準的な値に近付けた。その結果挙動が一部変わった。
脚先となるリンクの摩擦係数を標準的な値に近づけた。

ros::spin() の処理を、4 個のスレッドで分散して処理するように変更した。
ここで公開しているサンプルプログラムは、Ubuntu 18.04, ROS Melodic で開発、動作確認しているため、Ubuntu
や ROS の version が異なると実行時の挙動が一部異なる場合がある。

6.6. 20200622 追加分

23

Robot Integration
ROS の version が kinetic の場合、起動時に指定するファイル名が異なる。この文書の前半部分の使い方の説明のところにも記したが、$ roslaunch mri prog_rv.launch.kinetic$ roslaunch mri prog_gz.launch.kinetic(kinetic の場合)
(kinetic の場合)となる。また、kinetic では以下の点が異なる。

• 半透明の色が指定できず、通常の色として表示される。
• カメラで取り込んだ画像の表示が途中で止まってしまい更新されない。
• カメラで取り込んだ画像をファイルに記録する際に失敗する場合がある。
これらの問題点を除けば、他の部分は問題なく動作した。kinetic での動作確認は古いノート PC で行ったため、PCの能力が不足することが原因となっていることも考えられるが確定できていない。

6.7 20200630 追加分
ROS の version が indigo の場合の動作確認をした。
起動時に指定するファイル名が異なり、次となる。indigo と kinetic は互換性がある。melodic から内容が変わる。
$ roslaunch mri prog_rv.launch.kinetic$ roslaunch mri prog_gz.launch.kinetic(indigo の場合)
(indigo の場合)

変更点

indigo, kinetic<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" /,→>melodic<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_,→publisher" />URDF ファイルの記述内容が kinetic 以降と異なるので、indigo 用の URDF ファイルを使用する。kinetic とmelodic は互換性がある。urdf/prog.urdf.indigo を urdf/prog.urdf に コピー してそれを読み込ませるようにする。
$ cd launch$ cp prog.urdf.indigo prog.urdf
変更点

indigo<hardwareInterface>EffortJointInterface</hardwareInterface>kinetic, melodic<hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface>

問題点

24

第 6 章 Gazebo 上でのロボットモデルの作成

Robot Integration• 半透明の色が指定できず、通常の色として表示される。
上記を除けば、他の部分は問題なく動作した。

kinetic ではカメラ画像の表示に問題があったが、indigo では表示できた。PC の性能に依存する可能性があるので、環境毎に結果は異なる可能性がある。
表示色については URDF ファイル中の色の指定で原色を指定すれば正しく表示される可能性が高い。

6.8 20201201 追加分
URDF の先頭部分を変更した。これまでは base_link (または world, world1 など、最初のリンク) と body を ﬂoatingで接続していたが、これはいくつかの問題となり、noetic ではうまく動かなかったので、調べた結果から、ﬁxed に変更した。この変更により問題がなくなった。また base_link に余計なパラメータを記述するのも良くないことがわかった。よって現在は下記の記述にしている。
<?xml version="1.0"?><robot name="mri"><gazebo><plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so"><robotNamespace>mri</robotNamespace></plugin></gazebo><link name="base_link"> </link><joint name="body_joint" type="fixed"><parent link="base_link"/><child link="body"/><origin xyz= "1 1 1" rpy="0 0 0" /></joint>

慣性の影響で物体が時間経過に伴って弾んだり、滑り出す現象について ixx などの値を 1 など大きな値にすると徐々に弾むようになった。値を 1e-3 など小さな値にするとすぐに滑るようになった。1e-1 -- 1e-2 程度にすると比較的安定する。
<inertial><origin xyz="0 0 0" rpy="0 0 0"/> <mass value="20"/><inertia ixx="5e-2" ixy="0" ixz="0" iyy="5e-2" iyz="0" izz="5e-2"/></inertial>

ROS noetic の rviz でスライダが自動で表示されなくなった現象について 以下にあるとおり、urdf, launch のどち
らかで 'use_gui' がなくなったせいのようだ。関連する設定を変更すれば直る見込み。

6.8. 20201201 追加分

25

Robot Integration[WARN] [1606815234.049128]: The 'use_gui' parameter was specified,
which is deprecated. We'll attempt to find and run the GUI,
but if this fails you should install the 'joint_state_publisher_gui'
package instead and run that.
This backwards compatibility option will be removed in Noetic.

6.9 20210111 追加分
環境内に sdf で記述した物体 (ladder.sdf) を出す方法、パッケージ名を pkg とする。
$ cd 使っているワークスペース/src/pkg$ mkdir sdf
ladder.sdf を sdf/ 内にコピーする。
$ vim launch/??????.launch

以下の記述例の後半部分のように追記する。
<?xml version="1.0"?><launch><include file="$(find gazebo_ros)/launch/empty_world.launch"><arg name="paused" value="false"/></include>中略<arg name="ladder" default="$(find mri)/sdf/ladder.sdf"/><param name="ladder_description" textfile="$(arg ladder)"/><node name="ladder_spawner" pkg="gazebo_ros" type="spawn_model"
args="-param ladder_description -sdf -x -2.5 -y 2.0 -z 0.0 -model ladder" /></launch>

起動の仕方は$ roslaunch pkg ??????.launchとなる。やっていることは、物体の sdf データを用意して、それを起動時に呼び出す指示を ?????? .launch の最後に３，４行追加している。

kinetic では画像を表示すると途中で更新が止まってしまうので、その機能は一旦コメントアウトした。他の version
では問題ないようだ。また kinetic 以前では色の表示に一部対応していなくて白くなるようだ。その他の機能は一通り動いているようだ。

./CMakelists.txt の先頭部分で、g++ のオプションの設定を有効にした。-std=c++11 これにより kinetic 以前で警告を表示しなくなった。

26

第 6 章 Gazebo 上でのロボットモデルの作成

Robot Integration
メッセージに従って Ubuntu を update したら、その後何回起動しても gazebo が動かなかった。ターミナルの再起動は効果がなかったが、Ubuntu を再起動したら直った。
アームが動いている途中で制御のモードを変更すると、タイミングによっては一部の動きが実行されずスルーされてしまう現象が確認された。よって制御のモードは変える必要がなければ固定しておく方が良い。

6.10 20210311 追加分
シンボリックリンクで ROS や Gazebo の version に依存するものとして以下があるので、version が異なる場合は適切な記述で設定し直す必要がある。
$ cd ~/WS/src/mri/$ cd launch/$ ls -l$ rm launch$ ln -s /opt/ros/noetic/share/gazebo_ros/launch$ cd ../worlds/$ ls -l$ rm camera.world empty_sky.world everything.world mud.world worlds$ ln -s /usr/share/gazebo-11/worlds/camera.world$ ln -s /usr/share/gazebo-11/worlds/empty_sky.world$ ln -s /usr/share/gazebo-11/worlds/everything.world$ ln -s /usr/share/gazebo-11/worlds/mud.world$ ln -s /usr/share/gazebo-11/worlds$ cd ../sdf/scripts/$ ls -l$ rm gazebo.material.org$ ln -s /usr/share/gazebo-11/media/materials/scripts/gazebo.material gazebo.material.
,→org$ cd ../textures/$ ls -l$ rm textures$ ln -s /usr/share/gazebo-11/media/materials/textures/

ROS noetic, gazebo 11 では URDF ファイル中で以下のような material の指定があると警告が出るようになったのでコメントアウトまたは削除した。
<link name="linkNN14"><visual><origin xyz="0 0.025 0" rpy="0 0 0"/><geometry> <box size="0.05 0.05 0.05"/> </geometry><!-<material name="blue"/> --></visual>

6.10. 20210311 追加分

27

Robot Integration
ROS noetic, gazebo 11 では SDF のモデルを環境中に配置するときに名前のチェックがしっかり行われるようになったので、同じ名前の物体モデルを２個以上配置できなくなった。同じ名前のものがあると、２個目以降が無視されて警告が表示される。melodic までは許されていた。名前が重複する場合に修正が必要なファイルは各モデルの model.conﬁg, model.sdf, sdfhead.sdf である。

28

第 6 章 Gazebo 上でのロボットモデルの作成

29

第7章

Flask
Flask は Python で記述されている、Web アプリケーションを開発するためのフレームワークである。Flask を利用
すると Web ブラウザから所定の URL でアクセスされた時に、その時点でコンテンツが動的に生成される。すなわ
ち、静的なコンテンツを表示するだけでなく、ユーザからの入力により実行時に動的に表示内容や動作を変更できるコンテンツ (Web アプリケーション) を制作できる。また Flask は Web サーバの機能も提供するので、プログラ
ムを作成すれば、すぐに Web ブラウザから動作を確認できる。
上記の特性を活用して、ロボットの動作を指示したり、状態を確認したり、センサで得た情報をユーザに提示する
シンプルな Web アプリケーションを制作して、ロボットのインタフェースとして利用する。
制作する Web アプリケーションは Web ブラウザさえあれば利用できるので、ロボットがインターネットに接続されていれば、どこからでも動作を制御できる。例えば、自宅からロボットを動かしたり、停止させたり、ロボットのカメラにより撮影された画像を見ることが可能になる。

Flask を利用するには Python, HTML の知識が必要となるので、それらについてわからない点があれば勉強、練習
しておこう。

7.1 環境の準備
Python3 がインストールされているか確認する。インストールされていれば version 番号が表示される。
$ python3 --version
Python 3.6.9

version 番号が表示されない場合は次のコマンドでインストールする。
$ sudo apt update$ sudo apt install python3

次に Flask をインストールする時に使用する pip3 がインストールされているか確認する。インストールされていれば version 番号が表示される。

Robot Integration$ pip3 --version
pip 9.0.1 from /usr/lib/python3/dist-packages (python 3.6)

version 番号が表示されない場合は次のコマンドでインストールする。
$ sudo apt install python3-pip

pip3 を使用して Flask をインストールする。
$ sudo pip3 install -U flask

7.2 起動と動作確認配布されたサンプルプログラムを適当なディレクトリに展開する。ディレクトリは次のような構成になっている。
flask--------------|
doc------------|
static---------|
templates-------

それぞれのディレクトリは次のようなファイルを含んでいる。static, templates の名前は固定なので変更できない。

doc

参考にしたドキュメントが置いてある。実行には関係ない。

static 静的なファイルが置いてある。画像など、実行時に変更されないファイルである。ここにあるファイルは実行時にアクセスすることができる。他のディレクトリにあるファイルはアクセスできない。

templates html のテンプレートファイルが置いてある。
ディレクトリ ﬂask 直下にある、app?.py が Flask のプログラムである。プログラムの名前は abc.py など、何でもよい。
次のコマンドで起動する。
$ python3 app1.py

正常に起動されると、次のようなメッセージが表示される。
* Serving Flask app "app1" (lazy loading)* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
(次のページに続く)

30

第 7 章 Flask

Robot Integration(前のページからの続き)* Debug mode: on* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)* Restarting with stat
* Debugger is active!
* Debugger PIN: 579-106-066

大事なのは http://127.0.0.1:5000/ で、この URL で接続できることを示している。このプログラムは Flask を実行している PC 内のアクセスのみ許可する設定になっているので、別の PC や端末からはまだアクセスできない。

Web ブラウザを起動して、URL として http://127.0.0.1:5000/ を指定すると Flask が生成する Web ページが表示される。app1.py はメッセージを表示するだけのシンプルなものなので、メッセージが１行表示される。URL によって表示を変えるようにしてあるので、http://127.0.0.1:5000/page2 にアクセスすると異なるメッセージが表示される。

Flask の実行を停止するときは、CTRL+C を入力する。

図 7.1 app1-top

7.2. 起動と動作確認

31

Robot Integration

図 7.2 app1-page2

7.3 Flask のプログラミング
では app1.py の記述内容を見てみよう。Flask の機能の詳細は参考資料に挙げてある様々な資料に記述されているので、それらを参照するとよい。ここでは最低限のプログラムで、Flask のプログラミングの基本要素を確認する。
リスト 7.1 app1.py
1from flask import Flask

2
3

app = Flask(__name__)

4
5
6
7
8

@app.route('/')
def hello():message = "Hello World."
return message

9
10
11
12
13

@app.route('/page2')
def good():message = "This is 2nd page."
return message

14
15
16

if __name__ == "__main__":app.run(debug=True)(次のページに続く)

32

第 7 章 Flask

Robot Integration(前のページからの続き)
17
18
19
20

## Usage:## http://127.0.0.1:5000/## http://127.0.0.1:5000/page2• 1 行目は、Flask のモジュールを読み込む指定である。定型、変更不要。
• 3 行目は、Flask 型のオブジェクトのインスタンスを生成する。定型、変更不要。
• 5 行目からは、指定された URL に固有の処理を関数として定義している。route('/') は

http://127.0.0.1:5000/に対応する。関数名は hello() で、処理ではメッセージを定義して return で返す。通常、Flasuk においてreturn で返す値は html 形式である。この例では簡単にするために単純な文字列にしている。
• 10 行目からは、別の URL route('/page2') の処理を定義している。http://127.0.0.1:5000/page2 に対応する。
• 15,16 行目は、モジュールではなく単独のアプリケーションとして起動された時の動作を定義している。定型、変更不要。

• 18 行目以降は、コメントで実行には影響しない。
Flask のプログラムの典型的な記述はこのようになる。一般的には、アクセスされた時の URL に応じて、固有の表示内容や動作を、プログラムによりその場で生成していると言える。この例では一定の文字列を出力するだけであったが、実用的なアプリケーションでは、Python の機能により、計算をしたり、より複雑な処理により表示する
内容を生成することになる。
データの入力、画像の表示、テンプレート機能などを含む、より複雑なプログラムの例が app7.py である。
$ python3 app7.py

このプログラムは別の PC や端末からのアクセスを許可しているので、Flask を実行している PC の IP アドレスがわかれば、同じネットワークに接続している他の端末からアクセスできる。IP アドレスは次のコマンドで確認できる。結果の表示は関係ない部分を一部省略している。結果に inet というエントリがあるので、その右が IP アドレスになる。無線 LAN ルータに接続している場合は、一般的に割り当てられるアドレスは 192.168.???.??? になる。
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen,→1000...
inet 127.0.0.1/8 scope host lo...
2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group,→default qlen 1000...
inet 192.168.10.11/24 brd 192.168.10.255 scope global dynamic noprefixroute enp2s0...
(次のページに続く)

7.3. Flask のプログラミング

33

Robot Integration(前のページからの続き)

3: wlp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group,→default qlen 1000...
inet 192.168.10.12/24 brd 192.168.10.255 scope global dynamic noprefixroute wlp1s0...

例として、Flask を実行している PC の IP アドレスが 192.168.10.11 だと仮定すると、同じネットワークに接続しているスマホなどの Web ブラウザから、 http://192.168.10.11:5000/ にアクセスすると Flask が生成するコンテン
ツを見ることができる。以下は app7.py により生成されたページである。

図 7.3 app7-top

app7.py が実現している機能は、参考資料などで調べて少しずつ理解、使えるようにしよう。
RasPi を使う場合には、同じことを RasPi 上で実現すれば RasPi とスマホなどで直接データのやり取りが可能になる。ロボット上で RasPi をコントローラとして使用する場合、ディスプレイ、キーボード、マウスなどは使えない

34

第 7 章 Flask

Robot Integration

図 7.4 app7-page2

ので、Flask による Web インタフェースを用意しておくと操作が楽になる。

Flask で得たデータを別のプログラムとやり取りする方法は後に取り上げる。

7.4 RasPi に接続した USB カメラの画像を Flask で扱う方法※ Python3 では OpenCV 関連のライブラリに問題があったので、この後の処理で Flask を動作させるのは旧バージョンの Python2 に変更する。それにより ROS と Flask を連携させて動かせるようになる。ROS が配信するカメ
ラ画像のメッセージを受信して Flask が生成する Web ページ上に表示できるようになる。画像以外のメッセージの送受信は今後対応する予定。
関連するファイルをまとめた ﬂask0713.tgz を展開して利用する。microSD の version 202007 では最初からインストールされている。

RasPi で ﬂask をインストールするには次のコマンドを実行する$ sudo apt install python-pip$ sudo pip install flask

RasPi に USB カメラを接続して、roscore, usbcam.launch を起動する。必要に応じて別のターミナルに切り替えてから起動する。

7.4. RasPi に接続した USB カメラの画像を Flask で扱う方法

35

Robot Integration$ roscore$ sudo roslaunch usbcam usbcam.launch

usbcam.launch はカメラにアクセスするので、一般ユーザでは権限がなくて失敗する。sudo を付けて試してみて、動作しないようなら管理者ユーザ ubuntu に変更して実行する。

RasPi 用に Flask のプログラム app10.py を一部変更する。
$ vim app10.py
34 行、画像の表示を無効にする（RasPi は GUI がないため）。
# cv2.imshow('image', img)
43 行、以下のように USB カメラを有効に、Gazebo のカメラを無効にする。
rsub = rospy.Subscriber("/uvc_camera/image_raw", Image, rcallback)# rsub = rospy.Subscriber("/prj3/camera1/image_raw", Image, rcallback)

変更後、プログラムを起動する。
$ python app10.py

ノート PC の Web ブラウザから RasPi にアクセスする。RasPi の IP アドレスを仮に 192.168.0.10 とする。次のURL を指定するとページが表示される。
http://192.168.0.10:5000/

submit ボタンを押すと画像が更新される。

7.5 Gazebo 上のロボットモデルが備えるカメラの画像を Flask で扱う方法
Gazebo が起動していれば roscore の起動は不要になる。
Gazebo 用に Flask のプログラム app10.py の内容を一部変更する。
$ vim app10.py
34 行、必要であれば画像の表示を有効にします。
cv2.imshow('image', img)
43 行、以下のように USB カメラを無効、Gazebo のカメラを有効にします。
# rsub = rospy.Subscriber("/uvc_camera/image_raw", Image, rcallback)rsub = rospy.Subscriber("/prj3/camera1/image_raw", Image, rcallback)Flask のプログラムを起動する。
$ python app10.py

Web ブラウザからアクセスする。Gazebo が動作している同一の PC からアクセスする場合は以下になる。

36

第 7 章 Flask

Robot Integration

図 7.5 usbcamera

http://127.0.0.1:5000/

別の PC 等からアクセスする場合は RasPi と同様の手順になる。submit ボタンを押すと画像が更新される。

7.5. Gazebo 上のロボットモデルが備えるカメラの画像を Flask で扱う方法

37

Robot Integration

図 7.6 gazebo-camera

38

第 7 章 Flask

39

第8章

参考資料

この講義で利用するハードウェア、ソフトウェアの各種の技術について、参考になる資料を公開しているサイトは数多くあるが、例えば以下のサイトがある。
それぞれの技術について、複数の資料を読み比べると平均的な使い方や全体像が見えてくる。一つの資料だけを参考にすると、偏った説明になっている場合があるので、なるべく多くの資料を比較、参照するのが望ましい。

8.1 Linux• https://linuc.org/textbooks/linux/• https://linuc.org/textbooks/admin/

8.2 ROS, Gazebo
本家• http://gazebosim.org/tutorials• http://wiki.ros.org/urdf• http://wiki.ros.org/xacro
その他• https://demura.net/education/lecture/15483.html• https://qiita.com/RyodoTanaka/items/c3014fd6d0f06d12814f• http://www.slideshare.net/akio19937/1rosrosgazebo• http://cir-kit.github.io/blog/categories/gazebo/

Robot Integration• http://qiita.com/MoriKen/items/613635b90f3a98042dc5

8.3 Flask
本家とその翻訳• https://ﬂask.palletsprojects.com/en/1.1.x/• https://msiz07-ﬂask-docs-ja.readthedocs.io/ja/latest/tutorial/index.html• https://a2c.bitbucket.io/ﬂask/
その他• https://qiita.com/nagataaaas/items/3116352da186df102d96• https://www.python.ambitious-engineer.com/archives/1630• https://paiza.jp/works/ﬂask/primer/beginner-ﬂask1/6404• https://blog.codecamp.jp/programming-python-ﬂask• https://qiita.com/ynakayama/items/2cc0b1d3cf1a2da612e4• https://qiita.com/zaburo/items/5091041a5afb2a7dffc8• https://answers.ros.org/question/234418/easiest-way-to-implement-http-server-that-can-send-ros-messages/• https://rostful.readthedocs.io/en/latest/readme_link.html• https://qiita.com/gsacademy_tokyo/items/16cba215a0cd921df87f

40

第 8 章 参考資料

41

第9章

Indices and tables• genindex• modindex• search