AtsExでCabIlluminanceの挙動をさぐってみる

Mi5000氏の下記ツイートに触発されて遊んでみたのでメモ。

1. エラーを再現してみる

次のCabIlluminance要素を含むマップを作って実行すると、確かに運転台が明るくなった地点でエラーが出た。

50;
CabIlluminance.Interpolate(0.48);
57.5;
CabIlluminance.Interpolate(1);

次にMi5000氏のツイートに従って、57.5; CabIlluminance.Interpolate(0.9);と変更してみるとエラーが出なくなった。

2. CabIlluminanceの内部値を取り出す

AtsExの力を借りて、距離程30m~100mでのCabIlluminanceの内部値(と言い切っていいのか?)を、距離程0.01m毎に外部ファイルに書き出すマッププラグインを作成した。コードは下記の通り。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Windows.Forms;

using BveTypes.ClassWrappers;

using AtsEx.PluginHost;
using AtsEx.PluginHost.Plugins;

namespace cabilluminance_test
{
    [PluginType(PluginType.MapPlugin)]
    public class Cabilluminance_test : AssemblyPluginBase
    {
        Route route;
        InterpolatableMapObjectList cabIlluminanceObj;
        
        public Cabilluminance_test(PluginBuilder builder) : base(builder) 
        {
            BveHacker.ScenarioCreated += OnScenarioCreated;
        }

        public override void Dispose()
        {
            
        }

        private void OnScenarioCreated(ScenarioCreatedEventArgs e)
        {
            route = e.Scenario.Route;
            cabIlluminanceObj = route.CabIlluminanceObjects;

            using(StreamWriter sw = new StreamWriter(@"cabillum.csv", false))
            {
                for(double dist = 30.0; dist <= 100.0;  dist+=0.01)
                {
                    sw.WriteLine(String.Format("{0:F},{1:F}", dist, cabIlluminanceObj.GetValueAt(dist)));

                }
            }
        }

        public override TickResult Tick(TimeSpan elapsed)
        {
            return new MapPluginTickResult();
        }
    }
}

3. 内部値の挙動をプロット

CabIlluminance: 0.48->1, 0.48->0.9の二通りの場合について、マッププラグインの出力データをプロットすると次図を得る。内部値は1.0からマップファイルで指定した値を引いた値になるようだ。

両者に対して、目標値(1 or 0.9)の直前でオーバーシュートが発生しており、特に目標値: 1の場合は一時的に値がマイナスに振れてしまっている。

Mi5000氏の指摘通り、オーバーシュートがこのエラーと関係している可能性は高そうだが、目標値: 0.9の場合にも同じ現象が起きているのは意外だった。

コメントをどうぞ

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください