路線バス運転シミュレータ開発記

OMSIを使って路線バスの運転シミュレータを製作しています。備忘録的にゆるーく書いていきたいと思いますので、お付き合いいただければ幸いです。

道路を左側通行にする

 海外のサイトで道路のスプラインファイルや交差点のオブジェクトファイルがフリーで配布されていることがありますが、これらのものを日本のマップに活用しようとしても右側通行になっていることがほとんどで、そのまま使用することができません。

f:id:poplar1930:20210617000321p:plain

最初、スプラインデータがどのようなつくりになっているか解析しないとダメかと思っていたのですが、SimpleSplineCreatorという便利なツールがあったので紹介します。

1)こちらのサイトからダウンロードします。
https://reboot.omsi-webdisk.de/file/311-simple-spline-creator-1-1/

2)zipファイルを展開してSplineCreator.exeを起動し、[Spline importieren]をクリックして任意のsliファイルを開きます。そうすると道路の横断面図が表示され、車両や歩行者などの進行方向が矢印で表示されます。横断面図全体が表示されない時は、右側のスライドバーで拡大率を調整できます。

f:id:poplar1930:20210617000514p:plain

3)そこで画面下部の[Pathes]タブをクリックし、パス(車両や歩行者の通り道のこと)の一覧が表示されたら、変更したいパスをダブルクリックします。すると、ダイアログが表示されますので、[Typ:]が"Cars"になっているのを確認して、[Richtung]を今とは逆の方向に設定して[OK]をクリックします。以上の操作を車両が割り当てられているすべてのパスに行います。これで左側通行になりました。

f:id:poplar1930:20210617001859p:plain

4)設定が完了したら、[Spline exportieren]をクリックしてsliファイルとして保存します。

5)保存したsliファイルをマップエディタで開いて確認すると以下の通り左側通行になっていることが確認できると思います。

f:id:poplar1930:20210617002346p:plain

これで改変OKで配布されているスプラインファイルであれば、自分のマップで取り込んで使用できるようになるかと思います。

空気圧計の改造

水温計、燃料計、油圧計、電圧計の4つの計器については電気的に動作させることが可能なのですが、空気圧計については簡単にはいきません。
実は以前からどうしようかと考えていたところでもあったのですが、空気圧計を動作させるには次のような方法があるかと思います。

(1)コンプレッサーで圧縮空気を空気ダメに溜めて、空気圧計との間に電空レギュレータを入れて任意の圧力を得ることにより、空気圧計を動かす方法
(2)空気圧計自体を改造してサーボモーターを取り付け、直接空気圧計の指針動かす方法

以前は(1)の方法で実装しようと考えていたのですが、つくりが大掛かりでコストもかかり、動作時の騒音が気になるというあまりスマートな実装ではないことが気になりやめました。この方法の利点といえば、空気圧計の改造がいらないこと、他に空気圧で動作する機器があれば圧縮空気を供給できるということでしょうか。
(2)の方法については空気圧計を改造する必要がありますが、動作音も気にならず低コストで実装できます。
そこで、今回は(2)の方法をとりたいと思います。

まず、メーターパネルの前面カバーをはずし、空気圧計の針を抜きます。抜き方としてはまず丸形の黒いカバーを外してから、針の根本からペンチなどで垂直方向に力を入れると抜けます。

f:id:poplar1930:20210615235708j:plain

次にメーターゲージを止めているビスを外して、計器の内部が見えるようにします。

f:id:poplar1930:20210615235839j:plain

このままではサーボモーターが入らないので、不要な部分をペンチなどで除去します。

f:id:poplar1930:20210616000042j:plain

除去したらサーボモーターを取り付けます。
私の場合、接着剤で固定しました。

f:id:poplar1930:20210616000229j:plain

サーボモーターの配線は裏側の穴から逃がします。

f:id:poplar1930:20210616000455j:plain

メーターゲージのパネルを再び取り付けたときに、サーボモーターの軸がパネルの穴から見えていればOKです。

