Skip to content

v7.3.0

Latest

Choose a tag to compare

@z10000 z10000 released this 05 Aug 13:37
· 3 commits to main since this release

This release brings the public repository from v5.1.0 to v7.3.0.

The intermediate versions below were developed and verified in sequence, but only
v5.1.0 and v7.3.0 exist as published snapshots here — the versions in between
are documented rather than tagged, because tagging a tree that is not that version
would be inaccurate. The in-app changelog carries the same notes.


v7.3.0

Four "learn and grow" features were added to official racing and practice (Stage AS13, the W6 backlog). (1) 🏆 Championship: per season (an event's season) and per class, a points table across several events, plus the champion. Points are 10-8-6-5-4-3-2-1 (0 from 9th down, overridable per event); positions come from the actual finishing order including filler cars, and only real authors score. A retirement scores 0 but still counts as a start. When points, wins, podiums and finishes are all level, no champion is declared and it is shown honestly as a tie. (2) 🗣 Ladders by language: compete for course records within C and within Python. The language is read from the entries, so the official result format (result.json) is unchanged down to the byte — re-verification of every previously published record still holds. (Records whose language cannot be determined are not quietly mixed in; the excluded count is shown.) (3) 🎯 Challenges: from this browser's practice records, your completion progress by course difficulty (★1–★5) plus badges (🔰 first steps, clearing each difficulty, 🌏 clearing every course). The thresholds are purely structural — "all courses at that difficulty" and "all courses" — with no arbitrary numbers. The two courses without a finish line have no definition of "finishing", so they are excluded and the count is shown. The easiest course you have not finished is suggested as your next step. (4) ⏱ Sector-by-sector comparison: the spectate replay now lists per-sector times, splitting each lap into three equal parts by the distance that car actually covered, marking the fastest in each sector (●) and stitching them into a "theoretical best" — so you can see which sector is costing you how much. Ghost frames are sampled every 1/12 s, so the lap times here are indicative, and a car that crosses the line between two samples is missing its final lap from the sectors (stated on screen as an honest limit). The physics is unchanged (the tabletop deterministic hashes f0–f3, the official-record verifyHash and share URLs are all machine-verified unchanged by the full gate suite).

日本語

公式レースと練習に「学んで伸びる」仕掛けを4つ足しました (Stage AS13・W6 バックログ)。①🏆 チャンピオンシップ=シーズン (大会の season) × クラス別に、複数の大会をまたいだポイント順位表と王者を出します。配点は 10-8-6-5-4-3-2-1 (9位以下は0・大会側で上書き可) で、順位は補充車を含む実走順位から引き、ポイントが入るのは実在の投稿者だけです。リタイアは0点ですが出走には数えます。ポイントも優勝数も表彰台も完走数も並んで決まらないときは、王者を立てずに「同点」と正直に表示します。②🗣 言語別ラダー=C と Python それぞれの中でコースレコードを競えます。言語はエントリー側の情報から引いているので、公式結果 (result.json) の形式は1バイトも変えていません=これまでに公開された記録の再検証はそのまま成立します (言語が分からない記録は黙って混ぜず、除外した件数を表示します)。③🎯 チャレンジ=このブラウザの練習記録から、コース難度 (★1〜★5) 別の完走状況とバッジ (🔰はじめの一歩・各難度の制覇・🌏全コース制覇) を出します。しきい値は「その難度の全コース」「全コース」という構造だけで決めていて、恣意的な数字はありません。ゴールライン (周回判定) を持たない2コースは完走が定義されないので対象外にし、その件数も表示します。未完走のうちいちばんやさしいコースを「次の一歩」として案内します。④⏱ 区間別 並走比較=観戦リプレイに、1周を「その車が実際に走った距離」で3等分した区間ごとのタイムを並べ、区間ごとの最速 (●) と、それをつないだ「理論ベスト」を出します。どの区間で何秒失っているかが分かります。ゴーストは1/12秒ごとの記録なので、ここの周回時間は表示用の目安で、ゴールがその記録の合間に入った車は最後の1周だけ区間に出ません (正直な限界として画面にも明記しています)。物理は不変です (卓上の決定論ハッシュ f0〜f3・公式記録の verifyHash・共有URL いずれも不変を全ゲートで機械確認)。

v7.2.0

Added continuous steering as optional equipment (all three engines; leaving the default changes nothing). The real RumiCar steers with three states only (left / centre / right), and that is the baseline of the learning API. Choosing "Continuous" under "Steering servo (optional)" in the toolbar fits a proportional servo, so RC_steer(direction, 0-255) sets how much lock you want (255 = full lock is bit-identical to the 3-state call). Three-state steering can still make intermediate angles by toggling rapidly, but each command sends the servo travelling towards full lock, so a ripple remains. Measured at 20 Hz (the rate a learning program actually runs at), the steering hold error drops from 1.59deg to 0.0235deg (= one step of the 0-255 scale), about a 68x improvement. We also re-measured Stage AO8's 20-cell "is drifting faster?" table with continuous steering. The answer is that not a single cell turns GO (all 20 remain NO-GO). Along the way we found that the original drift test driver never applied any counter-steer at all (the sideslip-angle sign was the wrong way round), so we re-measured with a sign-corrected proportional counter as well - and three-state and continuous steering gave the same answer. Making the servo 64x faster does not change it either. The real barrier is not the steering but the car's own recovery limit: past roughly 36deg of sideslip it cannot come back within 0.6 s even with the wheel straightened. Continuous steering is equipment for placing the steering precisely, not for going faster (indeed three-state is quicker on the tabletop oval, and on the full-scale circuit it is faster for some car types and slower for others). With the default 3-state setting, neither the physics nor any record changes by a single byte.

日本語

操舵サーボの「連続舵」を任意装備として追加しました (3エンジン共通・既定のままなら従来と完全に同じ)。実機 RumiCar の操舵は左/中立/右の3値だけで、これは学習APIの基本仕様です。ツールバーの「操舵サーボ(任意)」で〈連続舵〉を選ぶと、比例サーボを増設した車になり RC_steer(方向, 0〜255) で舵の強さを指定できます (255=全舵は3値と1ビットも変わりません)。3値でも小刻みなオン/オフで中間舵角は作れますが、指令のたびにフル舵へ向かって流れるぶんのリップルが残ります。実測では、学習プログラムの実レート20Hzでの舵の保持誤差が 1.59° から 0.0235°(=0〜255の刻みぶん) へ、約68倍改善しました。あわせて Stage AO8 の「ドリフト優位 go/no-go」20セルを連続舵で取り直しました。結論は GO は1つも復活しない(全20セルNO-GO)です。この過程で、当時のドリフト試験ドライバが逆ハン(カウンター)を一度も当てていなかったこと(横滑り角の符号の取り違え)が判明したので、符号を正した比例カウンターでも測り直しましたが、3値でも連続舵でも結果は同じでした。サーボの速さを64倍にしても変わりません。本当の壁は舵ではなく車体側の回復限界で、横滑り角がおよそ36°を超えると舵を戻しても0.6秒では戻れません。連続舵は「速く走るための装備」ではなく「舵を正確に置くための装備」です (実際、卓上オーバルでは3値の方が速く、フルスケール競技サーキットでは車種によって速くも遅くもなります)。既定の3値なら記録も物理も1バイトも変わりません。

v7.1.0

Added suspension "degrees of freedom" as optional equipment (precise v2 engine only; leaving the default changes nothing). Until now load transfer in a corner merely caught up with acceleration through a first-order lag, so it could not reproduce the way a real car's roll overshoots and settles back on a flick transition. Choosing Soft / Balanced / Stiff under "Suspension DOF (optional)" in the toolbar turns roll and pitch into genuine one-degree-of-freedom spring-damper modes, so the load overshoots during the transition. The size of the overshoot depends only on the damping ratio (Soft 37.2%, Balanced 4.6%, Stiff 0%), and the excess transfer transiently eats into lateral grip, so the car turns in slightly less well at the moment of the flick (transient understeer). Steady-state cornering is exactly the same as the default — only the transient changes. No new constants were introduced: the equipment supplies only two dimensionless numbers (a natural-frequency multiplier and a damping ratio), so the same numbers mean the same thing on the tabletop and at full scale.

日本語

サスペンションの「自由度」を任意装備として追加しました (精密 v2 エンジン専用・既定のままなら従来と完全に同じ)。これまでコーナーでの荷重移動は、加速度に一次遅れで追いつくだけの扱いで、実車で起きる「切り返しでロールが行き過ぎてから揺り返す」動きを表現できませんでした。ツールバーの「サス自由度(任意)」でソフト/標準/ハードを選ぶと、ロールとピッチがばねと減衰を持つ本物の1自由度系になり、切り返しの過渡で荷重が行き過ぎます。行き過ぎの大きさは減衰比だけで決まり (ソフト 37.2%・標準 4.6%・ハード 0%)、行き過ぎたぶんは横グリップを過渡的に削るので、切り返しの瞬間だけ曲がりにくくなります (過渡アンダー)。定常のコーナリングは既定と厳密に同じで、変わるのは過渡だけです。新しい定数は増やしておらず、装備が与えるのは無次元の2つの数 (固有振動数の倍率と減衰比) だけなので、卓上でもフルスケールでも同じ数字が同じ意味になります。

v7.0.0

Corrected the slope gravity model and added a "cross-slope (bank / cant)" field to courses. Until now the gradient on touge courses used only the fore-aft component of the gravity vector and discarded the lateral component of that same gravity. Measured on real runs, the car heading and the road direction diverge by up to 80 degrees, and the lateral gravity being thrown away reached 1.47 m/s2 - the same magnitude as the lateral acceleration actually attainable at tabletop scale (about 1.63 m/s2), so it was far from negligible. The wheel loads also kept using the full gravity, which left the model carrying 1.16% more gravity than exists. Gravity is now decomposed correctly into three components relative to the road surface (fore-aft, lateral, and the force pressing on the road). That finally includes the force that matters most on a real mountain pass: being pushed from the uphill side toward the valley through a descending hairpin. This is a major version because it affects past reproducibility: only driving on touge courses changes - flat courses, the frozen hashes f0-f3 and the canonical official-race record are byte-for-byte identical. Touge practice bests are kept exactly as they are, with an "(as of vX)" note (they are never altered). Measured on the six bundled touge courses, the default samples now finish 15/18 instead of 16/18, and lap times move between -7.9% and +56% (descending hairpins became honestly harder). Alongside this, course definitions gained the optional field bank (degrees). Raising the outside of a curve turns part of gravity toward the inside of the turn, so you can corner without relying on tire friction alone. The value is the bank angle at that course's tightest corner; elsewhere it scales with curvature down to zero (straights are unbanked - exactly the superelevation rule used in road design). Negative values give adverse camber. The limit speed of a banked corner becomes v2 = Rg(mu*cos(phi) + sin(phi)), and measurement matches that closed form to 10^-16. In real runs, sweeping the bank from 0 to 10 degrees shortened lap times monotonically (45.10 -> 43.03 s, -4.6%). Push it to 20 degrees, however, and although the theoretical limit is still higher, the three-value steering cannot correct fast enough and the car hits the inside wall - so "the limit rises" and "you go faster" are recorded separately, as measured. bank applies to track and touge courses (which carry a centerline) and is interpreted by the precision-v2 and dynamics engines (classic has no lateral degree of freedom and ignores it). Omit it and nothing changes from before.

日本語

坂道の重力モデルを是正し、コースに「横勾配 (バンク/カント)」を追加しました。これまで峠コースの勾配は、重力ベクトルのうち車体の前後成分だけを使い、同じ重力の横成分を落としていました。実際の走行で測ると車の向きと道の向きは最大 80° 開き、落としていた横向きの重力は最大 1.47 m/s² — 卓上で実際に到達できる横加速度 (約 1.63 m/s²) と同じ大きさの、無視できない力でした。さらに輪荷重には重力をそのまま使っていたため、モデルの中の重力が本来より 1.16% 大きくなっていました。今回、重力を路面に対して正しく3成分 (前後・横・路面を押す力) へ分解します。これで「下り坂のヘアピンで山側から谷側へ押される」という、実際の峠でいちばん効く力が入りました。過去の再現性に関わるため本メジャー版です: 変わるのは峠コースの走りだけで、平地のコース・凍結ハッシュ f0〜f3・公式レースの正準記録は byte 単位で完全に不変です。峠の練習ベスト記録は 「(当時 vX)」注記付きでそのまま保持されます (改変しません)。実測では出荷の峠6コースで既定サンプルの完走が 16/18→15/18 になり、周回時間は −7.9%〜+56% と大きく動きます (下り坂のヘアピンが素直に難しくなりました)。あわせてコース定義に任意フィールド bank (度) を追加しました。カーブの外側を持ち上げると重力の一部が旋回の内側を向き、タイヤの摩擦だけに頼らずに曲がれます。値は「そのコースの最も急なコーナーでのバンク角」で、他の場所は曲率に比例して 0 まで下がります (直線はバンク無し=道路設計のスーパーエレベーション則そのもの)。マイナス値は逆バンクです。バンクコーナーの限界速度は v²=R·g·(μ·cosφ + sinφ) となり、実測が閉形式と 10^-16 で一致します。実走でも 0→10° の掃引で周回時間が単調に縮みました (45.10→43.03 秒・−4.6%)。ただし 20° まで付けると、理論上の限界は上がるのに 3 値操舵の修正が間に合わず内側の壁に当たります — 「限界が上がる」ことと「速く走れる」ことは別だと実測で分けて記録しました。bank は中心線を持つ track/touge で有効で、精密v2 と 動力学 の2エンジンが解釈します (クラシックは横方向の自由度を持たないため無視します)。指定しなければ従来と完全に同じです。

v6.4.0

Added rain tires and selectable gearing (both optional equipment for the precise v2 engine; with the defaults nothing changes). A rain tire is a grooved soft compound: worse than normal on a dry surface (peak friction 0.85x) but, in the wet, its grooves win back 70% of whatever grip the road has lost. Those two numbers fix in closed form the road grip at which the faster tire swaps over, g*=0.7987, and it is the same value on the tabletop, at midscale and at full scale (measured relative difference 1.4e-16). The lap-time difference only appears when you are pushing to the friction limit, though: setting the full-scale competition circuit to grip 0.5 makes rain 3.93% faster, while on the two tabletop wet courses the lap barely moves - the lateral acceleration reachable there is under 60% of even a wet normal tire's limit, so the car is not sliding at all (that follows from the long-standing "the tabletop hardly ever slides" design, and the physics notes now say so plainly). Gearing offers Direct (default), Low, High and a 2-speed automatic. A larger reduction multiplies drive torque for sharper acceleration while lowering top speed, and a smaller one does the reverse (0->50% speed 0.233 -> 0.167 s, top speed 102% -> 70%; the top-speed ratio matches the theoretical 1/ratio to 10^-16). The 2-speed automatic shifts by road speed to chase both, but drive is cut for a moment at each shift. At full scale a taller gear does not raise the top speed at all - aerodynamic drag sets it first, so you lose acceleration for a top speed that never arrives. Equipment is stamped into the HUD and the record conditions (the seed of verifyHash) only when you pick a non-default, so past records and default tabletop behaviour stay byte-for-byte unchanged.

日本語

レインタイヤと「ギア比」を追加しました (どちらも精密 v2 エンジンの任意装備・既定のままなら従来と完全に同じ)。レインは溝つき軟質コンパウンドで、乾いた路面ではノーマルに劣る (ピーク摩擦 0.85 倍) かわりに、濡れた路面ではグリップ低下分の 70% を排水で取り戻します。この2つから「どちらが速いかが入れ替わる路面グリップ g*=0.7987」が閉形式で決まり、卓上・中スケール・フルスケールのどこでも同じ値になります (実測の相対差 1.4e-16)。ただし速さの差が出るのは摩擦限界まで攻めているときだけで、フルスケール競技サーキットを grip 0.5 にするとレインが 3.93% 速い一方、卓上のウェット2コースではラップがほとんど変わりません — 卓上で出せる横加速度が濡れたノーマルの限界の 60% にも届かず、そもそも滑っていないためです (これは「卓上ではまず滑らない」という従来からの設計どおりで、正直に解説へ書きました)。ギア比は直結 (既定)・ロー・ハイ・2速オートマから選べます。減速比を上げると駆動トルクが増えて加速が鋭くなる代わりに最高速が下がり、下げると逆になります (0→50%速度 0.233→0.167 秒/最高速 102%→70% など。最高速の比は理論値 1/減速比 と 10^-16 で一致)。2速オートマは車速で自動変速して両取りを狙いますが、変速中は駆動が一瞬切れます。なおフルスケールではハイギアにしても最高速は伸びません — あちらの最高速は空力抗力が先に決めているためで、伸びない最高速のために加速だけ失います。装備は非既定を選んだときだけ HUD と記録条件 (verifyHash の素) に刻まれ、既定のままの過去の記録・卓上の挙動は byte 単位で不変です。

v6.3.0

Added an optional model of how light actually falls on the real ToF sensor (VL53L0X) — toolbar "ToF optics model (real-device)", default OFF. The default ranging is an idealization: it always returns the nearest reflecting surface inside the field-of-view cone. Real hardware does not. It reports a valid range only while the signal coming back from the target is strong enough (the setSignalRateLimit call in the library the real RumiCar uses is literally that threshold, default 0.25 MCPS), and that signal is proportional to reflectance x cos(incidence) / distance squared. When ON: (1) walls seen at a glancing angle, dark rival cars, and small targets that do not fill the field of view stop being measurable sooner (returning the out-of-range code -3); (2) with several surfaces inside the field of view you get a signal-weighted mixture of their distances; (3) cover-glass crosstalk makes distant readings come out slightly short. The law that effective range scales with the square root of (reflectance x cos incidence) is verified by measurement (against a 1.953 m reference: 1.397 m at reflectance 0.5, 1.647 m at 45 degrees incidence). The model is deterministic — it uses no randomness — so you can study this systematic error independently of the existing "sensor noise" option. With the default OFF nothing changes by a single bit, and official races always force it OFF. Measured with the three default samples, invalid readings rise from 0.01% to 4.56% and readings judged "open" rise from 15.79% to 21.65%, yet completions stay at 111/114 — so you can see for yourself whether "works in sim" means "robust on real hardware". Section 12 of the physics notes now carries the derivation and the measured numbers.

日本語

実機の ToF センサー (VL53L0X) の「光の当たり方」をモデル化する任意機能を追加しました (ツールバー「ToF 光学モデル(実機相当)」・既定 OFF)。既定の測距は「視野コーンの中で最も近い反射面を必ず返す」理想化ですが、実機はそうではありません。実機が有効な測距を報告するのは、標的から返ってくる信号が一定以上の強さのときだけで (実機 RumiCar が使うライブラリの setSignalRateLimit がまさにこのしきい値・既定 0.25 MCPS)、その信号は 反射率 × cos(入射角) ÷ 距離² に比例します。ON にすると (1) 斜めから見た壁・暗い他車・視野を埋めない小さな標的は早く測れなくなり (範囲外 -3 を返す) (2) 視野の中に複数の面があると信号加重で混ざった距離が返り (3) カバーガラスのクロストークで遠方がわずかに短めに出ます。有効レンジは √(反射率 × cos入射角) に比例する、という法則を実測で確かめてあります (基準 1.953m に対し 反射率0.5 で 1.397m・入射45° で 1.647m)。乱数を使わない決定論モデルなので、既存の「センサーノイズ」(ばらつき) とは独立に、系統的な誤差だけを試せます。既定 OFF では従来と 1 ビットも変わらず、公式レースでは常に OFF です。既定の3サンプルで実測したところ、無効測距が 0.01%→4.56% に増え「開いていると判断する読み」も 15.79%→21.65% に増えますが、それでも完走は 111/114 のまま変わりませんでした (=「sim で動く=実機でも頑健か」を自分の目で試せます)。物理解説 §12 に導出と実測値を追記しています。

v6.2.1

Measured whether mid-scale (outdoor-RC scale) driving really "breaks away the same way as the tabletop", and folded the results into the physics guide. The simulator links tabletop and mid-scale by Froude similarity (2x length, sqrt(2) speed), and the v2 engine's tire constants are inherited verbatim from the tabletop on the grounds that they are non-dimensional. Until now that inheritance was only checked as matching configuration values, never as observed behavior. So we swept the car through sideslip and measured, in both regimes, the angle at which the tire's lateral force peaks (the break-away angle) and the break-away ratio Ay* there. Similarity holds only as the three-way set of length, velocity and time, so we also scaled the time step by the same sqrt(2): across all eight combinations (four car types x normal/slip tires) the break-away angle matched exactly and the Ay* difference stayed within double-precision rounding (1e-16). We also confirmed that perturbing the mid-scale tire by 1% makes the test fail. We therefore concluded that no mid-scale-specific tire calibration is needed and changed no values. We also measured and documented, honestly, the two ways the similarity is not exact. (1) The physics step is fixed at 1/60 s in every regime, so in actual driving the break-away angle reads 16.75 degrees at tabletop versus 13.75 at mid-scale - but refine the step and both converge to 8.25 degrees, so this is step coarseness, not a difference in the model. (2) The bundled samples' decision distances are written in absolute millimetres (CONF=640 and so on) so they can be ported to the real device, and they do not follow the regime. Comparing lap times on a similar course (the course scaled 2x as well), the deviation from the expected value reaches 8.0%, but scaling the decision distances by 2 as well shrinks it to 1.7%. In other words, the dominant cause of "mid-scale feels different" is the program's length constants, not the tire. Finally, the test that decides whether to enable the faster wheel-integration scheme depends on speed and is not non-dimensional, so we measured that a similar regime flips schemes at a length factor of about 2.396, and put the fact that today's mid-scale (2x) sits at 83.5% of that cliff under permanent monitoring. The driving physics, the deterministic hashes f0-f3, and re-verification of official records are all unchanged (this release adds only documentation and tests).

日本語

中スケール (屋外RC相当) の走行が「卓上と本当に同じように滑り出すのか」を実測で確かめ、結果を物理解説に反映しました。このシミュレータは卓上と中スケールを Froude 相似 (長さ2倍・速度√2倍) で繋いでいて、v2 エンジンのタイヤ定数は「無次元だから」という理由で中スケールが卓上の値をそのまま引き継いでいます。この引き継ぎはこれまで設定値の一致としてしか検査されておらず、走らせた挙動では確かめていませんでした。そこで、車を横滑りさせてタイヤ横力がピークになる位置 (滑り出しの角度) と、そのときの滑り出し指標 Ay* を両領域で測りました。相似は「長さ・速度・時間」の3点セットで成立するため、時間の刻みも相似の√2倍にして比べたところ、4車種×通常/スリップタイヤの8通り全てで滑り出し角度が完全に一致し、Ay* の差も倍精度の丸め誤差 (10のマイナス16乗) の範囲でした。中スケールだけタイヤを1%ずらすと検査は落ちることも確認済みです。よって中スケール専用のタイヤ較正は不要と判断し、値は変更していません。あわせて、相似が完全ではない2点を正直に測って記載しました。①物理の刻みは全領域で1/60秒に固定されているため、実際の走行では滑り出し角度が卓上16.75度・中スケール13.75度とズレますが、刻みを細かくすると両者とも8.25度へ収束するので、これはモデルの違いではなく刻みの粗さの違いです。②組込サンプルの判定距離は実機へ移植できるよう絶対ミリメートル (CONF=640 など) で書いてあり領域に連動しません。コースも2倍にした相似コースで周回時間を比べると、期待値からの逸脱は最大8.0%ですが、判定距離も2倍にすると最大1.7%まで縮みました。つまり「中スケールだと様子が違う」の主因はタイヤではなくプログラム側の長さ定数です。また、車輪計算の高速化を有効にするかどうかの判定が速度に依存していて無次元でないため、相似領域を大きくしていくと長さ倍率2.396倍を境に計算方式だけが切り替わることを実測し、現行の中スケール (2倍) がその崖の83.5%の位置にあることを常設の検査で監視するようにしました。走行物理・決定論ハッシュ f0〜f3・公式記録の再検証はすべて不変です (本更新は解説文と検査の追加のみ)。

v6.2.0

Calibrated the parameters for hosting official races (the balance class and filler cars) against measurement. The balance class lets you build a car by spending a fixed budget (100 points by default) across its parameters, and we checked with the real race engine whether the initial weighting produced a single dominant build. Six budget-maxing build philosophies (top speed, grip, light weight, drift-equipped, balanced, and braking) were raced against the default sample across 39 courses; the winner was spread across all six builds (the most frequent winner took only 41% of races), so no single build was dominating. The cost weights themselves were left unchanged. Next, we measured whether the five filler cars (BOT-1 to 5) - used to fill out a race when there are not enough entries - can actually finish. Two of them used a program tuned specifically for the full-scale competition circuit, and away from that one course it finished only 10 of 39 courses, contradicting the pool's stated design goal of "aiming to finish on any course." All five were switched to the already-hardened built-in samples; measured as a group of five, the number of (filler car, course) pairs that finished rose from 79 of 195 (40.5%) to 115 of 195 (59.0%). We also added a mechanism to freeze a filler car's program text into the official record. Previously fillers were referenced only by program name, so improving a sample later could change how an old official record that used a filler car re-verifies (no such record exists yet); the text can now be baked in at record-creation time, so filler cars will reproduce just as reliably as regular entries going forward. The driving physics, the deterministic hashes f0-f3, and re-verification of existing official race records are all unchanged.

日本語

公式レース開催 (バランスクラス・補充車) のパラメータを実測で較正しました。バランスクラスは各パラメータに予算 (既定100点) を配分してビルドする方式ですが、初期の重み付けが「単一の最強ビルド」を生んでいないかを、実際に car を組んで本番のレースエンジンで走らせて確かめました。予算を使い切る6通りの方向性のビルド (最高速志向・グリップ志向・軽量志向・ドリフト併用・バランス・制動志向) を作り、既定サンプルで39コースを走らせたところ、優勝したビルドは6通り全てに分散し (最多でも優勝の41%)、単一ビルドが支配する状況にはなっていませんでした。重み付けは変更していません。次に、参加台数が足りないときに補充される5台 (BOT-1〜5) の完走可能性を実測したところ、うち2台がフルスケール競技サーキット専用に調整されたプログラムを使っており、そのコース以外では39コース中10コースしか完走できていませんでした (「どのコースでも完走を狙える」という設計意図に反する状態)。5台とも既存の頑健な組込サンプルへ差し替え、5台グループでの完走実績を (補充車,コース) ペアで 195中79 (40.5%) から 195中115 (59.0%) へ改善しました。あわせて、補充車のプログラム本文を公式記録側へ凍結できる仕組みを追加しました。従来は補充車だけプログラム名で参照する方式のため、後日サンプルを改良すると補充車を含む古い公式記録の再検証結果が変わってしまう問題がありましたが (現時点でそのような記録はまだ存在しません)、記録作成時に本文を焼き込めるようにしたことで、以後は補充車もエントリーと同様に再現性を保てます。走行物理・決定論ハッシュ f0〜f3・既存の公式レース記録の再検証は不変です。

v6.1.0

Learning programs that use arrays can now be written in Arduino C++, and C versions of the two advanced samples that previously existed only in Python have been added. Until now the C side could already use arrays (declaration, indexing, multiple dimensions, brace initializers), but a few things you hit as soon as you actually write one were missing: (1) passing an array to a function, int f(int a[], int n), was a syntax error; (2) the standard idiom for the number of elements, sizeof(a)/sizeof(a[0]), was unavailable; and (3) the constants that give an array its length, such as const int N = 72;, as well as static, were syntax errors. All three now work. In addition, (4) writing char s[] = "ab"; silently produced an empty array with no error at all - a trap with no visible cause. It now reports clearly, with a line number, that this form is not supported. Note that sizeof follows a simplified model and returns an element count. That differs from the byte count on real hardware, but even on a real Arduino sizeof(int) is 2 on some boards and 4 on others, so the byte semantics are not unique; the behaviour chosen is the one that makes the idiom sizeof(a)/sizeof(a[0]) give the correct element count (this is stated in the specification dialog and in the physics-model document). On top of that, Arduino C++ versions of "Recon Racer" (which learns the course on a reconnaissance lap) and "Self-Locator" (which estimates where on the course it currently is) have been added; the Python versions remain as they were. Whether the ports really behave identically is machine-checked by a standing test: run on the same course with the same car, the per-frame controls (steering, drive direction, PWM), every element of the learned map and probability distribution, the trajectory hash and the final coordinates all match the Python versions exactly (measured: identical across all 12,863 frames). The driving physics, the deterministic hashes f0-f3, official race records, practice records and share URLs are all unchanged.

日本語

Arduino C++ で「配列」を使う学習プログラムが書けるようにし、Python でしか用意できなかった上級サンプル2本の C 版を追加しました。これまで C 側は、配列そのものは使えたものの (宣言・添字・多次元・波括弧初期化)、実際に書こうとすると詰まる箇所が残っていました。具体的には ①関数に配列を渡す書き方 int f(int a[], int n) が構文エラーになる ②配列の要素数を取る定石 sizeof(a)/sizeof(a[0]) が使えない ③配列の長さを決める定数 const int N = 72; や static が構文エラーになる、の3点です。いずれも書けるようにしました。また ④char s[] = "ab"; と書くと、エラーも出ないまま中身が空の配列になってしまう状態でした (原因が分からない罠です)。未対応であることを行番号つきのメッセージではっきり伝えるようにしています。なお sizeof は「要素数」を返す簡易仕様です — 実機のバイト数とは異なりますが、実機 Arduino でも sizeof(int) はボードによって 2 だったり 4 だったりして一意ではないため、定石 sizeof(a)/sizeof(a[0]) が要素数として正しく動く側を選びました (仕様ダイアログと物理モデル解説に明記しています)。そのうえで、コースを試走で覚える『Recon Racer』と、自分がコースのどこにいるかを推定する『Self-Locator』の Arduino C++ 版を追加しました (Python 版はそのまま残ります)。移植が本当に同じ動きかは、同じコース・同じ車で走らせて、毎フレームの操作 (操舵・駆動・PWM)・学習した地図と確率分布の全要素・走行軌跡のハッシュ・終端座標がPython 版と完全に一致することを常設の検査で機械確認しています (実測: 12,863 フレームすべて一致)。走行物理・決定論ハッシュ f0〜f3・公式レース記録・練習記録・共有 URL はすべて不変です。

v6.0.0

Fixed the lap conditions for races and made the three built-in samples more robust. First, a touge course is a one-way run from start to goal, yet a race required the same "number of laps" as a circuit, so with the default of 3 laps nobody could ever finish (it was unreachable for any program). A touge race now finishes when you reach the goal. Second, on open courses that have no finish line at all ("Drift Plaza" and "Competition Ground"), laps cannot be counted even in principle, yet a race could still be started and every car simply timed out. The race no longer starts and the reason is shown instead (solo driving with the play button works as before). The built-in samples "Apex Hunter", "Traction Blitz" and "Steady Nose" gained a back-up-and-retry move for dead ends, plus a fix so they steer away from whichever wall is actually nearer. Three-position steering has a fixed minimum turning radius, so a corner tighter than that cannot be taken without backing up. To avoid false triggers the move does not fire merely because a wall is close: it fires only while the front stays close AND fails to open up, and the steering is held fixed while reversing (measured across the 39 courses where finishing is defined: the three default cars finish 75 -> 103 out of 117, courses where all three finish go from 13 to 30, and courses where none finish drop from 4 to 2). The course difficulty stars were also re-derived from the current measurements for 17 courses (rain courses still keep at least three stars). IMPORTANT - what no longer reproduces: because the default samples behave differently, the deterministic hashes f0 and f1 for the tabletop oval have been re-stamped to new values (the old values are kept in the history). Official race records are unaffected because they freeze the program source on the record side. The one exception is the filler cars BOT-2/BOT-3/BOT-5 used when there are not enough entries: they refer to the default samples by name, so any official record that included a filler car would re-verify differently (no such record exists today). The verifyHash of the canonical official record (Competition Circuit) is unchanged. The driving physics itself (physics/contact/sensors/fleet) is unchanged by a single line.

日本語

レースの周回条件を直し、組込サンプル3種を頑健にしました。まず、峠コースはスタートからゴールまでの片道なのに、レースは周回コースと同じ「指定周回数」を完走条件にしていたため、既定の3周のままでは誰も完走できませんでした (どんなプログラムでも到達できない状態でした)。峠はゴール到達で完走とするよう直しています。次に、ゴールライン自体を持たない開けたコース (『ドリフト広場』『競技グラウンド』) では周回が原理的に数えられないのに、レースを開始できてしまい全車が時間切れになっていました。開始せず理由を表示するようにしました (ソロ走行 ▶ は従来どおり使えます)。組込サンプル『Apex Hunter』『Traction Blitz』『Steady Nose』には、行き止まりで下がって切り返す動きと、左右のうち近い方の壁から離れる修正を入れました。3値の操舵は最小旋回半径が決まっているので、それより小さいコーナーは切り返さないと通れません。誤作動を避けるため、単に壁が近いだけでは発動せず「近い」かつ「前方が開いてこない」が続いたときだけ発動し、後退中は舵を固定します (実測: 完走が定義される39コースで、既定3台の完走は 117台中 75→103台、全3台完走は 13→30コース、1台も完走できないコースは 4→2コースへ改善)。コース難易度★も現在の実測に合わせて17件更新しました (雨のコースは従来どおり★3以上を保っています)。【重要・再現しなくなるもの】既定サンプルの挙動が変わるため、卓上オーバルの決定論ハッシュ f0・f1 を新しい値へ刻み直しました (旧値は履歴として保存しています)。公式レース記録はプログラム本文を記録側に凍結しているため影響を受けません。ただし参加台数が足りないときに補充される BOT-2/BOT-3/BOT-5 だけは既定サンプルを名前で参照するため、補充車を含む公式記録があれば再検証の結果が変わります (現時点でそのような記録は存在しません)。正準の公式記録 (競技サーキット) の verifyHash は不変です。走行物理そのもの (physics/contact/sensors/fleet) は1行も変えていません。

v5.4.0

Made startup faster. The 41 JavaScript modules that make up the app used to be discovered in four dependency waves, so the network round trips piled up. On top of that, this changelog itself (124KB), shown when you hover the version badge, lived in the same file as the settings needed to draw the course, so everyone paid for it at every startup even if they never opened it. The changelog now lives in its own file and is fetched after the first course has been drawn, the one large late-discovered module is preloaded, and the first draw no longer waits for the next animation frame (measured over a 40ms/10Mbps link, median of 7 runs: start to first course drawn 700ms -> 608ms, worst case 894ms -> 767ms; JavaScript downloaded 469KB -> 425KB). The very first paint (the startup animation) does arrive slightly later, 260ms -> 292ms, as the cost of that preload. In addition, the course walls, grid and finish line - which never move while you drive - were being redrawn every frame; they are now drawn once and blitted while the picture cannot change (measured on the wall-heaviest course, "Wet Technical (rain)" with 960 walls: 2.44ms -> 0.015ms, giving back about 15% of the 16.7ms budget at 60fps). That the picture is unchanged - including course editing, theme changes and zoom - is verified by a full pixel-by-pixel comparison across all 41 courses. Driving physics, the deterministic hashes f0-f3, official race records, practice records and share URLs are all unchanged.

日本語

起動を速くしました。従来はアプリを構成する 41 本の JavaScript を、依存関係をたどりながら4 段階に分けて読み込んでいたため、通信の往復待ちが積み上がっていました。あわせて、版バッジのホバーで出るこの変更履歴 (124KB) が、コース描画に必要な設定ファイルに同居していて、履歴を見ない人も起動のたびに読まされていました。履歴を別ファイルへ分け、初回のコース描画が済んだあとに読むようにし、発見の遅い大きなモジュールだけ先読みを指示し、初回描画を次の描画タイミングまで待たずに行うようにしました (実測・往復遅延 40ms/10Mbps 回線・7 回の中央値: 起動〜初回コース描画 700ms → 608ms、最悪値 894ms → 767ms。読み込む JavaScript は 469KB → 425KB)。なお最初の画面 (起動アニメ) が出るまでは先読みのぶん 260ms → 292ms とわずかに遅くなります。さらに、走行中は毎フレーム引き直していたコースの壁・グリッド・フィニッシュラインを、絵が変わらない間は描き置きから貼るようにしました (最も壁の多い『ウェットテクニカル (雨)』960 壁で実測 2.44ms → 0.015ms/60fps の予算 16.7ms の約 15% を返上)。コース編集・テーマ変更・拡大表示でも絵が変わらないことは全 41 コースの全画素比較で機械確認しています。走行物理・決定論ハッシュf0〜f3・公式レース記録・練習記録・共有 URL はすべて不変です。

v5.3.0

Improved the layout on wide screens. The page width used to be capped at 1500px, which left unused margins on large displays, so even with several cars side by side only about one program column was visible. Width beyond 1500px is now allocated preferentially to the car columns, and each car card becomes flexible (300-480px) when there is room (on a 1920px screen with 3 cars, fully visible cards go from 1 to 2 and each editor is about 30% wider). The course view keeps at least its previous width at every screen size. Also, the "Simulator" item in the site top menu now opens this full-screen simulator directly instead of going through the embed page. One more fix: in the leaderboard at the top right, the "(was vX)" note shown when a practice best-lap record was set on an older engine version overflowed the panel and ran off the canvas, so it could not be read (measured: 282px in Japanese and 336px in English against an inner width of 244px; in English it already overflowed at 252px even without the note). The panel now widens automatically to the measured width of the note, and on narrow screens the note itself shrinks so that it always fits (a display-only fix; standings and record values are unchanged). Driving physics, the deterministic hashes f0-f3, official race records, practice records and share URLs are all unchanged.

日本語

ワイド画面でのレイアウトを改良しました。従来はページ全体の幅を 1500px で頭打ちにしていたため、広い画面では左右に使われない余白ができ、車両を複数台並べてもプログラム欄が1台分しか見えませんでした。1500px を超える幅は車両カード側へ優先的に割り当て、車両カード自体も余りがあれば広がる可変幅 (300〜480px) にしました (1920px 画面・3台で完全に見えるカードが1枚→2枚、各エディタ幅は約3割拡大)。コース表示の幅はどの画面幅でも従来以上を維持します。あわせて、サイト上部メニューの「シミュレータ」からは埋め込みページを経由せず直接この全画面シミュレータが開くようになりました。もうひとつ、画面右上のリーダーボードで、旧エンジン版で樹立された練習ベスト記録があるときに併記される「(当時 vX)」注記が、枠と画面の外へはみ出して読めなくなっていた不具合を直しました (実測: 日本語 282px / 英語 336px に対し枠の内幅は 244px。英語表示では注記なしでも 252px で溢れていました)。注記の実測幅に合わせて枠の幅を自動で広げ、画面が狭いときは注記側を縮めて必ず収まるようにしています (表示のみの是正・順位や記録の中身は不変)。走行物理・決定論ハッシュ f0〜f3・公式レース記録・練習記録・共有 URL はすべて不変です。

v5.2.0

Community content loaded from GitHub at startup (community programs, courses, car types, and official race details) is now fetched in parallel instead of one-by-one, so the wait gets shorter as the number of posts grows (menu ordering and the skip-one-failure robustness are unchanged). As internal housekeeping, the deterministic FNV-1a hash function that had been duplicated in two files is now a single shared module (its output is exactly identical); the version badge fallback shown when the page is opened with JavaScript disabled, which had been left at an old version (v5.0.0), has been corrected, and a standing gate now machine-checks this "version mismatch" so it cannot recur. Another standing gate now verifies, with measurements from real races, the margin of the teleport-suppression cap used by the spectator-replay distance accounting. The driving physics, the deterministic hashes f0-f3, official race records, practice records and share URLs are all unchanged.

日本語

起動時の GitHub 読み込み (みんなの投稿プログラム・投稿コース・投稿車種・公式レース詳細) を1件ずつの順番待ちから並列取得へ変えました。件数が増えるほど待ち時間が短くなります (表示メニューの並び順・1件失敗をスキップする堅牢さは従来どおり)。あわせて内部整理として、決定論ハッシュ関数 FNV-1a の同一実装が2ファイルに複製されていたのを単一モジュールへ統合し (出力は完全に同一)、ページを JavaScript 無効で開いたときの版バッジのフォールバック表示が古い版 (v5.0.0) のまま残っていたのを是正し、この「版表記の食い違い」を今後は機械検査で防ぐ常設ゲートを追加しました。観戦リプレイの距離集計に使うテレポート抑制上限も、実レースの実測でマージンを確認する常設ゲートを追加しました。走行物理・決定論ハッシュ f0〜f3・公式レース記録・練習記録・共有 URL はすべて不変です。


Verifying this release yourself

cd Simulator
node wf_run_all.mjs        # the full assertion-gate suite

The suite runs from a fresh clone with no dependencies beyond Node.js.
The real-browser checks under Simulator/browser/ additionally need npm install and a display.