45
Robot Integration Yasunori NAGASAKA 2021 04 16

Robot Integration - chubu-univ

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Robot Integration - chubu-univ

Robot Integration

Yasunori NAGASAKA

2021年 04月 16日

Page 2: Robot Integration - chubu-univ
Page 3: Robot Integration - chubu-univ

i

Contents:

第 1章 はじめに 1

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

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

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

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

2.4 準備 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

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

2.6 開発環境 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

第 3章 日程 7

3.1 毎週の作業内容の記録 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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 その他 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

第 6章 Gazebo上でのロボットモデルの作成 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

Page 4: Robot Integration - chubu-univ

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

第 8章 参考資料 39

8.1 Linux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

8.2 ROS, Gazebo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

8.3 Flask . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

第 9章 Indices and tables 41

ii

Page 5: Robot Integration - chubu-univ

1

第 1章

はじめに

大学院の講義「ロボット・インテグレーション」では、ロボットを構成する様々なハードウェア、ソフトウェアの

技術を組み合わせて、ロボットをシステムとして構成する方法を学ぶ。

個々の技術については機械、電気、情報、制御などの各分野における永年の研究、開発成果の蓄積で文献や書籍が

数多くあるが、それらを組み合わせて一まとまりのロボットシステムとしてどう構成するかという点については文

献、書籍がまだない。よって教科書はない。

ROSが広く使われるようになったことで、システムとしてのロボットが注目されるようになり、共通の開発基盤

が整ってきた。ROSの使い方に関する書籍は増えてきたが、その上のレベルの汎用的なシステムとしてのロボッ

トの構成方法については、まだ発展途上で確立された理論がない先端の分野といえる。

よってこの科目では、キチンとまとめられた内容についての講義や輪講ではなく、代わりに複数の技術を組み合わ

せて実際に小さなロボットをシステムとして製作してみる。そこから、様々な技術の統合(インテグレーション)

について、経験を通して知見や気付きを得ることを目指す実践的な内容、実習を中心にして進める。

具体的な内容は、マイコンボード Raspberry Pi (以後 RasPiと表記), Ubuntu, ROS,その他デバイスを組み合わせて

ロボットを製作する。3人または4人でチームを構成して、メンバーで作業を分担、協力して 1台のロボットの製

作に取り組む。

Page 6: Robot Integration - chubu-univ
Page 7: Robot Integration - chubu-univ

3

第 2章

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

3人または4人でグループを構成して、グループ内のメンバーで作業を分担、協力して、1 台のロボットおよび

Gazeboシミュレータ上のロボットモデルを製作/制作する。最後の発表会では、ハードウェア、ソフトウェアの

ロボットが動作する様子のデモンストレーションを行う。また最後の成果物の提出では、ロボットが動く様子を撮

影した動画と、開発過程と結果をまとめたレポートを提出する。

2.1 ハードウェアについて

Raspberry Piと、いくつかのデバイスを配布するので、それらを組み合わせて、何らかの動作をする小さなロボッ

トを製作する。センサ、アクチュエータ、ROS,インターネット経由の入出力が使える。

2.1.1 使えるパーツ、ソフトウェア

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

• Raspberry Pi,電源

• サーボモータ

• デジタル入出力

• 音声出力、スピーカ

• 3軸加速度センサ

• AD変換

• USBカメラ

次のパーツは個数が限られているので希望があれば抽選で配布する。

• Leap Motion (1台)

Page 8: Robot Integration - chubu-univ

Robot Integration

サーボモータは、2個以上使いたい場合は申し出る。在庫に余裕がある範囲で提供する。

ここで示したデバイス以外に、個人所有のデバイスを使いたい場合は持ち込んで併用して構わない。

ハードウェアに関係する次のソフトウェアはすぐ使える状態で配布する。

• Ubuntu 18.04 server (Raspberry Pi用)

• ROS

• 各種デバイスを使うためのサンプルプログラム