f:id:poplar1930:20210616000647j:plain

あとは、針をサーボモータの軸に取り付け、動作するかチェックします。
ちなみにサーボモーターの軸の穴よりも針の軸のほうが大きかったので、サーボモーターの軸の穴を少し広げて取り付けを行いました。

サーボモーターが正しく動けば、動画のように空気圧計の針が動くはずです。

youtu.be

計器類のピンアサイン(日野)

メーターパネルのピンアサインがわからない場合、原始的な方法ではありますがテスターを使って見当をつけていく方法しかないかと思います。
今回調べたのは日野のメーターパネル(車種不詳)です。メーターパネルの配線はメーカーや車種によって異なるので、その都度調べていくしかありません。(一応、メーカーごとに大枠では決まっているようです)

f:id:poplar1930:20210615202558j:plain

まずランプ類の配線ですが、基板のパターンを見て複数のランプで共有されているラインを確認します。
これが共通になっている配線で大抵の場合GNDになります。赤線で示しているところがそうです。
一方、緑色で示した線が各ランプ固有の配線でこちらに+24Vを接続します。このラインは基板のパターンから判別がつく場合もありますが、判別がつかない場合はランプの根本と各接続ピンを片っ端からからテスターで調べてみて導通するピンがあったらそこがそのランプ固有の配線になります。
下の画像でいうと、右ウインカーのランプが(1)、左ウインカーのランプが(2)になります。
計器については、過去にメーターパネルを分解した経験から赤い丸印をつけた箇所が怪しいと当たりをつけ、電流を流してみたところ計器が動作したのでこれでOKです。

f:id:poplar1930:20210615202648j:plain

他のランプ類についても同じ要領で当たりをつけていくわけですが、特記することとして共通となっている配線がインジケータランプ(表示灯)とウォーニングランプ(警告灯)で違うということです。
インジケータランプはGNDが共通になっていて、各ピンに+24Vを印加することで点灯するようになっていますが、ウォーニングランプは+24Vが共通になっていて、各ピンにGNDを接続することによって点灯するようになっています。
これも回路を調べたり、いろいろ試行錯誤しているうちに分かりました。

 以下、私が調べてわかったものをメモしておきます。あくまで独自調べなので接続は自己責任でお願いします。

f:id:poplar1930:20210615211325p:plain

(1)ハイビーム表示灯 (2)排気ブレーキ表示灯
(3)グロープラグ表示灯 (4)水温計
(5)左ウインカー表示灯 (6)右ウインカー表示灯
(7)燃料計 (8)2WAYバルブ表示灯
(9)バッテリー表示灯 (10)表示灯GND
(11)燃料計 (12)パネル照明
(13)不明 (14)パネル照明
(15)不明 (16)後扉表示灯
(17)前扉表示灯 (18)ステップ表示灯
(19)ドアタンク表示灯 (20)バゲージルーム表示灯
(21)バゲージルーム表示灯 (22)エアコン表示灯
(23)詳細不明の表示灯 (24)HAS表示灯
(25)SPG・B表示灯 (26)+24V (電圧計直結)
(27)GND (電圧計直結) (28)パーキングブレーキ警告灯 
(29)不明 (30)ABS警告灯 
(31)空気圧警告灯 (32)不明 
(33)油圧警告灯 (34)燃料警告灯 
(35)不明 (36)不明
(37)ブレーキ警告灯 (38)接続なし 
(39)油圧計 (40)ブレーキパッド警告灯 
(41)ストップランプ警告灯  

※残念ながらFFシフト関係は回路が複雑なので諦めました...。どなたかご存じの方がいらっしゃれば教えてください。

インジケータランプのテスト

