From 31cb9879ccb2a7cbb1d51984b687846868b57917 Mon Sep 17 00:00:00 2001 From: sergeypdev Date: Tue, 18 Mar 2025 03:12:43 +0400 Subject: [PATCH] Pacejka 96 for tyre friction, combined friction using the Beckman method --- .gitignore | 1 + game/game.odin | 4 +- game/physics/pacejka.odin | 22 +++++++ game/physics/simulation.odin | 64 ++++++++++++++++---- research/pacejka96.ipynb | 110 +++++++++++++++++++++++++++++++++++ 5 files changed, 188 insertions(+), 13 deletions(-) create mode 100644 game/physics/pacejka.odin create mode 100644 research/pacejka96.ipynb diff --git a/.gitignore b/.gitignore index 2e2d2ff..622087a 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,4 @@ linux atlas.png pdbs/ game_web/ +.venv diff --git a/game/game.odin b/game/game.odin index 6c2f232..db3934a 100644 --- a/game/game.odin +++ b/game/game.odin @@ -393,9 +393,9 @@ update_runtime_world :: proc(runtime_world: ^Runtime_World, dt: f32) { front_wheels := turn_wheels back_wheels := drive_wheels - DRIVE_IMPULSE :: 2000 + DRIVE_IMPULSE :: 4000 BRAKE_IMPULSE :: 500 - TURN_ANGLE :: -f32(20) * math.RAD_PER_DEG + TURN_ANGLE :: -f32(30) * math.RAD_PER_DEG // 68% front, 32% rear BRAKE_BIAS :: f32(0.68) diff --git a/game/physics/pacejka.odin b/game/physics/pacejka.odin new file mode 100644 index 0000000..87e3869 --- /dev/null +++ b/game/physics/pacejka.odin @@ -0,0 +1,22 @@ +package physics + +import "core:math" + +Pacejka96_Params :: [11]f32 + +DEFAULT_PACEJKA96_PARAMS :: Pacejka96_Params{1.6, 0, 1688, 0, 229, 0, 0, 0, -10, 0, 0} + +// X is slip ratio percentage [-100, 100] or slip angle in degrees, where positive angle is turning left +// Output is the friction coefficient +pacejka_96 :: proc(b: Pacejka96_Params, x: f32, f_z: f32, s_v: f32 = 0) -> f32 { + C := b[0] + D := (b[1] * f_z + b[2]) * f_z + B := ((b[3] * f_z * f_z + b[4] * f_z) * math.exp(-b[5] * f_z)) / (C * D) + E := -(1 - (b[6] * f_z * f_z + b[7] * f_z + b[8])) + s_h := b[9] * f_z + b[10] + + X := x + s_h + y := D * math.sin(C * math.atan(B * X - E * (B * X - math.atan(B * X)))) + Y := y + s_v + return Y / (f_z * 1000) +} diff --git a/game/physics/simulation.odin b/game/physics/simulation.odin index 1f08fe4..83d760e 100644 --- a/game/physics/simulation.odin +++ b/game/physics/simulation.odin @@ -4,6 +4,7 @@ import "bvh" import "collision" import "core:container/bit_array" import "core:fmt" +import "core:log" import "core:math" import lg "core:math/linalg" import "core:math/rand" @@ -549,24 +550,67 @@ pgs_solve_suspension :: proc(sim_state: ^Sim_State, config: Solver_Config, dt: f apply_velocity_correction(body, incremental_impulse * dir, wheel_world_pos) } + body_right := body_local_to_world_vec(body, Vec3{1, 0, 0}) right := wheel_get_right_vec(body, v) - contact_patch_linear_vel := - body_vel_at_contact_patch + (v.radius * v.w * forward) + // Positive means spinning forward + wheel_spin_vel := -v.radius * v.w + ground_vel := lg.dot(body_vel_at_contact_patch, forward) + // contact_patch_linear_vel := + // body_vel_at_contact_patch + (v.radius * v.w * forward) + + slip_ratio := + ground_vel == 0 ? 0 : clamp(wheel_spin_vel / ground_vel - 1, -1, 1) + slip_angle := + lg.angle_between(forward, body_vel_at_contact_patch) * math.DEG_PER_RAD + + OPTIMAL_SLIP_RATIO :: f32(0.075) + OPTIMAL_SLIP_ANGLE :: f32(8) + MAX_SLIP_LEN :: f32(2.0) + + slip_vec := Vec2 { + slip_angle / OPTIMAL_SLIP_ANGLE / MAX_SLIP_LEN, + slip_ratio / OPTIMAL_SLIP_RATIO / MAX_SLIP_LEN, + } + + slip_len := lg.length(slip_vec) + slip_len = slip_len == 0 ? 0 : min(slip_len, 1) / slip_len + slip_vec *= slip_len + + log.debugf("slip_vec: %v", slip_vec) + + long_friction := + abs( + pacejka_96( + DEFAULT_PACEJKA96_PARAMS, + slip_ratio * 100, + max(abs(v.spring_impulse), 0.001) * inv_dt * 0.001, + ), + ) * + abs(slip_vec.y) + lat_friction := + abs( + pacejka_96( + DEFAULT_PACEJKA96_PARAMS, + slip_angle, + max(abs(v.spring_impulse), 0.001) * inv_dt * 0.001, + ), + ) * + abs(slip_vec.x) // Longitudinal friction if true { - vel_long := lg.dot(contact_patch_linear_vel, forward) + // Wheel linear velocity relative to ground + relative_vel := ground_vel - wheel_spin_vel - friction := f32(1) - friction_clamp := abs(v.spring_impulse) * friction + friction_clamp := abs(v.spring_impulse) * long_friction w_body := get_body_inverse_mass(body, forward, v.hit_point) w_long := w_body + v.inv_inertia inv_w_long := 1.0 / w_long - incremental_impulse := -inv_w_long * vel_long + incremental_impulse := -inv_w_long * relative_vel new_total_impulse := clamp( v.longitudinal_impulse + incremental_impulse, -friction_clamp, @@ -583,9 +627,7 @@ pgs_solve_suspension :: proc(sim_state: ^Sim_State, config: Solver_Config, dt: f vel_contact := body_vel_at_contact_patch lateral_vel := lg.dot(right, vel_contact) - - friction := f32(1) - friction_clamp := -v.spring_impulse * friction + friction_clamp := -v.spring_impulse * lat_friction incremental_impulse := -inv_w_normal * lateral_vel new_total_impulse := clamp( @@ -596,7 +638,7 @@ pgs_solve_suspension :: proc(sim_state: ^Sim_State, config: Solver_Config, dt: f applied_impulse := new_total_impulse - v.lateral_impulse v.lateral_impulse = new_total_impulse - apply_velocity_correction(body, applied_impulse * right, v.hit_point) + apply_velocity_correction(body, applied_impulse * body_right, v.hit_point) } } else { v.lateral_impulse = 0 @@ -651,7 +693,7 @@ pgs_substep :: proc(sim_state: ^Sim_State, config: Solver_Config, dt: f32, inv_d p := body_local_to_world(body, s.rel_pos) hit_p := body_local_to_world(body, s.rel_pos + s.rel_dir * s.hit_t) forward := wheel_get_forward_vec(body, s) - right := wheel_get_right_vec(body, s) + right := body_local_to_world_vec(body, Vec3{1, 0, 0}) apply_velocity_correction( body, diff --git a/research/pacejka96.ipynb b/research/pacejka96.ipynb new file mode 100644 index 0000000..d98bd49 --- /dev/null +++ b/research/pacejka96.ipynb @@ -0,0 +1,110 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import Symbol, sin, atan, exp\n", + "from sympy.plotting import plot\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "def pacejka96(b, x, Fz, Sv, Sh):\n", + " C = b[0]\n", + " D = (b[1] * Fz + b[2]) * Fz\n", + " B=((b[3]*Fz^2+b[4]*Fz)*exp(-b[5]*Fz))/(C*D)\n", + " E = -(1 - (b[6] * Fz^2 +b[7] * Fz + b[8]))\n", + " Sh=b[9]*Fz+b[10]\n", + " Sv=0\n", + " \n", + " X = x + Sh\n", + " y = D * sin(C * atan(B * X - E * ( B * X - atan(B * X))))\n", + " Y = y + Sv\n", + " return Y" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Pacejka coefficients\n", + "b = [\n", + " 1.6,\n", + " 0,\n", + " 1688,\n", + " 0,\n", + " 229,\n", + " 0,\n", + " 0,\n", + " 0,\n", + " -10,\n", + " 0,\n", + " 0\n", + "]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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1VcrLy/PpzV3tNZ+U00mk+d3IVC+IytXrtSPfvQjpaamymQyafHixc1eNwxDjz76qFJSUhQaGqrJkydr9+7dzdYpLi7Wddddp6ioKMXExOimm25SZWWl196DT1vs7Ha7rrnmGo0bN06vvfZai9edTqcuu+wyJScna/Xq1crJydGMGTMUFBSk3/3ud5K7a+myyy7TnDlz9NZbb2nZsmW6+eablZKSoilTpvjgXbWv8ePHKycnp9myRx55RMuWLdPZZ5/dbPnSpUs1ePBgz/P4+Hiv1ekLTzzxhGbPnu15HhkZ6XlcXl6uSy65RJMnT9ZLL72kLVu2aNasWYqJidEtt9zio4o71s6dO+VyufTyyy+rT58+2rp1q2bPnq0ePXqoqqpKL7zwggoLCyVJw4cP1+jRozVkyBANHjxYw4YN83X5HaLx/Lry/EOSpK+//lqvvvqqpkyZoszMTHXr1s3HFXa8r776SnfccYdGjx4th8Ohhx56SJdccom2b9+u8PBwz3qzZ8/WE0884XkeFhbmo4q9Y/DgwVq6dKnnudV65J/De+65R//5z3/0/vvvKzo6WnfeeaeuuuoqrVq1ykfVdrz169fL6XR6nm/dulUXX3xxs0v5BcJ3pKqqSsOHD9esWbN01VVXtXh9wYIF+uMf/6i//e1v6tWrlx555BFNmTJF27dvV0hIiCTpuuuuU05OjpYsWaL6+nrdeOONuuWWW/T22297500YncDChQuN6OjoFss//fRTw2w2G7m5uZ5lf/nLX4yoqCijrq7OMAzDuO+++4zBgwc322769OnGlClTvFC599ntdiMxMdF44oknPMuysrIMScb333/v09q8KT093Xj++eeP+fqf//xnIzY21vM9MQzDuP/++43+/ft7qcLOYcGCBUavXr08z1evXm1IMu644w7jJz/5idGnTx/DbDYbwcHBxrBhw3xaa0d4b322kX7/J8bIO/9sSDLKysoMp9NppKamGvPnz/d1eT6Rn59vSDK++uorz7JJkyYZd999t0/r8qbHHnvMGD58eKuvlZaWGkFBQcb777/vWbZjxw5DkrFmzRovVulbd999t3HmmWcaLpfLMALwO2I0TAVnfPjhh57nLpfLSE5ONp5++mnPstLSUsNmsxn/+Mc/DMMwjO3btxuSjPXr13vW+eyzzwyTyWQcPnzYK3V36kuKrVmzRkOHDvVMXCpJU6ZMUXl5ubZt2+ZZZ/Lkyc22mzJlitasWeP1er3h448/VlFRkWeW/qYuv/xydevWTRMmTNDHH3/sk/q86amnnlJ8fLxGjhypp59+ulkX/Zo1azRx4kQFBwd7ljW20pSUlPioYu8rKytTXFyc53lKSork/h599dVXSkpK0ttvv61ly5b5ZUtmTmm1JKlH0pHPwGw2a/LkyX77G3EiZWVlktTseyFJb731lhISEjRkyBA9+OCDqq6u9lGF3rF7926lpqaqd+/euu6665SdnS1J2rhxo+rr65v9uzJgwAD16NEjYL4zdrtdb775pmbNmtXsgvOB9h05WlZWlnJzc5t9N6KjozV27FjPd2PNmjWKiYlp1qM2efJkmc1mrV271it1durBE7m5uc1CnSTP89zc3OOuU15erpqaGoWGhnqx4o732muvacqUKTrjjDM8yyIiIvTss8/q3HPPldls1gcffKArr7xSixcvbnaSvD/5xS9+obPOOktxcXFavXq1HnzwQeXk5Oi5556T3N+LXr16Ndum6XcnNjbWJ3V70549e/SnP/1JzzzzjGfZQw89pOnTp+uee+6R2WzW66+/rmuvvVZvv/22X55jd7CgIcQkxzT/HUhKStLOnTt9VJXvuFwu/fKXv9S5557b7ModP//5z5Wenq7U1FRt3rxZ999/vzIzM/Wvf/3Lp/V2lLFjx2rRokXq37+/cnJy9Pjjj+u8887T1q1blZubq+Dg4BbnfSclJXn+3fF3ixcvVmlpqWbOnOlZFmjfkdY0/vdvLXM0zSRHn+JhtVoVFxfnte9Puwe7Bx54QL///e+Pu86OHTuanagaiE7lczp06JC++OILvffee83WS0hI0Ny5cz3PR48erR9++EFPP/10lwp2J/OZNH2/w4YNU3BwsG699VbNnz+/U17i5XScynfl8OHDmjp1qq655ppm5yEuX75cixcv1tixY1VaWqr3339fZrNZM2fO1KhRo9SvX78OfS/eVlRVL0mKsXXqzgmvueOOO7R161Z98803zZY3ba0dOnSoUlJSdNFFF2nv3r0688wzfVBpx5o2bZrn8bBhwzR27Filp6frvffe87vGgFPx2muvadq0aUpNTfUsC7TvSFfW7sFu3rx5zVJ+a3r37t2mfSUnJ7cYvdY4Mik5Odlzf/Ropby8PEVFRXXqP9BT+ZwWLlyo+Pj4NoW1sWPHasmSJaddpzedzndn7Nixcjgc2r9/v/r373/M74WafHe6ipP9XH744QddcMEFGj9+vF555ZVm65WVlal79+6SpA8++EDJycl6+OGH9etf/1oPPPCA3/3fd1njFHZ1Fc2W5+Xldbnvwem688479cknn2jlypXNWvxbM3bsWMnd6hsI/2jHxMSoX79+2rNnjy6++GLZ7XaVlpY2a7ULlO/MgQMHtHTp0hP+FgTad0RN/u3Iy8vznNbS+HzEiBGedfLz85tt53A4VFxc7LXvT7sHu8TERCUmJrbLvsaNG6cnn3xS+fn5nqbNJUuWKCoqSoMGDfKs8+mnnzbbbsmSJRo3bly71NBRTvZzMgxDCxcu9IwKPpGMjIxmX7yu4HS+OxkZGTKbzZ7vybhx4/TrX/9a9fX1ns9ryZIl6t+/f5frhj2Zz+Xw4cO64IILNGrUKC1cuFBmc/OWqrS0NGVlZSktLU3vv/++Zs6cqW3btik9Pd0vR/wVVTUku71bMzzLXC6Xli1bpjvvvNOHlXmPYRi666679OGHH2rFihUtTlFoTUZGw+fV1X5DTlVlZaX27t2r66+/XqNGjVJQUJCWLVumq6++WpKUmZmp7OzsTv/vSntYuHChunXrpssuu+y46wXad0SSevXqpeTkZC1btswT5MrLy7V27VrddtttkvvfntLSUm3cuFGjRo2S3D0lLpfLE4Y7nFeGaBzDgQMHjO+//954/PHHjYiICOP77783vv/+e6OiosIwDMNwOBzGkCFDjEsuucTIyMgwPv/8cyMxMdF48MEHPfvYt2+fERYWZtx7773Gjh07jBdffNGwWCzG559/7sN31v6WLl1qSDJ27NjR4rVFixYZb7/9trFjxw5jx44dxpNPPmmYzWbj9ddf90mtHW316tXG888/b2RkZBh79+413nzzTSMxMdGYMWOGZ53S0lIjKSnJuP76642tW7ca77zzjhEWFma8/PLLPq29Ix06dMjo06ePcdFFFxmHDh0ycnJyPLdGV199tZGenm7MmTPHsFqtxty5cw2z2Ww8+eSTRlhYmE/r7wgDH/nMSL//EyM0sYchyVi3bp1xyy23GDExMc1G2/uz2267zYiOjjZWrFjR7DtRXV1tGIZh7Nmzx3jiiSeMDRs2GFlZWcZHH31k9O7d25g4caKvS+8w8+bNM1asWGFkZWUZq1atMiZPnmwkJCQY+fn5hmEYxpw5c4wePXoYy5cvNzZs2GCMGzfOGDdunK/L7nBOp9Po0aOHcf/99zdbHkjfkYqKCk8WkWQ899xzxvfff28cOHDAMAzDeOqpp4yYmBjjo48+MjZv3mxcccUVRq9evYyamhrPPqZOnWqMHDnSWLt2rfHNN98Yffv2NX72s5957T34NNjdcMMNhqQWty+//NKzzv79+41p06YZoaGhRkJCgjFv3jyjvr6+2X6+/PJLY8SIEUZwcLDRu3dvY+HChT54Nx3rZz/7mTF+/PhWX1u0aJExcOBAIywszIiKijLGjBnTbKi+v9m4caMxduxYIzo62ggJCTEGDhxo/O53vzNqa2ubrbdp0yZjwoQJhs1mM7p372489dRTPqvZGxYuXNjq31PT/39buHChkZiYaJjNZsNms3m+K2+88YYxYMAAn9bf3ipq6430+z8x0u//xHjy908bkoygoCBjzJgxxrfffuvr8rzmWN+Jxt/J7OxsY+LEiUZcXJxhs9mMPn36GPfee69RVlbm69I7zPTp042UlBQjODjY6N69uzF9+nRjz549ntdramqM22+/3YiNjTXCwsKMH//4x83+B8lfffHFF4YkIzMzs9nyQPqOfPnll63+vdxwww2G4Z7y5JFHHjGSkpIMm81mXHTRRS0+r6KiIuNnP/uZERERYURFRRk33nijp8HKG0xGwx8+gAD29NNPq7a2Vo888oivS2k3WYVVuuCZFQoPtmjNr8YrOjpaZWVlioqK8nVpANBhOvV0JwC849577/V1Ce0uv7zhqhOJkf41ShoAjoc5AAA/1zjxalsdPny4w2rxpoLKhuvEdosM8XUpAOA1BDvAz40ePVq33nqr1q9ff8x1ysrK9Ne//lVDhgzRBx984NX6Okp+eUOwS4yixQ5A4KArFvBzl112mSIiInTxxRcrJCREo0aNUmpqqkJCQlRSUqLt27dr27ZtOuuss7RgwQJdeumlvi65XeRXuINdBMEOQOAg2AF+7s0339TBgwf1m9/8RomJiUpJSVFhYaFqamqUkJCg6667TlOmTGl2iSl/UOAOdt1osQMQQAh2gJ9LTU1VRkaGpkyZopqaGv3ud79rcS1Df5Rf4R48QYsdgADCOXaAn5s3b55+9KMf6bzzzpPJZNJbb72l9evXq6amxteldagjLXYMngAQOAh2gJ+76667tGHDBk2dOlWGYejFF1/UuHHjFBUVpYEDB+raa6/VU089pc8++8zXpbYrT7BjuhMAAYQJioEA0rdvX61Zs0bh4eHavHmzMjIyPLetW7eqoqLC1yW2i3qnS31/3RBUNzw8WcGuOiYoBhAQOMcOCCC7d+/2PB47dmyzi1J3lf/H+9WvfqU9e/Zo8eLFkqRbb71VlZWVeuuttzzrFFXaJUlWs0lxYcGqdM9pBwD+jmAHQJJkMpl8XUKbZGRkaMKECZ7n8+fPl83WvLu1ceBEQoRNZnPXeF8A0B44xw5Al7Jp0yaNGDHC8zwuLk7h4eHN1mk8v47LiQEINAQ7AJ2Ky+XS7373O/Xt21chISFKSkrSzJkzJUmHDh1SYWGhhg8fLknav3+/TCaT9u/fr9zcXJlMJv2///f/dNd9D0uStm9co2+++can7wcAvIlgB6BTmT9/vt555x298soryszM1IcffqiJEydK7m7Y6Oho9erVS3K33sXExKhnz57KyMiQJL3++uuacsVPJUmRQYauu+46uVwuH74jAPAegh2ATuWLL77Qj370I11wwQVKT0/X+PHjNWvWLMkd7Bpb6xqfDxs2THKHvKCgIH300UcKT0iWJE2eMEbZ2dn64YcfTqqGffv26eOPP/Y8X758uZ599tl2eocA0HEIdgA6lcsvv1xPPfWUpkyZoldffVUlJSWe144Odk3Pt8vIyNBVV12lnj17es6xS4kJb+UIDZxO5zFf++yzz7R9+3bP8wsvvFDz5s077fcGAB2NYAegU/nVr36lHTt26KKLLtLzzz+vPn36KCsrS3KHt6YDJ5oGvaavFbqnO8k/uFcJCQlKTU2VJE2fPl233367Ro8erYULF+rNN9/UmDFjNHToUF122WWqq6vTV199pUceeUSvvfaaRo4cqaqqKl1++eXasmWLJGnz5s0677zzNHz4cP34xz9WXR1TqQDoPAh2ADqdfv366b777tPGjRtVUVGh7du3q6KiQvv27fOEt/Lycu3fv18jRoxQTU2Ndu/e7WmFK3TPW/fpv97RDTfcILO54adu+/bt6t+/v9avX6+bb75Z06ZN07p167RlyxalpqZqxYoVmjRpkoYNG6YlS5bo+++/V3h4uHbu3KkBAwaotrZW1157rV599VVt2rRJqampzebPAwBfYx47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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "slip_ratio = Symbol('slip_ratio')\n", + "slip_angle = Symbol('slip_angle')\n", + "\n", + "plot(pacejka96(b, slip_ratio, 2, 0, 0) / 2000, (slip_ratio, -100, 100))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}