2. ClimbLabのシミュレーションフロー
本章では,ClimbLabでおこなわれているシミュレーションの流れについて説明する.
MATLABは,実行するメインファイルが一つあり,そのメインファイルの中で,検索パスが通っているフォルダ内にあるいくつもの関数ファイルを呼び出すことで複雑な演算を行う.ClimbLabはフォルダ/climblab/src
下にあるmain_sim.m
というメインファイルを実行することで機能し,フォルダ../climblab/
下に置かれている関数ファイルを呼び出してシミュレーションを行う.
ClimbLab内で用いられている関数ファイルには大きく2種類ある.1つ目は,脚型ロボットに限らず一般的なロボティクスのダイナミクス計算をおこなうことができるSpaceDynという一連の関数群である.本研究室で開発されたこのSpaceDynというMATLABツールボックスは,1999年からオープンソースとして公開されており,現在でもGitHubから利用することができる.このSpaceDynもClimbLabのフォルダ下に収容され,ClimbLabに活用されている.ClimbLab内で用いられている2つ目の関数ファイルは,脚型ロボットの歩行シミュレーションのために新たに開発されてきた関数群であり,これらはシミュレーションの構成上さらに5つの種類に分類されている.それぞれ,Configuration関数・Initialize関数・Update関数・Visualize関数・Save関数と命名されている.
本章では,まずmain_sim.m
の構造について説明する.続いて,その中で用いられているMATLAB classという構造体について述べる.そして,ダイナミクス計算のためのMATLABツールボックスであるSpaceDynがClimbLab内でどう利用されているかについて述べる.最後に,ClimbLabのために開発された5種類の関数群についてそれぞれの役割を種類ごとに説明する.
2.1. Overview of main function: main_sim.m
ClimbLabのシミュレーションの構成について述べるために,そもそもコンピュータを用いておこなわれる全ての数値シミュレーションの仕組みについて説明する.現実世界の現象で時間は連続的であり,全ての変数が連続時間のもとに変化する.しかしコンピュータ上の計算処理では連続時間上の現象をそのままシミュレーションで再現することはできない.時間を細かい幅に区切りその間の変化を積算していくという離散時間的な繰り返し計算によって,連続時間の現象を再現する.つまり,ある時刻tの状態にもとづき,そこから刻み時間Δt 移った時刻t+Δt の状態を計算する.次に,その求めたt+Δt の状態からt+2Δt の状態を求めるという処理を繰り返しループさせる.
以上のシミュレーションについての基礎を踏まえた上で,ClimbLabの構成について説明する.ClimbLabのメインファイルmain_sim.m
のフローチャートを次の図に示す.
まずConfiguration関数で各種設定を読み込み,これからおこなうシミュレーションの設定をおこなう.この処理により,どんなロボット・地形・環境・経路計画・歩容計画・運動計画・制御手法を適用するかが決定される.次に,Initialize関数により,シミュレーションループを開始するために必要な全ての変数を用意し,それらの変数に対して初期状態を設定する.厳密には,メインループのシミュレーションが時刻0秒から始まるため,Initialize関数では時刻0 - Δt 秒の状態が設定されるイメージである.Initialize関数によって初期状態が設定されたため,その状態を起点としてタイムステップΔt 秒毎に離散的に時間を進めて計算し,各変数の値を更新(Update)していくことで,歩行シミュレーションをすすめることができる.メインループ内では計算処理に加えて,シミュレーションが進んでいる様子を確認するために,Visualize関数によってその時のロボットの状態などを画面上に表示させる.そして,各タイムステップにおいて,シミュレーションの終了条件を満たしているかを確認する.シミュレーションは,以下の条件:
- 設定した終了時刻になるまでシミュレーション時間が進む.
- 設定した目的地点にロボットが到達する.
- ロボットが転倒や滑落などを引き起こして歩行の継続が不可能となる.
- ロボットの関節角度が上下限に達するか特異姿勢に陥る.
のいずれかを満たした場合,メインループを終了する.メインループ終了後,指定した変数のシミュレーション中の時間履歴をプロットする.また,後でシミュレーションの結果の解析をするために,Save関数によって,内部で更新されていった各変数の時間履歴や初期設定,歩行している様子の動画をコンピュータに自動で保存する.
以上がmain_sim.m
の構造である.
2.2. MATLAB class
上述したようにClimbLab内では様々な関数が使用されているが,それらの関数の入出力に頻繁に用いられているclassという概念について説明する.classとはMATLABにおけるデータ構造の一つである.様々な活用方法があるが,ClimbLabにおけるclassの使用意義は,ある共通の目的に使われる数値や文字・ベクトルなどの多様な変数をひとくくりにしてまとめることにある.こうすることで,MATLABワークスペース内で扱われる大量の変数をある程度見やすく理解しやすい形態にまとめることができ,またプログラミング作業を単純化することができる.ClimbLab内で使用されているclassとclass内に格納している変数の“くくり”を以下に列挙する.
LP
: リンクパラメータ(SpaceDyn)SV
: 状態変数(State Variables, SpaceDyn)des_SV
: 目標状態変数(Desired State Variables, SpaceDyn)robot_param
: 使用するロボットタイプとその初期配置environment_param
: シミュレーション環境surface_param
: 歩行させる地表gait_planning_param
: 歩容計画(gait planning)motion_planning_param
: 運動計画contorl_param
: 制御equibilium_param
: 姿勢の安定性評価ani_settings
: シミュレーション中の動画の描画plot_settings
: シミュレーション後に描画する結果図save_settings
: シミュレーションの履歴の保存sensing_camera_param
: 地形センシングgripper_param
: 把持候補点検出で使うグリッパmap_param
: 把持候補点検出におけるマップへの処理matching_settings
: 把持候補点検出手法の設定variables_saved
:シミュレーション内の変数履歴
“オブジェクト指向プログラミング”というような難解な語を用いずClimbLabにおけるclassの役割を日常生活を例にして説明すると,家の中にある様々な生活用品をそのまま全部床に置くのではなく,食器棚・衣装ケース・筆箱などに整理して入れる様子に例えられる.家の中には様々なものがあるが,食器棚に入っているものは例えどんな形状や材質であれ食事に関係するものである.それと同じように,robot_param
というclassに収容されている変数はどんなものであれロボットに関係したものであり,environment_param
に収容されている変数はロボットとは関係なく環境に関係するものである.
こうした様々なclassを入出力に用いてClimbLab内の関数は実行されている.
2.3. SpaceDyn
ClimbLab内で用いられている関数群の一つであるSpaceDyn(スペースダイン)について説明する.その具体的な意義や詳細については,これまで発表された文献で詳説されているため,本節ではSpaceDynのClimbLabにおける役割に焦点を絞り簡単に述べる.
SpaceDynとは,微小重力空間(Space)を含む様々な環境でのロボットシステムの運動や力学解析がおこなえるMATLABのツールボックスであり,ClimbLab内ではフォルダ/climblab/lib/spacedyn
以下に全ての関数が保存されている.DynはDynamicsを表す.ロボットの機構・力学・制御に関わる基本的な関数群が収容されており,様々なロボットのシミュレーションをおこなうことができる.
SpaceDynの関数で用いられている重要なclassとしてまず以下の2つがある.
-
LP
: Link Parameters リンクパラメータ ロボットの具体的な機構を表すパラメータを収容しており,時間的に不変である -
SV
: State Variables 状態変数 ロボットのその時刻での状態(位置・速度・関節角度etc)を表す変数を収容しており,各時間毎に更新される
LPというclassで定義されたロボットに対して,ロボティクスの教科書に載っているような座標変換・順運動学・順動力学を適用し,その時刻での状態値SVを得る,という流れである.またロボットの運動計画や制御をするためにSpaceDyn内で用いられている重要なclassがもう1つある.
des_SV
: desired state variables 目標状態変数 ロボットが次に目指す目標値を収容しており,この値を目指して運動・制御をおこなう
ロボットに関するシミュレーションの前提として,「目指したい“状態”があり,その状態と現在の状態を常に比較しながら制御することで,目指すべき“状態”に近づけ動作を実現する」ことが目的である.この“次の目指すべき状態”がdes_SVである.
主にこれら3つのclassを用いることで,ロボットの機構の定義や基本的な力学・制御・運動計画の計算をおこなっている. ClimbLabでは,以下の3つの処理をSpaceDynの関数でおこなっている.
- ロボットの機構をLPを使って定義する.
- ロボットの状態変数をSV,des_SVを使って定義する.
- 基本的なロボティクスの計算や,ダイナミクス計算をSpaceDyn内の関数でおこなう.
脚型ロボットの歩容に特化した計算処理は,ClimbLabのために新たに開発された関数群を用いておこなわれているが,ロボティクスのシミュレーションツールとして土台となる領域にSpaceDynを用いている.
また,ロボティクスに関わる重要な項目として座標系の取り扱いが挙げられる.SpaceDynを用いたClimbLabにおける座標系の扱いと,その注意点について述べる.
SpaceDynでは重力を他の外力と区別せず,特別視しない.よって,SpaceDynを活用しているClimbLabにおいても,重力ベクトルはただの外力として取り扱う.これにより計算処理を簡潔にすることができる.
例えば,傾斜角αを持つ傾いた地面を脚型ロボットが登攀している様子をシミュレーションするとき,慣性座標系Σ~I~ (z軸負方向と重力が同じ向きの座標)で計算しようとすると,ロボットの運動や地形情報に関する全ての座標系を地面の傾きに合わせてその都度回転させる必要があり,計算の処理量が多くなる.この問題は,重力を特別視し,Σ~I~のz軸の負の方向に重力ベクトルを合わせようとするために発生する.計算する座標系を慣性座標系ではなく,傾いた地面に固定された地面座標系Σ~g~(ground)とし,重力を外力として角度α傾けてロボットに作用するものとして計算すると計算負荷は軽くなる.すなわち計算上ロボットは,傾斜を持った坂ではなく平地を歩行しており,そこに地面真下方向から傾いた向きに外力(重力)がかかっていると考える.その後,動画を描画する時だけ,つじつま合わせとして描画を回転させて傾斜や壁を登っているように表示しているのである.
この考え方は,2.5節で述べるini_environment.m
での重力ベクトルの定義や2.6節で述べるVisualize関数での傾きの取り扱いに関係している.ロボティクスにおいては,扱う変数やベクトルがどの座標系で表記されたものなのか常に注意する必要があるため,慣性座標系と地面座標系・ロボットベース座標系を意識して区別する必要がある.
2.4. Configuration Functions
ここからは,ClimbLabのために当研究グループで新たに開発された関数群について,それぞれ分けて説明する.
まず初めに実行される関数群であるConfiguration関数について述べる.Configuration関数とは,シミュレーションの条件の設定・構築をおこなう関数群であり,フォルダ/climblab/config
以下に置かれる接頭辞がconfig_
で始まる関数の総称である.ClimbLabは多種多様な環境・ロボット・歩容のシミュレーションが1つのmainファイルで実行可能なシミュレーションプラットフォームであるため,どんなシミュレーションをおこなうのかユーザーや開発者が細かく設定する必要がある.
しかし新しいシミュレーションをする度に,その都度全ての変数を設定するのは非常に煩雑である.そこで,まずは自動で全ての変数を読み込んでデフォルトとして設定し,その後,ユーザーが望むシミュレーションをおこなえるように,変更したい変数についてだけ設定された変数の中身を上書きするという2段階の手法を採用している.そのため,Configuration関数には大きく2種類あり,自動で読み込むために存在する関数と,その後指定したい内容に値を上書きする関数がある.
以下,Config関数の具体的な構成を述べる.まずmain_sim
内で,Configurationを設定する関数のおおもととして
config\_simulation.m
が実行される.この関数の中で上記の二段階式のconfig設定がおこなわれる.まず,第一段階として
config\_all\_default\_param.m
によって,初期の環境構築のために必要な全てのclassとその中身の変数がデフォルトとして設定される.config_all_default_param.mは,その内部で,config/default
以下に存在する各classを定義する以下のConfig関数群を実行する.
config_robot_param.m
config_environment_param.m
config_gait_planning_param.m
config_control_param.m
config_equilibrium_param.m
config_animation_settings.m
config_save_settings.m
config_plot_settings.m
config_target_detection_param.m
: このファイルのみフォルダ/climblab/lib/target_detection
下に置かれているconfig_sensing_camera_param.m
各関数名は,その関数で読み込まれるclassの名前と直接リンクしている.
その後,config_simulation.m
にて第二段階として,main_sim
内で記述して指定したconfigに応じて,各変数の上書き処理がおこなわれる.configの設定を"default"
にすると,変数の上書きが一切おこなわれず,自動的に設定された変数を用いてシミュレーションが開始する.設定を"USER"
すると,フォルダ/climblab/config/USER
下にある
config_USER_param.m
を参照して変数の上書きをおこなう.そのため,defaultから変更したい変数や設定がある場合は,その設定だけconfig_USER_param.m
内で同名の変数として新たに記述してやればよい.
default
とUSER
以外のconfig設定として,フォルダ/climblab/config/preset
下にいくつかConfig関数が作成されている.これらの関数はデフォルトとは異なるが半永久的に参考とされるフォーマットである.すなわち,default以外の基本的なClimbLabによるシミュレーション例や,またこれまでに本研究チームが投稿した論文・学会発表での結果を再現するために作成されて保管されているシミュレーション設定である.
2.5. Initialize Functions
Configuration関数によって環境構築のために必要なclassと変数が設定されたあとは,シミュレーションループの開始に向けてt=0の時の初期状態を明確に指定する必要がある.この役割を担っているのがInitialize関数であり,接頭辞ini_
で始まる関数である.Initialize関数群は,フォルダ/climblab/src
下に,該当する処理毎にフォルダを分けてUpdate関数などとともに置かれている.Initialize関数により,Config関数で指定された各パラメータから,実際にシミュレーション内で必要となる全変数を設定し,それぞれのclassへと格納する.
Initialize関数の役割を,main_sim
内で実行される順番に簡単に説明する.
まず冒頭で実行されるini_path.m
は,特殊なinitialize関数で,パスとよばれるMATLABの検索範囲にmain_sim
を実行するために必要なClimbLabの内部フォルダを追加する.またmain_sim
を実行する際のMATLAB内でのフォルダ場所が違う場合は,実行場所が間違ってる旨の警告を出す.ファイルはフォルダ/climblab/src
下に置かれている.
次に,フォルダ/climblab/src/environment
下に置かれている以下の関数が実行され,シミュレーション環境と地形が設定される.
ini_environment.m
設定された地形傾斜αから地面座標系における重力ベクトルの向きを定義する.また刻み時間を設定する.ini_surface.m
フォルダ/climblab/src/environmentに置かれている地形データの中から,configで指定された地形情報をxyzのグリッド形式で読み込む.ini_graspable_points.m
xyzのグリッド形式から3×N行列の点群形式に変換し,その中から把持対象とする点群を選定する.
ここで,地形として不整地を設定する場合には,ini_graspable_points.m
内にて把持可能点検出アルゴリズムを実行することで地形内の把持可能点を選出することができる.把持可能点検出アルゴリズムはフォルダ/climblab/lib/target_detection
下に全ての関数が収容されている.
次に,ロボットモデルに関わるInitialize関数の大元として,ini_robot.m
が実行される.ini_robot.m
により,シミュレーションで用いるロボットのリンクパラメータ(LP)と状態変数(SV)を定義し,またConfig関数で指定された初期ベース位置や高さ・xy方向の脚先の幅をもとに地形上にロボットの初期配置をおこなう.
ini_robot.m
の内部では次のInitialize関数が実行される.
ini_(ロボットタイプの名前)_LP.m
Config関数で指定されたロボットモデルを読み込んでLPを定義する.ini_12DOF_SV.m
12自由度を持つロボットの状態変数を初期定義(変数を用意)する.ini_joint_angle.m
ロボットの初期脚先幅から,脚先にもっとも近い把持点を見つけ出し,そこが逆運動学的に可動範囲内であれば脚先位置をそこに設定し,逆運動学で求めた関節角度に関節角度を設定する.ini_reachable_area.m
初期設置したロボットの脚先可動範囲を設定する.
次に,未知環境探査を模擬する場合には,ini_sensed_graspable_points.m
により,配置したロボットモデルの周囲の把持点を既知とするように変更する.そして,ini_gait.m
により,歩容に関わるパラメータとして,4脚支持期や遊脚期の時間をconfigで指定された値から計算して設定する.そして,大局的経路計画(Global Path Planning)を用いる場合には,その初期設定として以下の2つの関数が実行される.
ini_obstacle_map.m
把持可能点位置情報を収容するグリッドマップを定義する.ini_global_path_plan.m
大局的経路を初期設定する.
最後に,描画や保存に関するInitialize関数群として,
ini_id.m
シミュレーション結果のデータをdatフォルダに保存する際のフォルダ名を設定する.ini_video\_file.m
シミュレーション動画の保存設定をおこなう.
が実行され,全ての初期設定が完了する.
2.6. Update Functions
上記の処理により初期設定が完了したため,ループによってシミュレーションをすすめることができる.
Update関数とは,そのシミュレーションループ内で実行される関数群であり,処理によって各変数の中身をタイムステップ毎に更新する接頭辞upd_
で始まる関数である.Initialize関数群と同様,フォルダ/climblab/src
下に,該当する機能毎にフォルダを分けて置かれている.Update関数の役割の一例としては,そのタイムステップにおける脚先位置や関節角度を計算して求め,求めた値への変数の更新をおこなうなどが挙げられる.Update関数の総数は40を超えるため,ここでは各関数の詳細な記述は割愛し,main_simのループ内部で直接呼び出されて実行されている大元の関数についてのみ説明するにとどめ,ClimbLabの各処理の概要をさらう.
Sensing
まず,ロボットが未知環境を移動している状況を想定したシミュレーションをおこなうために,
* upd_sensed_graspable_points.m
が実行される.地形情報については前もって全体に把持可能点検出をおこなっている.そのためセンシングに関してClimbLab内では,地形情報全体の点群ではなく,歩行に重要な把持可能点のみを対象とする.
具体的な処理を述べる.surface_param.graspable_points
(以下surface_param
を省略)に格納された地形全体の把持可能点の位置情報とは別に,sensed_graspable_points
という変数を用意する.センサカメラの画角に入ったことで"既知"となった点の座標を,graspable_points
からコピーしてこのsensed_graspable_points
に格納する.ロボットの移動にともなってセンシングエリアも進んでいくため,この処理をループ内で繰り返しおこなっていく.そして,歩容計画などで扱う把持可能点の位置情報としてsensed_graspable_points
を利用することで,未知環境を把持可能点検出をおこないながら移動する状況をシミュレーションできる.
Global Path Planning
続いて,大局的経路計画として,次の2つの関数:
upd_obstacle_map.m
upd_global_path_plan.m
が順に実行される.まずupd_obstacle_map.m
によって,センシングの結果にもとづき把持可能点位置情報をグリッドマップに収容する.各グリッドは,中心に有する参照ノードの状態に応じて,仮ノードであれば0,確定ノードなら1,空ノードならNaN値を持つように更新される.このように,各ノードの値を収容している行列としてグリッドマップを取り扱う.そして,upd_global_path_plan.m
では,ロボットの現在位置とゴール位置,そして各ノードの状態を参照して経路を生成し,中間点を生成する.
Local Path Planning
局所的経路計画をおこなう関数として,
upd_local_path_planning.m
が実行される.この関数によって,ロボットの次の一方における目標移動方向を決定する.関数内では,誘引される3つの方向ベクトルをそれぞれ算出し,重み付け係数をかけて足し合わせて正規化することで,移動方向ベクトルを導出している.
なお,この局所的経路計画を用いない場合は,次の歩容計画に関わる関数のなかで,移動方向としてゴール方向に直進するベクトルを設定している.
Gait Planning
経路計画に続いて,歩容計画をおこなう大元の関数として,
upd_gait_planning.m
が実行される.Gait Planningとは,歩容計画を意味する言葉であり,次の遊脚・脚先位置(把持点)・ベース位置・ベース姿勢を決定するアルゴリズムである.ファイルの置き場所はフォルダ/climblab/src/controller/gait
下に,フェーズ毎にフォルダを分けて置かれている.upd_gait_planning.m
がmain_sim
内で実行され,その中でgait_planning_param.type
によって適用させる歩容計画手法を切り替えて実行される.脚型クライミングロボットのための離散的な脚先接地点を考慮した歩容計画手法や,従来手法であるクロール歩容などが実装されている.
Motion Planning
歩容計画によって,次の一歩後の姿勢が決定されたため,現在の姿勢から,次の姿勢へと移るための運動計画(Motion Planning)を次の
upd_motion_planning.m
によって実行する.まず遊脚の脚先軌道を設計し,続いてベース重心の描く軌道の設計をおこなう.そして,求められた軌道から,各タイムステップでの目標脚先位置と目標ベース位置を,スプライン曲線を用いて導出する.その結果から,現在時刻でのロボットの目標状態を,逆運動学を解いて各関節角度を求めることで定義する.以上の処理により,歩容計画で決定した次の把持点やベース位置に到達するために,ロボットがおこなう動作を,各タイムステップごとの目標関節角度として導出する.導出した目標関節角度をdes_SV
に格納し,このdes_SV
を目指し制御をおこなうことで計画した運動の追従・実現をおこなう.
Equilibrium Evaluation
運動計画に続いて,ロボットの安定性評価を,
upd_equilibrium_eval.m
によって求め,安定性を定量的に算出する.ClimbLabに導入されている安定性評価指標には2つの種類がある.まず第一の指標は,転倒安定余裕(Tumble Stability Margin, TSM)である.続いて第二の指標として,転倒安定余裕の2次元的な概念を3次元的に拡張させて,ロボットの加速度ベクトル総和(Gravito-Inertial Acceleration, GIA)を用いた安定性評価手法がある.この2つの手法のどちらかの内,自分のシミュレーションに適切である手法を導入して安定性を評価する.
Robot Controller
運動計画によって導出されたロボットの目標関節角度に近づけるために,運動制御をおこなう.運動制御は以下の関数,
upd_control.m
でおこなわれている.ロボットの動力学を無視して運動学のみのシミュレーションをおこなう場合には,この処理はスキップし,運動計画で求められた目標関節角度を現在時刻におけるロボットの関節角度としてそのまま採用する.一方でダイナミクスを考慮したシミュレーションをおこなう場合には,ロボットの関節トルクτ~i~をPD制御する.
Kinematics and Dynamics
ロボットに関わる動力学や運動学を計算する.まず,ロボットの脚先のグリッパに対してかかる引き剥がし力と,グリッパの把持力とを比較する.グリッパが耐えられる把持力以上の引き剥がし力が脚先に発生している場合,グリッパは剥離したと判定される.続いて,各脚の脚先のグリッパが地面に押し付けられることで発生する反力を計算する.地面から受ける反力F~contact~は,ばね-ダンパモデルを採用して算出される.脚先が地面に仮想的にめりこむとし,そのときの反力を弾性係数と粘性係数を指定することでモデル化する.陸上競技上のトラックや,公道のアスファルト・岩石地形など,地面の軟らかさは様々である.そのため,これらの係数を適切に設定して対象とする地面の反力をモデル化する.
そして,ロボットの運動方程式をSpaceDynを用いてルンゲ=クッタ法によって解く.算出されたベース位置と各関節の関節角度から,順運動学によってそのタイムステップにおけるロボットの位置と姿勢を計算する.
Variables Saving
シミュレーションを振り返って後に解析ができるように,シミュレーション中の変数の時間履歴を保存する.そのために,ループ内にて
upd_variables_saved.m
を実行し,各タイムステップにおける主要な変数の値をvariables_saved
というclassに格納していく.ループ終了後,Save関数によってコンピュータにCSVファイルとして保存する.
Simulation Stopper
シミュレーションがある特定の条件を満たした時,ループを脱して,歩行シミュレーションを終了する.そのための関数が,
upd\_stop\_sim.m
である.シミュレーションの終了条件は先に述べたように,設定した時刻までシミュレーション時間が進むか,ロボットが目的地点に到達,もしくは移動の継続が不可能となった場合である.これらの条件のうちいずれかを満たした場合,メインループを終了して,Save関数の実行へと移る.シミュレーションが終了条件を満たしていない場合は,メインループの先頭に戻ってセンシングから歩行シミュレーションを継続する.
以上がmain_sim.m
内で実行されるUpdate関数の概要である.ここで述べたそれぞれの関数が内部でまた複数のUpdate関数を呼び出して実行している.各関数の処理の詳細を知りたい場合は,関数の中身を実際に見てみることが推奨される.
2.7. Visualize Functions
Visualize関数とは,MATLAB figureに変数やデータを図として描画するための接頭辞vis_
のつく関数群で,ファイルの置き場所は全てフォルダ/climbla/src/visulaization
である.Visualize関数には2種類あり,
- 歩行シミュレーションの様子を動画に描画するための関数
- シミュレーション後に変数の履歴をプロットするための関数
に分けられる.
前者の,動画のためのVisualize関数については,メインループ内で実行されており,設定されたフレームのタイミングにタイムステップがなる毎にまとめて実行され,同じfigureに繰り返し描画していく.animation_param
によって,表示する項目を選び,また描画の色・太さ・マーカーを全て設定することができる.またこれらの関数の留意点として,地表面の傾斜角度(Inclination: inc)の取り扱いを認識しておく必要がある.急傾斜地形の登攀をシミュレーションする際においても,ClimbLab内の変数は全て傾いた地面上の地面座標系で計算されているため,変数を動画に描画する際には,すべてのVisualize関数の中でrot(地面座標系と慣性座標系との間の回転行列)を計算し,変数に対して座標変換をおこなって慣性座標系における急傾斜登攀を示している.
後者の,シミュレーション後に変数の履歴をプロットするための関数については,main_sim.m
のループ後におおもとの関数である
vis_plot_graph.m
が実行されることで機能する.プロットする変数履歴の種類はplot_param
で設定が可能である.履歴をプロットするために使うための共通の関数として,
vis_graph_time_history.m
が存在し,vis_plot_graph.m
の内部で変数ごとに繰り返しこの関数が使用されている.また,この共通のvis_graph_time_history.m
では示せない形態のデータや,安定性解析上重要な項目に対しては,以下の5つの単独のプロット用Visualize関数が作成されている.
vis_footholds.m
vis_graph_tsm.m
vis_graph_gia_margin.m
vis_graph_gia_inclination_margin.m
vis_graph_trajectory_comparison.m
2.8. Save Function
Save関数とはシミュレーションのエンドフェイズ時に実行され,変数やデータをMATLABのワークスペースからコンピュータに保存する関数のことである.ファイルの置き場所は,フォルダ/climblab/src/misc(miscは「その他」の意味)である.Save関数として分類されるのは,
sav_data_file.m
だけである.この関数によって,そのシミュレーションでユーザーが指定して読み込んだConfigファイルと,内部で変化した変数の履歴をCSV形式として保存したファイルを,実行した時刻をフォルダ名としてフォルダ/climblab/dat
下(dat: dataの意)に新たにフォルダを作成して保存する.保存する際のフォルダ名やファイル名はrun_cod
やrun_id
という変数で指定できる.この保存されたCSVファイルから必要なデータを抽出することで,シミュレーション終了後に改めて詳細な解析をおこなうことができる.