OMSIとArduinoの連携動作が確認できたところで、実車のメーターパネルを動作させてみたいところです。
前にも記述しましたが、Arduinoの出力ピンに24Vの負荷をつないで動かすことはできませんから、簡単ですが以下のような回路を考えてみました。
フォトカプラによってArduino側の回路とメーターパネル側の回路が電気的に分離するのでとりあえず安心です。
ただ、データシートを見ると定格最大電流が50mAなのに対し、メーターに使われているランプは45mA消費するので結構ギリギリでもう少し工夫が必要かもしれません。

f:id:poplar1930:20210615071645p:plain

回路図

回路は簡単ですが、いざ実装となると結構面倒です。

f:id:poplar1930:20210615071830j:plain

f:id:poplar1930:20210615071834j:plain

これらの線を24V電源とメーターパネルのランプにつながっているピンに接続すれば、前回LEDでテストしたのと同じようにメーターパネルのランプを点灯させることができます。

f:id:poplar1930:20210615072113j:plain

youtu.be

ただ、ここで問題なのがメーターパネルのピンアサインをどのように調べるかということです。何かしら資料が手に入れば簡単なのですが、そういったものが手に入るケースは稀かと思いますので、自分で解析していくより他ありません。
それについては次回書きたいと思います。

 

※回路図の作成には水魚堂さんのBSch3Vを使用させていただきました。https://www.suigyodo.com/online/schsoft.htm

OMSIでの動作確認

それではOPLファイルを作成したので実際にOMSIで動作するか確認したいと思います。手順は以下の通りです。

1)OFK.exeを起動して[File]-[Load profile]をクリックし、作成したOPLファイルを選択、右下の"Enable action?"のチェックボックスにチェックを入れて[Load]ボタンをクリックします。
2)OFK.exeを閉じ、pluginsフォルダにあるKOMSI.oplがさきほど読み込んだOPLと同一になっていることを確認します。KOMSI.dllはこのファイルを読み込んでArduinoのピンアサインを決めます。OFK.exeでチェックボックスにチェックを入れていたのはこのファイルを上書きして反映させるためです。仮にチェックを入れなかった場合は、OFK.exe内で編集可能になるだけでKOMSI.oplには反映されません。
3)動作が分かるように定義したピンと5Vピンの間にLEDと抵抗を接続します。サーボモーターがあるときはサーボモーターも接続してください。
(私が試しに使ったSG90というサーボモーターの場合、赤線を5V、茶色をGND、オレンジをアナログ出力ポートに接続しました。)
4)KOMSI Serverを起動した後、OMSIを起動します。
5)OMSI内で内部変数が変化する操作(例としてウインカーを定義しているならその操作)を実行してLEDが点灯することを確認できればOKです。

youtu.be

youtu.be

これで基本的な動作確認は完了です。
もちろん、マイコンの基板から直接24Vの装置を稼働させることはできませんが、論理的にはうまくいっているわけです。
あとは外部回路さえ作成すれば、Arduino側のON/OFFで24Vの電球をON/OFFさせることも可能です。

あと一点注意事項があります。Arduinoマイコン基板なのでたとえ5Vで動作する負荷であっても消費電流の多い負荷は接続することができません。1ピン当たり最大40mAと決められているので、それ以上必要な場合はやはり外部回路をつくる必要があります。また、基板全体でも制約があって、単にUSB接続の場合は400mAくらい、5V 1A以上のACアダプタを使用して900mAくらいになります。決して満足な容量ではないので、基本Arduinoで直接負荷を稼働させるのはやめたほうが賢明かもしれません。

出力ポートの割り当て

さて、Arduinoの動作を実際に確認できたところで、次はボードの各ピンにどのような出力を割り当てるか決める必要があります。
Arduinoボードには大きく分けて、アナログ出力ポート、アナログ入力ポート、デジタル入出力ポートの3つがありますが、KOMSIで使用するのはアナログ出力ポートとデジタル入出力ポートになります。
アナログ出力ポートについては、PWMでサーボ―モーターを制御して実車の計器を動かし、デジタル入出力ポートについては単にON/OFFの2値しか扱いませんので主にインジケータランプを点滅します。
KOMSIのつくりとしては、アナログ出力ポートについてはピン番号が決め打ちになっており、各ピンに接続する計器がすでに割り当てられているのに対し、デジタル入出力ポートについてはOMSI内部の変数値をどのピンに割り当てるか、OPLというファイルで定義できるようになっています。