• Flask, Webフレームワーク ( https://flask.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 章講義の進め方、取り上げる内容について

Page 9: Robot Integration - chubu-univ

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

Page 10: Robot Integration - chubu-univ

Robot Integration

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

続されるように設定されている。

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

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

Page 11: Robot Integration - chubu-univ

7

第 3章

日程

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

とめる、作業内容の記録

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

文献の調査とまとめ、製作、作業内容の記録

3週 製作、作業内容の記録

4週 製作、作業内容の記録

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

6週 製作、作業内容の記録

7週 製作、作業内容の記録

8週 製作、作業内容の記録

9週 製作、作業内容の記録

10週 製作、作業内容の記録、中間報告のレポート作成と提出

11週 製作、作業内容の記録

12週 製作、作業内容の記録

13週 製作、作業内容の記録

14週 製作、デモンストレーションとデモムービーの用意、レポート作成、作業内容の記録

15週 発表会、レポートに基づく発表、ロボットのデモンストレーションの披露、デモムービーとレポート提出、

作業内容の記録

Page 12: Robot Integration - chubu-univ

Robot Integration

3.1 毎週の作業内容の記録

リモートでの講義が多くあるため、各週の学習内容、製作作業の取組状況を記録を残す。90分×15回を満たす

ように、グループのメンバー1人ずつについて、日時、時間、各回に何に取り組んでどのような進展があったかを

記録して、中間報告、および最後のレポートに含める。「~~をやった。」という記述だけではなく、作成したモノ

の写真、作業中の画面をキャプチャした画像、作成したプログラムなどを一緒に記録すること。週によって作業の

進み具合がある程度異なるのはやむを得ないが、毎週少しずつでも進めるように取り組む。

8 第 3 章日程

Page 13: Robot Integration - chubu-univ

9

第 4章

文献検索について

文献検索については、

• ロボットインテグレーションの現状、すなわち、様々な技術を統合してロボットを構成するための元になる

考え方や理論

• 自分たちが製作するロボットに関連する過去の開発事例

を調査してみる。

インターネットやデータベースなどを使って、上記に関連する資料があるかどうかを調べる。もし参考になる良い

文献や資料が見つかったら PDFをダウンロードしておく。また、それらを読んでまとめたものを1回目の中間報

告の内容の一つとして含める。

検索するときは、インターネットでの検索は通常の検索に加えて、学術用の Google Scholarなど、データベースの

検索は図書館のページから、

中部大学附属三浦記念図書館

外部データベース

CiNii Articles (日本の論文)

Web of Science(海外の論文)

日経 BP記事検索サービス -> 日経 Robotics(ロボット関連の最新の記事)

などを利用するのがよい。他にも適切な調査手法があれば、それらも駆使してもらって構わない。

上記の 3個のデータベースは学外からの利用だと個人認証を求められるものがあるが、中部大学の IDが通るはず。

図書館の提供する外部データベースは、学内からなら様々なものが利用できるが、学外からの利用が可能で役に立

ちそうなものは意外と少なくそれ程ない。

データベースの検索ではキーワードの組み合わせを求められるが、その組み合わせによって結果が全く変わってく

るので、関係ありそうな様々なワードの組み合わせをなるべく多く試すと、望みの結果を得られる可能性が高く

なる。

Page 14: Robot Integration - chubu-univ
Page 15: Robot Integration - chubu-univ

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

$

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

Page 16: Robot Integration - chubu-univ

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である。場合によって起動の途中で

3分弱程度ネットワークの起動を待つ時間がかかることがあるが、そのうち進むので気長に待つ。

スピーカから「シャー」、「ジャー」という小さい音が聞こえれば動作中の証拠。周期的に大きめの音で「ガリガリ」

というのは、無線 LANのデバイスが定期的に接続を試みている証拠である。ガリガリが聞こえるときは Ubuntu

が動作している。ガリガリがうるさいときは、後述の方法で無線 LANを停止させてもよい。

起動処理の終盤で電源電圧と IPアドレスを音声でアナウンスする。IPアドレスは1回目が有線 LAN、2回目が

無線 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の設定と使い方

Page 17: Robot Integration - chubu-univ

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 // 無線 LANを有効にする

$ ifconfig eth0 down // 有線 LANを無効にする

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

ifconfigがインストールされていない場合は以下でインストールする。

$ sudo apt install net-tools

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

Page 18: Robot Integration - chubu-univ

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

↪→1000

link/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 [email protected]

最初は 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の設定と使い方

Page 19: Robot Integration - chubu-univ

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

$ ls

testall.cppが入出力の一通りの機能を確認するプログラムである。testall.cppのコンパイルの仕方はファイルの先

頭を見る。

$ head testall.cpp

$ g++ 指定されたオプションなど ...

$ sudo ./testall

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

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

• サーボモータ rs405.cpp

• 音声出力 speech.cpp

• AD変換  adc.cpp

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

Page 20: Robot Integration - chubu-univ

Robot Integration

• デジタル IO  io.cpp

5.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 その他

コマンド入力に対して稀にレスポンスが悪く、2,3秒から 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ピンコネクタ、サーボモータの4ピンコネクタは向きがあり、正しい向きでしか挿せない。コ

ネクタは小さな穴から端子が見える面と、白一色の面があるが、小さな穴が隠れない向きに挿す。

サーボモータ附属のサーボホーンには、他のものが固定できるようにネジを2個付けてある。

音量調整には、~/raspidemo/vol.shを使う。

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

Page 21: Robot Integration - chubu-univ

Robot Integration

モータの回転角度は、±150度まで、限界を超えると動かなくなることがあるので、使うときは ±120度程度に留

めておく。

音声出力は、Open JTalkでテキストデータからWAVファイルを生成し、WAVファイルを再生している。よって、

音楽のWAVファイルを用意すればそれを再生することもできる。

サーボモータの IDは 1に設定されている。複数個のサーボモータを使う場合は 2以上の IDを持つモータを追加

する。

OSを停止させた後でも、ACアダプタからの電源供給は続いているので、最後は基板上のスイッチで物理的に電

源を切断する。赤色 LEDが消えれば物理的に電源が切断されたことがわかる。

5.8. その他 17

Page 22: Robot Integration - chubu-univ
Page 23: Robot Integration - chubu-univ

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 等) は自分の環境に合わせて書き替える。

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

