| 名称 | MIRS2302 ソフトウェア詳細設計書 | 
|---|---|
| 番号 | MIRS2302-SOFT-0002 | 
| 版数 | 最終更新日 | 作成 | 承認 | 改訂記事 | 
|---|---|---|---|---|
| B01 | 2024.02.16 | 山本 凜久, 眞辺 開 | 初版 | |
| B02 | 2024.02.16 | 山本 凜久, 眞辺 開 | 香川 | 図表番号の修正 | 
本ドキュメントはMIRS2302に関するソフトウェア詳細設計についてまとめたものである。
実装する機能とその概要を以下table1に示す。
table1.機能と概要
| 機能 | 機能概要 | 記述言語 | 
|---|---|---|
| 自律走行機能 | ROSのnavigation stackを用いて自己位置推定・経路設定・速度制御を行う | ROS melodic, python, C, C++ | 
| Webアプリケーション | フロントエンドユーザが 各自のスマホ / iPad のformにて 手配(送る・受け取る・注文する) / PINコードの入力 を行う iPadで ロボットの状態 / ユーザ向けの情報 を表示する バックエンドオーダー情報を管理する オーダーが重複しないように手配formの選択肢を制限する ユーザにロボットの状態に応じたメールを送信する | html, JavaScript, css, php, python | 
| セキュリティ機能 | PINコードで本人確認を行う モジュールの取り外しを検知する 扉のこじ開けを検知する 異常が検知された際に管理者にメールを送信する | python, arduino言語 | 
| モジュール管理機能 | 接続されているモジュールの識別を行う 指定の扉を自動で解錠する 保冷・保温モジュール内の温度調整を行う | python, arduino言語 | 
以下にarduino内のモジュール構成図と動作概要を示す。
 
    fig1. arduino - モジュール構成図
table2. arduino - モジュール動作概要
| モジュール名 | 動作概要 | 
|---|---|
| main.ino | setup関数およびloop関数の定義 | 
| serial.ino | Arduino-Raspi間の情報交換をシリアル通信で行う | 
| run_ctrl.ino | モータのエンコーダ値を読み取る モータにかける電圧を制御する | 
| module_mng.ino | モジュールに付いている抵抗両端の電圧を読み取る サーボモータをPWMで制御する サーミスタからモジュール内部の温度を取得する 取得した温度をもとにペルチェ素子にかける電圧を制御する | 
| param.h | ゲインやパラメータ、入出力ピンなどの定義 | 
以下にraspberry pi内のモジュール構成図と動作概要を示す。
 
    fig2. raspberry pi - モジュール構成図