f:id:poplar1930:20210615015907j:plain

■アナログ出力ポートの割り当て

[03]空気圧計
[05]エンジン温度計 (水温計とは別のようです)
[06]水温計
[09]速度計
[10]油圧計
[11]燃料計
[12]エンジン回転計

※[]内はピン番号


さて、デジタル入出力ポートについては、KOMSIに付属していたOFK.exeというツールを使用してOPLファイルを作成します。
まず、デフォルトの画面表示がドイツ語になっていて使いづらいので、メニューから[Sprache]-[English]を選択して英語表示にします。

f:id:poplar1930:20210615020008p:plain

このツールの使い方は簡単で、左側の[possible indicator lights]からOMSI内部の変数名を選択して、右側の任意のピン番号のところにドラッグ&ドロップするだけです。なお、文字が灰色になっているところは予約されているピン番号なので新たに定義することはできません。
例えば、"battery"を特定のピンに定義したとすると、メインスイッチをONにしたときにそのピンはON、エンジンがかかるとOFFになります。
また、すべての内部変数が[possible indicator lights]にあるわけではないので、別途必要なものが出てきたときはメニューの[indicatorlights database]-[Edit]から編集用のダイアログボックスを開きます。
ダイアログボックスが表示されたら、[New]ボタンをクリックし以下の情報を入力します。

f:id:poplar1930:20210615020045p:plain

(1)には英語選択時の[possible indicator lights]で表示する名称を入力します。任意の文字列で問題ありません。
(2)にはドイツ語選択時の[possible indicator lights]で表示する名称を入力します。任意の文字列で問題ありません。
(3)にはOMSIの内部変数名を入力します。例えば、ウインカーの右であれば"lights_blinker_r"と入力します。この内部変数については車両データ内で定義されているため、詳細については車両データを解析する必要があります。

※私の場合、ドイツ語は使用しないので(1)と(2)は同じ文字列を入れています。

入力が完了したら[Save]ボタンをクリックします。保存されたことを示すメッセージボックスが出ますので[OK]をクリックして追加完了です。
前の画面に戻る場合は[Cancel]ボタンをクリックし、再度[possible indicator lights]を確認するとさきほど追加した内部変数名が表示されていると思います。

全てのピンに割り当てが完了したらOPLファイルを作成します。作成はメニューの[File]-[Create OPL file]をクリックするとダイアログが表示されるのでファイル名を入力して[Save]をクリックします。
これでOPLファイルの作成は完了です。作成したOPLファイルはOFK.exeがあるフォルダに"OPL Creator Files"というフォルダがあるのでそこに保存されます。

Arduinoの導入

数年前、運転台コントローラーが技術的に実現できそうか検証するため、KOMSIを使ってArduinoを動かしてみたことがあったのですが、保管してあったものを久しぶりに出して接続したらうまく動作せず、故障してしまったのかとかなり焦りました。
そこで、Arduinoを導入するまでの詳細な手順を以下に記述しておきます。
ちなみに、私が使用しているボードは入出力ピンの多い"Mega2560"という種類のもので、KOMSIでもこれを使う前提で作られているようです。他の種類のボードでKOMSIが動作するかは試したことがないので不明です。

1)以下のページからArduino IDEをダウンロードし、インストールします。
https://www.arduino.cc/en/software

2)USBケーブルでPCとArduinoを接続し、デバイスマネージャーにて正常に認識されるか確認する。このとき、正常に認識されていればCOMポート番号が表示されるのでこの番号をメモしておきます。
なお、このCOMポート番号は別のUSBポートを使用すると変わることがあるので注意が必要です。