Page 24: Robot Integration - chubu-univ

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 上でのロボットモデルの作成

Page 25: Robot Integration - chubu-univ

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

Page 26: Robot Integration - chubu-univ

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 モータの制御の仕方

モータの制御の仕方は3種類用意してあり、

• シンプルな PID制御のMODENONE、

• プロファイルにより細かく目標角度を決めるMODEPROFILE、

• シンプルなプロファイルのMODEPROFILE2

がある。

一般に、MODENONEは動きが速いが慣性で振られる動きが大きい。MODEPROFILEはゆっくり動くが、慣性で

振られにくいという違いがある。MODEPROFILE2はその中間で、プロファイルの前半は徐々に速度を上げ、後

半は MODENONE と同じである。プログラム中の指定 (prog.cpp の 220 行付近) で3種類を一定の時間間隔で入

れ替えて比較できるようにした。確認しておくとよい。使う時には関節毎に目的に合った制御を選べばよい。

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

Page 27: Robot Integration - chubu-univ

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

Page 28: Robot Integration - chubu-univ

Robot Integration

ROSの versionが kineticの場合、起動時に指定するファイル名が異なる。この文書の前半部分の使い方の説明の

ところにも記したが、

$ roslaunch mri prog_rv.launch.kinetic (kinetic の場合)

$ roslaunch mri prog_gz.launch.kinetic (kinetic の場合)

となる。また、kineticでは以下の点が異なる。

• 半透明の色が指定できず、通常の色として表示される。

• カメラで取り込んだ画像の表示が途中で止まってしまい更新されない。

• カメラで取り込んだ画像をファイルに記録する際に失敗する場合がある。

これらの問題点を除けば、他の部分は問題なく動作した。kineticでの動作確認は古いノート PCで行ったため、PC

の能力が不足することが原因となっていることも考えられるが確定できていない。

6.7 20200630 追加分

ROSの versionが indigoの場合の動作確認をした。

起動時に指定するファイル名が異なり、次となる。indigoと kineticは互換性がある。melodicから内容が変わる。

$ roslaunch mri prog_rv.launch.kinetic (indigo の場合)