table3. raspberry pi - モジュール動作概要(メイン駆動部)
| モジュール名 | 動作概要 | 
|---|---|
| main.py | メイン制御モジュール | 
| serial_com.py | raspi-arduino間の情報交換をシリアル通信で行う | 
| run_ctrl.ino | モータのエンコーダ値を読み取る モータにかける電圧を制御する | 
| ros_to_arduino.py | rosのデータをシリアル通信でarduinoに送信する | 
| raspi_to_ros.py | raspiのデータをソケット通信でrosに送信する | 
| run_ctrl.py | arduinoにモータ動作に関する指令値を送信する | 
| order_mng.py | オーダー情報の書き込み、読み込みを行う | 
| module_mng.py | arduinoから受け取った情報をもとにモジュールを識別する 搭載モジュール情報を更新し続ける 指定の扉を解錠する モジュールの取り外しを検知する 扉のこじ開けを検知する | 
| sock.py | ソケット通信を行う | 
| web_app.py | ユーザ・管理者へメールを送信する | 
| config.py | IPやパラメータが定義されている | 
| robot_state_publisher.py | ロボットのステータスを更新する | 
table4. raspberry pi - モジュール動作概要(webアプリバックエンド)
| モジュール名 | 動作概要 | 
|---|---|
| authentication.py | PINコードの照合を行う | 
| confirm.py | PINコードで認証を行う | 
| select_option_api.py | オーダー情報をもとに手配formの選択肢を制限する | 
| get_timetable.py | 予約状況のタイムテーブルを取得する | 
実装にあたり必要な情報をMIRS2302-REPT-0007-MIRS機体におけるROSを用いた自律走行より抜粋した。
navigation stackにおいて用いるトピックのうち、主要なものを次に示す。
table5. navigation stackの主要トピック
| トピック名 | 内容 | メッセージ肩 | 
|---|---|---|
| /odom | エンコーダの値を積分したりsinしたりcosしたりして、求められたロボットの位置情報 並進/回転方向の位置/速度を含む | nav_msgs/Odometry | 
| /cmd_vel | ロボット速度の指令値 並進方向と回転方向を含む | geometry_msgs/Twist | 
| /scan | LiDARの測距データ | sensor_msgs/LaserScan | 
| /map | ROS用のマップデータ(8bitグレースケール)を画像として配信 | nav_msgs/OccupancyGrid | 
| /move_base_simple/goal | 自動走行の目的地 位置と方向を含む | geometry_msgs/PoseStamped | 
| /move_base/status | 自動走行のステータス(走行中/完了/失敗など) | actionlib_msgs/GoalStatus | 
実装すべきノードを、処理の順番にしたがって示す。
    Subscribe : なし
    Publish : /odomトピック
    ロボットのタイヤの偏角(エンコーダ値)を取得して、ロボットの座標へと変換する。
    基本的にはArduinoとのシリアル通信でエンコーダ値を取得するが、TENQにおいてはエンコーダ信号をGPIOに入力し、C言語でこれを計算する。
    Subscribe : なし
    Publish : /scanトピック
    LiDARの測距データを配信する。基本的には、LiDARのメーカや有志によりROS用パッケージが配布されているため、それを使用する。
    TENQで使用するRPLiDAR用ノードは、次のgithubリポジトリからcloneする。
    https://github.com/Slamtec/rplidar_ros
    Subscribe : /odom /map /scan トピック
    Publish : map座標系からodom座標系へのtf
    odomトピックによる自己位置には、外乱やスリップによる誤差が生じる。また、この誤差は走行を続けるに連れて誇大化していく。
    これを修正するため、LiDARの測距データとマップとを照らし合わせて、より正確な自己位置を推測し、提供するのがAMCLである。
    Subscribe : 位置情報に関する諸々
    Publish : /cmd_velトピック
    AMCLによって提供された現在位置から、目的地までのルートを決定する。また、障害物がある場合にはこれを避けるルートを提供する。
    ルートに基づきロボットの速度を決定し、これをpublishする。
    Subscribe : /cmd_velトピック
    Publish : なし
    cmd_velトピックは、ロボットの並進方向速度および回転方向速度を司令する。
    これを左右モータの速度に変換し、信号をArduinoないしモータドライバに送信する。
    基本的には、(1)で行った変換の逆を行えばよい。
以下にwebアプリに関するモジュール構成図と動作概要を示す。
 
    fig4. webアプリ - モジュール構成図(全体)
 
    fig5. webアプリ - モジュール構成図(main/)
 
    fig6. webアプリ - モジュール構成図(about/)
 
    fig7. webアプリ - モジュール構成図(send/)
 
    fig8. webアプリ - モジュール構成図(receive/)
 
    fig9. webアプリ - モジュール構成図(order/)
 
    fig10. webアプリ - モジュール構成図(table/)
 
    fig11. webアプリ - モジュール構成図(ipad/)
table6. webアプリ - モジュール動作概要(ディレクトリごと)
| ディレクトリ名 | 動作概要 | 
|---|---|
| main/ | 各種メニューに遷移するボタンを配置したトップページ ページ読み込み時に営業情報を問い合わせ、営業時間外もしくは予約がいっぱいの場合は専用ページに飛ばす | 
| about/ | 案内用ページ TENQについての説明、利用方法、問い合わせformなどのリンクを記載する | 
| send/ | 「荷物を送る」手配をするための入力フォーム | 
| send/accept/ | 「荷物を送る」手配の承認用ページ | 
| receive/ | 「荷物を受け取る」手配をするための入力フォーム | 
| receive/accept/ | 「荷物を受け取る」手配の承認用ページ | 
| order/ | 「商品を注文する」手配をするための入力フォーム | 
| order/accept/ | 「商品を注文する」手配の承認用ページ | 
| table/ | 予約状況のタイムテーブルを作成する | 
| ipad/ | 本体上部に設置されているipadの専用ページ ロボットの現在の状態を取得して表示、またユーザが本人確認を行うページを表示する | 
全体のフローチャートを以下に示す。
 
    fig12.全体のフローチャート
モジュール認識のフローチャートを以下に示す。
 
    fig13.モジュール認識のフローチャート
配達手配の成立条件のフローチャートを以下に示す。
 
    fig14.配達手配の成立条件のフローチャート
走行のフローチャートを以下に示す。
 
    fig15.走行のフローチャート
集荷のフローチャートを以下に示す。
 
    fig16.集荷のフローチャート
購入を予定している物品を以下に示す。
table7.購入物品
| 物品名 | 型番 | 単価(税込) | 数量 | 価格(税込) | 備考 | 
|---|---|---|---|---|---|
| 2D LiDAR | RPLiDAR S2M1 | 1 | 
MIRS2302の別パートの詳細設計書へのリンクを以下に示す。
MIRS2302 メカニクス詳細設計書