3)中国製など互換ボードの場合、別途ドライバをインストールしないと認識しないことがあります。私の場合、以下のサイトのドライバを使用するとうまく動作するようになりました。実はここでかなり行き詰ってしまいボードが故障してしまったのかと思いました。ボードが故障した場合、ブートローダーの書き換えも試してみる価値がありますが、それにはボードが別にもう1枚必要になり、元々1枚しかもっていない私にとっては買い替えるのと大した変わりがありませんでした。ボードを買わずに動いて良かったです。
http://www.wch.cn/downloads/CH343SER_EXE.html

4)KOMSIをダウンロードして展開後、OMSIフォルダの\plugins直下にコピーしてください。なお、pluginsフォルダがないときは作成してください。
http://pulle76.de/

5)ArdinoボードのDigital 53pinとGND pinにLEDと抵抗(220Ω程度)をつなぎます。次に、Arduino IDEを起動して以下のプログラムを打ち込み、ボードにプログラムを書き込みます。

void setup()

{
pinMode(53, OUTPUT);
}

void loop()
{
digitalWrite(53, HIGH);
delay(1000);
digitalWrite(53, LOW);
delay(1000);
}

書き込みが正常に完了すると、ボード上のプログラムが動作し、LEDが点滅するはずですので、これでボードが故障していないか、ドライバに問題がないか確認することができます。

※書き込みがうまくいかない場合、IDEで設定されているボードの種類とCOMポート番号が正しいか確認してください。

※ちなみに、私の場合CH343SER.EXEをインストールしなければならないことをすっかり忘れていて、Arduino IDEに付属している純正のドライバを無理やりインストールして使おうとしましたが、COMポートとしては認識されるもののボードにプログラムを書き込もうとするとエラーになって失敗していました。

6)ボードの動作確認ができたら、KOMSIに付属している"lights_and_servos.ino"というプログラムをボードに書き込みます。このプログラムによって、KOMSI ServerとArduinoとの間で通信が可能になります。

7)任意のDigital pinと+5V pinとの間にLEDと抵抗を直列につなぎます。

8)ボードの書き込みが完了したらKOMSI Server.exeを起動します。ドロップダウンにCOM番号が表示されていますが、一番上のものから順番にArduinoボードに設定されているCOMポート番号と同じ番号にあわせてください。そして、一番下の"indicator lights and gauges"のチェックボックスをONにします。

f:id:poplar1930:20210615043726p:plain

※ここでポートのオープンに失敗したというメッセージが表示されるときは、一旦チェックボックスをOFFにして、すべてのドロップダウンを別のCOMポートに変更してから再度COMポートを設定しなおしてチェックボックスをONにしてみてください。

9)\plugins\Tools\KTT内のKTT.exeを起動して、右側の[Connect]ボタンをクリックします。

f:id:poplar1930:20210615043525p:plain

10)左側のIndicator Lightsにある[all/none]ボタンをクリックするとすべてのチェックボックスにチェックが入るのでこれでLEDが点灯するか確認します。点灯したら、LEDを接続したピン番号のチェックボックスだけOFFにしてLEDが消灯することを確認します。
テストが終わったら[Disconnect]ボタンをクリックして接続を切断しツールを終了します。

以上で、KOMSIを使ってOMSIとArdinoボードを連携させる準備ができました。
実際にOMSIと連携させる例については、別の機会に書きたいと思います。

入出力部分の基本設計

以前(OMSIの導入 - 路線バス運転シミュレータ開発記)で述べた通り、OMSIを操作する場合、G27のようなハンドルコントローラーを使用すればキーボードやマウスによる操作と異なり、より実感的な操作ができますが、これでも以下のような問題点があります。

 ■操作の種類が多い(メインスイッチON/OFFやワイパーの速度変更・間欠動作の有無まである)ため、G27についているボタンだけではすべての操作を割り当てることができず、キーボードを操作しなければいけない場面が多いこと

 