$ roslaunch mri prog_gz.launch.kinetic (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 上でのロボットモデルの作成

Page 29: Robot Integration - chubu-univ

Robot Integration

• 半透明の色が指定できず、通常の色として表示される。

上記を除けば、他の部分は問題なく動作した。

kinetic ではカメラ画像の表示に問題があったが、indigo では表示できた。PC の性能に依存する可能性があるの

で、環境毎に結果は異なる可能性がある。

表示色については URDFファイル中の色の指定で原色を指定すれば正しく表示される可能性が高い。

6.8 20201201 追加分

URDFの先頭部分を変更した。これまでは base_link (または world, world1など、最初のリンク)と bodyを floating

で接続していたが、これはいくつかの問題となり、noeticではうまく動かなかったので、調べた結果から、fixedに

変更した。この変更により問題がなくなった。また 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

Page 30: Robot Integration - chubu-univ

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の最後

に3,4行追加している。

kineticでは画像を表示すると途中で更新が止まってしまうので、その機能は一旦コメントアウトした。他の version

では問題ないようだ。また kinetic以前では色の表示に一部対応していなくて白くなるようだ。その他の機能は一

通り動いているようだ。

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

を表示しなくなった。

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

Page 31: Robot Integration - chubu-univ

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

Page 32: Robot Integration - chubu-univ

Robot Integration

ROS noetic, gazebo 11 では SDF のモデルを環境中に配置するときに名前のチェックがしっかり行われるように

なったので、同じ名前の物体モデルを2個以上配置できなくなった。同じ名前のものがあると、2個目以降が無視

されて警告が表示される。melodicまでは許されていた。名前が重複する場合に修正が必要なファイルは各モデル

の model.config, model.sdf, sdfhead.sdfである。

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

Page 33: Robot Integration - chubu-univ

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番号が表示される。

Page 34: Robot Integration - chubu-univ

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のテンプレートファイルが置いてある。

ディレクトリ flask直下にある、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

Page 35: Robot Integration - chubu-univ

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 はメッセージを表示するだけのシンプルなものなので、メッセージが1行表示される。URL に

よって表示を変えるようにしてあるので、http://127.0.0.1:5000/page2 にアクセスすると異なるメッセージが表示

される。

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

図 7.1 app1-top

7.2. 起動と動作確認 31

Page 36: Robot Integration - chubu-univ

Robot Integration

図 7.2 app1-page2

7.3 Flask のプログラミング

では app1.pyの記述内容を見てみよう。Flaskの機能の詳細は参考資料に挙げてある様々な資料に記述されている

ので、それらを参照するとよい。ここでは最低限のプログラムで、Flaskのプログラミングの基本要素を確認する。

リスト 7.1 app1.py

1 from flask import Flask

2

3 app = Flask(__name__)

4

5 @app.route('/')

6 def hello():

7 message = "Hello World."

8 return message

9

10 @app.route('/page2')

11 def good():

12 message = "This is 2nd page."

13 return message

14

15 if __name__ == "__main__":

16 app.run(debug=True)

(次のページに続く)

32 第 7 章 Flask

Page 37: Robot Integration - chubu-univ

Robot Integration

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

17

18 ## Usage:

19 ## http://127.0.0.1:5000/

20 ## 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

Page 38: Robot Integration - chubu-univ

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

Page 39: Robot Integration - chubu-univ

Robot Integration

図 7.4 app7-page2

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

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

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

※ Python3では OpenCV関連のライブラリに問題があったので、この後の処理で Flaskを動作させるのは旧バー

ジョンの Python2に変更する。それにより ROSと Flaskを連携させて動かせるようになる。ROSが配信するカメ

ラ画像のメッセージを受信して Flaskが生成するWebページ上に表示できるようになる。画像以外のメッセージ

の送受信は今後対応する予定。

関連するファイルをまとめた flask0713.tgzを展開して利用する。microSDの version 202007では最初からインス

トールされている。

RasPiで flaskをインストールするには次のコマンドを実行する

$ sudo apt install python-pip

$ sudo pip install flask

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

から起動する。

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

Page 40: Robot Integration - chubu-univ

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

Page 41: Robot Integration - chubu-univ

Robot Integration

図 7.5 usbcamera

http://127.0.0.1:5000/

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

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

Page 42: Robot Integration - chubu-univ

Robot Integration

図 7.6 gazebo-camera

38 第 7 章 Flask

Page 43: Robot Integration - chubu-univ

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/

Page 44: Robot Integration - chubu-univ

Robot Integration

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

8.3 Flask

本家とその翻訳

• https://flask.palletsprojects.com/en/1.1.x/

• https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/tutorial/index.html

• https://a2c.bitbucket.io/flask/

その他

• https://qiita.com/nagataaaas/items/3116352da186df102d96

• https://www.python.ambitious-engineer.com/archives/1630

• https://paiza.jp/works/flask/primer/beginner-flask1/6404

• https://blog.codecamp.jp/programming-python-flask

• 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 章参考資料

Page 45: Robot Integration - chubu-univ

41

第 9章

Indices and tables

• genindex

• modindex

• search