この問題は、カスタマイズした運転台を製作するときに障害になります。仮にハンドルコントローラーのスイッチから接点を引き出して実車のランプスイッチやワイパースイッチなどを動作させようとしたくても、そもそもハンドルコントローラー側のスイッチが足りなくてそういった操作を割り当てられないのであれば意味がありません。幸いこの問題についてはUSBのジョイパッドなどを増設してOMSIで割り当てることのできるボタン数を増やせば解決するかと思います。
なお、キーボードから接点を取り出すやり方はお勧めできません。確かに入力接点がたくさんあってコストパフォーマンスは良いのですが、同時に複数のキーがONになった場合の処理を考えなければならなかったり、単にトグルスイッチのON/OFFで制御するのが難しく回路の工夫が必要になる場合があるからです。
さらに、キーボードはシステムと直結しているので、別のソフトウェアにフォーカスが移った時に誤動作する可能性があり、そういったことを考慮するとやらないほうが無難です。それでもキーボードを使いたいという場合は、通常のキーボードとOMSI入力用のキーボードをUSB切替器のようなもので切り替えて使用するような実装方法が考えられます。

 

■入力はできても出力ができないためバスの挙動にあわせて各種メーター類を動作させることができない

 

実はこれが最大の問題で、実物の運転台のパネルを使用するとなると、OMSIの動きと同期して運転台パネル上の表示灯やメーター類を動作させなければなりません。しかし、G27をはじめとするハンドルコントローラーには元々こういった機能がないのでランプやメーターの接点だけ取り出して動かすというような単純な方法は使えません。出力は入力の時のように簡単にはいかないというわけです。

 そこでどうするかというと、OMSIにはプラグインDLLを開発して機能を拡張できるようなつくりになっているので、これを使ってOMSIと外部デバイスとの間の通信を行うようなプログラムを開発すれば解決しそうです。以前、BVEで鉄道の運転シミュレータを開発したときはこのような方法をとって外部デバイスと通信していました。

ただ、Youtubeなどで海外での例を見ていくうちに、実はKOMSIというこうした役割をもったプラグインDLLがすでに開発されており、大抵の場合これを使用しているようでした。
このKOMSIというプラグインですが、下の図のようにArduinoボードが接続され、あらかじめ起動してあるKOMSI ServerとOMSIの起動時に呼び出されるKOMSI Clientとが通信してOMSIの内部情報(例えばウインカーが点灯しているなど)を出力するような仕組みになっていて、KOMSI ServerとArduinoボード間はCOMポートを使ったシリアル通信を使っています。
ここで、表示灯や計器とArduinoとの間に制御回路を設ける理由は、Arduinoの出力が0Vから5Vで行われるのに対し、一般的なバスの表示灯では24Vで点灯しますし、計器類も種類によって稼働電圧や変動幅が違うからです。つまり、Arduinoから出力された電圧の変動信号を実際に表示灯や計器が動作するように電圧を変換してあげなければならないのです。また、仮に5Vの電圧で動作したとしてもArduinoのようなマイコン基板ではLEDのような小さな負荷を動作させるのが限界で、大きな電流を流すような使い方をすると基板の中のチップが故障してしまいますので、基板に直接負荷をつなぐのはよくありません。

f:id:poplar1930:20210609150039p:plain

システム概念図

以下の動画はKOMSIによる実装例です。

youtu.be

KOMSIの良いところは計器情報を除いて、OMSIの情報を決め打ちで特定の番号のピンに出力するようなつくりになっておらず、別に用意されているツールで何番のピンには何の情報を出力するというような割り当てが柔軟にできることです。
これにより、車両データの修正や運転台側のハードウェア仕様が変わってもある程度対応できるかと思います。

ところで、KOMSIに似たものにSimHubというものがありますが、こちらは様々なゲームに対応しているので汎用性は高いですが、OMSIには部分的にしか対応していないのでOMSIに特化したコントローラーを開発するのであればKOMSIを使うのがベストかと思います。
ただ、SimHubはKOMSIと違い、Euro Truck Simulatorにも対応しているので、運転台コントローラーをバスとトラックで共通化してKOMSIとSimHubで切り替えて使えるようにすれば、OMSIとEuro Truck Simulator両方で使えるようなものにすることも可能だと思います。
ちなみに今回は汎用性の高いものではなく、OMSIで使用することを前提とし、バスの運転台を忠実に再現することを目的としていますので、この部分については触れないことにします。

 なお、KOMSIのプラグインDLLは以下のサイトからダウンロードすることができます。http://pulle76.de/

 

道路の配置

地形データを生成出来たら、次は道路の配置です。道路を配置すればこれを基準としてバス停や沿道の建物をどの辺りに置くか決めることができます。しかし、地形だけを基準に道路を配置するというのは難しいので、地図と地形を対比させて距離感をつかみながら作成するという方法も考えられますが、これでも実在の路線を再現するには実用的ではないと思います。
そこで、OMSIの地形タイルが1つ300m×300mのサイズであることに着目して、地図画像をテクスチャとしてそこに貼り付け、それをトレースするように道路を配置していくとうまくいきそうです。ただ、ここで問題なのはタイル間でテクスチャがシームレスにつながっていないと広い範囲のマップを作ろうとしたときに誤差がどんどん増えていってしまいます。
ではどうすれば良いのか、私なりに海外のサイトなどで調べたところ(日本語サイトではそれについて言及されているところがなかった)OMSIのマップエディタはSRTMによる標高データだけではなく、ネットの地図サービスの画像を地形タイルに表示させる機能があり、新しいタイルを作成すれば既存のタイルの地図画像とシームレスにつながるようになっていることがわかりました(凄い!!)

つまりは、この機能を利用すればわざわざ地図画像をコピーして既定の大きさに切り取り、テクスチャにして手動で貼り付けるという作業がいらなくなります。

以下に手順をメモします。
(すでに編集したいマップには緯度・経度の情報が設定されている前提で進めます。それらが設定されていないとマップエディタもどの場所の地図画像をロードすればよいのかわからずエラーになります。)

1)OMSIフォルダ直下にあるoption.cfgにある[Editor_LinkAerial]セクションに地図サービスのURLを入力し上書きします。ただし、これはタイル単位で地図画像を読み込むためのURLなので通常のブラウザで閲覧する場合のURLとは異なります。例えばOpenStreetMapの場合は以下の通りです。

http://b.tile.openstreetmap.org/~z/~x/~y.png

※また、このタイル画像取得用のURLは地図サービスごとにURLは異なりますので、特に使用したいサービスがあればタイル画像の取得が可能かどうかについてお調べください。

2)次に、OMSIフォルダの\maps内に\aerialsというフォルダが存在するか確認してください。もし存在しない場合はこのフォルダがないと次の作業で失敗しますので作成してください。なぜ、作業に必須のフォルダがデフォルトで存在していないのか謎です。このことが分かるまでかなり苦労しました。

3)マップエディタを起動して編集するマップを開き、[Tile]タブを開きます。そこの[Aerial Download]グループにある[Use tile aerials]チェックボックスにチェックを入れます。あとは地形データのときと同じ要領で、地図画像を読み込ませたいタイルに移動して[Dnl. current Tile]をクリックすると地図画像が読み込まれます。

4)地図画像を消して元々のテクスチャを表示したいときは、[Use tile aerials]チェックボックスのチェックをはずせば完了です。

参考例として前回の円山の地形データに対して、地図画像を貼り付けるとこのようになります。

f:id:poplar1930:20210605161928j:plain

OpenStreetMapを使用した場合

OpenStreetMapの場合、往路復路ともバス停の位置が青い四角でマークされているのでとても助かります。(複数のバス停をまとめて表記している地図も多いです)

私が確認したところでは、OpenStreetMap以外にも以下のサービスが使えることを確認しています。

 

国土地理院 (リンク先にタイル取得用のURL一覧が掲載されています)
https://maps.gsi.go.jp/development/ichiran.html

地理院タイルは種類によってカバーしている地域が違うためすべてを利用できるわけではありません。

また、地理院タイル取得用のURLに{x}/{y}/{z}という記述がありますが、OMSIの設定ファイルに入力するときはそれぞれ~x/~y/~zと置き換えてください。

f:id:poplar1930:20210605162616j:plain

地理院タイル(標準地図)を使用した場合

f:id:poplar1930:20210605162825j:plain

地理院タイル(航空写真)を使用した場合

航空写真を使えば、地図とはまた違う情報が読み取れると思います。(ちなみにこの画像をそのまま山などのテクスチャとして使えるわけではないので注意が必要です)

あとはストリートビューを使って沿道の様子を詳細に調べたり、過去の住宅地図やYoutubeにアップされている過去のドライブレコーダー映像などを活用して時代考証を行ったりすれば良いかと思います。

そのほかGoogleマップを活用することもできますのでURLを載せておきます。

Googleマップ

https://mt1.google.com/vt/lyrs=m&x=~x&y=~y&z=~z

 

地形の作成

マップエディタで地形を編集する場合、[Terrain]タブを開き、マウスで地形タイルをクリックするとその部分の地形が高くなったり低くなったりするので、その要領で山や丘、湖や沼地を作成します。ただ、この方法は架空のマップであれば気軽に使用できる方法なのですが、お絵かき感覚で地形の高低を決めているので、実際の街並みの作成に使用できるかというと難しいものがあります。
そこで、OMSIのマップエディタにはSRTMと呼ばれるスペースシャトルからレーダーを用いて取得した地球全体の標高データを使用して、マップデータの地形を自動生成するという機能を備えています(凄い!!)
デフォルトではSRTM用のインポートDLLしか付属していませんが、このDLLを開発すれば別の地理情報を読み込んで地形を自動生成することもできるようです。

以下に手順をメモします。

1)NASAのページにアクセスしてダウンロードに必要なアカウントを作成します。
https://urs.earthdata.nasa.gov/users/new/

2)地形を作成したい部分の緯度・経度をGoogleマップなどであらかじめ調べておきます。Googleマップの場合、マップ上で右クリックするとその地点の緯度・経度が表示されます。

3)以下のページにアクセスして地形を作成したい部分周辺のhgtファイルをいくつかダウンロードします。ちなみに、複数の種類のファイルがありますが、"xxx.SRTMGL3.hgt.zip"というものを使用します。
https://e4ftl01.cr.usgs.gov/MEASURES/SRTMGL3.003/2000.02.11/

4)ダウンロードしたファイルはzipファイルなので展開してから、OMSIフォルダの\DEMImport\SRTM\Dataに入れます。

5)OMSIのマップエディタを開き、メニューの[Map]-[Convert to World Coordinates]をクリックするとダイアログが表示されるので、[Latitude]に緯度(北緯は正の数、南緯は負の数)、[Longitude]に経度(東経は正の数、西経は負の数)、そして[New Directory]に現在のマップ名とは別の新しいマップ名を入力し(現在のマップに地形データが反映されるわけではありません)、[Start Conversion]をクリックするとマップデータの生成が始まります。

※なお、[Map]-[Convert to World Coordinates]をクリックしても入力用のダイアログが表示されない場合は、メニューの[Extras]-[Options]-[Advanced]-[Load whole map at start]にチェックを入れてから再度試します。

6)マップデータの生成が無事完了したら、メニューの[Map]-[Change]から先ほど作成したマップを開きます。まだ、この段階では地形データの自動生成は行われていないので、[Tile]タブのDEMにあるドロップダウンから"SRTM\Import.dll"を選択して、[Run curr. Tile]をクリックします。そうすると、現在アクティブになっている地形タイルに対して標高データが適用されるので、別のタイルに対しても同様の操作で地形を生成していきます。

f:id:poplar1930:20210605130822j:plain

参考画像: 札幌市中央区にある円山