From be394ddb028d88cd1ea723582b6f92b9b9ea0e9c Mon Sep 17 00:00:00 2001 From: nicoeps <55274642+nicoeps@users.noreply.github.com> Date: Mon, 6 Jun 2022 23:46:24 +0200 Subject: [PATCH] Update CCD demo --- python/demo_prox_rigid_bodies_ccd.ipynb | 136 ++---------------- .../prox_rigid_bodies_ccd/solver.py | 13 +- 2 files changed, 17 insertions(+), 132 deletions(-) diff --git a/python/demo_prox_rigid_bodies_ccd.ipynb b/python/demo_prox_rigid_bodies_ccd.ipynb index 69570b5..3a402bc 100644 --- a/python/demo_prox_rigid_bodies_ccd.ipynb +++ b/python/demo_prox_rigid_bodies_ccd.ipynb @@ -4,7 +4,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Demo of API usage of the Prox Rigid Body Simulator" + "# Demo of API usage of the CCD Prox Rigid Body Simulator" ] }, { @@ -34,7 +34,8 @@ "import rainbow.math.quaternion as Q\n", "import rainbow.geometry.surface_mesh as MESH\n", "import rainbow.simulators.prox_rigid_bodies_ccd.api as API\n", - "import rainbow.util.viewer as VIEWER" + "import rainbow.util.viewer as VIEWER\n", + "import time" ] }, { @@ -59,7 +60,7 @@ "API.create_rigid_body(engine,'wall_body')\n", "API.create_rigid_body(engine,'box_body')\n", "\n", - "V, T = MESH.create_box(2.0,8.0,8.0)\n", + "V, T = MESH.create_box(3.0,8.0,8.0)\n", "mesh = API.create_mesh(V, T)\n", "API.create_shape(engine, 'wall_shape', mesh)\n", "\n", @@ -81,7 +82,7 @@ "\n", "API.set_orientation(engine, 'box_body', Q.identity(), use_model_frame=True)\n", "API.set_position(engine, 'box_body', V3.make(-3.0, 1.0, -1.0), use_model_frame=True)\n", - "API.set_velocity(engine, 'box_body', V3.make(8000.0,0.0,0.0))" + "API.set_velocity(engine, 'box_body', V3.make(7000.0,0.0,0.0))" ] }, { @@ -111,7 +112,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c3db09f6407e48f3a38c6463a66bdf5c", + "model_id": "06f1aec9d44b4f17872905a5f78560dd", "version_major": 2, "version_minor": 0 }, @@ -121,112 +122,6 @@ }, "metadata": {}, "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n", - "0.001\n" - ] } ], "source": [ @@ -278,32 +173,21 @@ "execution_count": 5, "metadata": {}, "outputs": [ - { - "ename": "NameError", - "evalue": "name 'stats' is not defined", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/tmp/ipykernel_24090/3827846052.py\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0max\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mset_ylabel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Merit'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgrid\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstats\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mstats\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m'residuals'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mNameError\u001b[0m: name 'stats' is not defined" - ] - }, { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "953b4193a56543c482730df7b717e8e8", + "model_id": "d6bd207b6cd440d8b37ade762c2a5013", "version_major": 2, "version_minor": 0 }, - "image/png": "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NDADBw50jQ0dOtRIMr///e/d5vbt29e0bNnStf3b3/7WSDJvvfWWuZgdO3YYSebVV191G//mm29MaGioefbZZy+61pj/D4BTpky55DxjLvTi9OnTJjw83Lz22muu8VWrVhlJZtOmTW7zz5w5Y+rWrWv69evnNl5WVmbat29vOnXq5BqrWbOmGTdu3A/WAMD7uAQMWKziMuqwYcPcxjt16qTWrVt7XOJr0KCBOnXq5DbWrl07t8uJffr0UYMGDbR06VLX2EcffaQjR45oxIgRrrH169crKSlJDRs2VGlpqeunT58+kqSsrCy3/fTv319BQUGu7X/+85/629/+pp/97GeS5PYcffv2VV5env7+97+7nqtHjx6qV6+ea32NGjU0cOBAt3189NFHKi0t1ZAhQ9yeLyQkRN27d9enn37qNt/hcKhfv36XfD0+/PBDhYSEuB37961fv14Oh0OPPvqo234bNGig9u3be+z3Yh544AGPsdOnT+u5557TDTfcoMDAQAUGBqpmzZo6c+aM9u/f/4PPuX37dhUVFWno0KFutZWXl+vuu+/Wrl27dObMGUkX/rtJT0/XjBkz9Kc//UklJSWXVTeA6sdNIIAfqVevnsLCwnTw4MHLml9YWChJio6O9nisYcOGbkFGkiIjIz3mOZ1O/etf/3JtBwYGavDgwZo3b56+++47XXfddUpPT1d0dLR69+7tmnf06FF98MEHbqHuPxUUFLhtf7/Go0ePSpImTJigCRMmXPI5CgsLFRUV5fH498cqnvPWW2+t9Plq1HD/f+awsDCFhIS4jTmdTp07d861ffz4cTVs2NBj7ff3a4yptEZJatq06UXX/qfK+vjII4/ok08+0QsvvKBbb71VERERcjgc6tu3r1vfLlWbJA0YMOCic4qKihQeHq6VK1dqxowZevvtt/XCCy+oZs2a+ulPf6rZs2erQYMGl3UMAKoHARDwIwEBAbrzzjv14Ycf6vDhw2rcuPEl51cEury8PI+5R44ccTtjVhXDhw/XK6+8ohUrVmjQoEFat26dxo0bp4CAANecevXqqV27dnrppZcqfY6GDRu6bTscDrftitomTZqk+++/v9LnaNmypaQLx1kRZP5Tfn5+pc/53nvvKTY29lKHeNnq16+vrVu3qry8/KIhsF69enI4HNqyZUulN+5c7t3O33+NTpw4ofXr12vq1KmaOHGia7y4uPiyPwuy4jWZN2+ebrvttkrnVATXevXqae7cuZo7d65yc3O1bt06TZw4UceOHfuvv/Mc8DcEQMDPTJo0SRkZGXrsscf0hz/8QcHBwW6Pl5SUaMOGDerXr5969OghSfrd737ndtZr165d2r9/vyZPnnxFNbRu3VqdO3fW0qVLVVZWpuLiYg0fPtxtzr333quMjAw1a9ZMderUqfI+WrZsqebNm+vzzz/XzJkzLzm3e/fuysjIUEFBgSvQlJeXa9WqVW7zevfurcDAQH311VeVXk69En369NG7776r9PT0i14Gvvfee/XLX/5S3377rcdl6R/D4XDIGOMRIN9++22VlZW5jVXM+f5Zwa5du+q6665TTk6OxowZc9n7btKkicaMGaNPPvlE27Ztu8IjAHCtEAABP9OlSxctXLhQKSkpSkhI0BNPPKEbb7xRJSUlys7O1ptvvqm2bduqX79+atmypR5//HHNmzdPNWrUUJ8+fXTo0CG98MILiomJ0fjx46+4jhEjRmj06NE6cuSIEhMTXWfjKkyfPl2ZmZlKTEzU2LFj1bJlS507d06HDh1SRkaGFi1a9INnMN944w316dNHvXv31rBhw9SoUSMVFRVp//792rt3ryvgTZ48WR988IHuvPNOTZ48WaGhoVq0aJHrb9cqzszFxcVp+vTpmjx5sg4cOKC7775bderU0dGjR/XZZ58pPDxcaWlpVXodHn74YS1dulTJycn6+9//rqSkJJWXl2vnzp1q3bq1HnroIXXt2lWPP/64hg8frt27d+v2229XeHi48vLytHXrVt1000164oknqrRfSYqIiNDtt9+uV155RfXq1VNcXJyysrK0ePFiXXfddW5z27ZtK0l68803VatWLYWEhCg+Pl6RkZGaN2+ehg4dqqKiIg0YMEDXX3+9jh8/rs8//1zHjx/XwoULdeLECSUlJemRRx5Rq1atVKtWLe3atUsbNmy46BlaAF7k7btQAFwb+/btM0OHDjVNmjQxwcHBJjw83HTo0MFMmTLF9fEexly4m/Pll182LVq0MEFBQaZevXrm0UcfNd98843b83Xv3t3ceOONHvsZOnSoiY2N9Rg/ceKECQ0NveQdsMePHzdjx4418fHxJigoyNStW9ckJCSYyZMnm9OnTxtj/v8u4FdeeaXS5/j888/NwIEDzfXXX2+C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b68777xTN910kx588EG99dZb+t///d/LfxEA4AoQAAH81yovL1e/fv20b98+t59//OMfuv32213zwsPD3dZ9/fXX6tu3r9q2bav3339fe/bs0fz58yVJJSUll71/Y4wcDscPjgcFBbk97nA4VF5eLkkKCAhQZmamPvzwQ7Vp00bz5s1Ty5YtdfDgwcuuAwCqigAI4L9CcHCwysrK3MZuueUWffHFF4qLi9MNN9zg9vP90Pefdu/erdLSUr366qu67bbb1KJFCx05cuQH9/d9bdq0UW5urr755hvXWE5Ojk6cOKHWrVtf9rE5HA517dpVaWlpys7OVnBwsNasWXPZ6wGgqgiAAP4rxMXFaefOnTp06JAKCgpUXl6un//85yoqKtLDDz+szz77TAcOHNDGjRs1YsSIS4a3Zs2aqbS0VPPmzdOBAwe0bNkyLVq0yGN/p0+f1ieffKKCggKdPXvW43nuuusutWvXTj/72c+0d+9effbZZxoyZIi6d+9e6WXnyuzcuVMzZ87U7t27lZubq9WrV+v48eNVCpAAUFUEQAD/FSZMmKCAgAC1adNG9evXV25urho2bKht27aprKxMvXv3Vtu2bfXUU0+pdu3aqlHj4v+83XzzzZozZ45efvlltW3bVsuXL9esWbPc5iQmJio5OVmDBg1S/fr1PW4ikS6cuVu7dq3q1Kmj22+/XXfddZeaNm2qlStXXvZxRUREaPPmzerbt69atGihX/ziF3r11VfVp0+fy39xAKCKHIbPGgAAALAKZwABAAAsQwAEAACwDAEQAADAMgRAAAAAyxAAAQAALEMABAAAsAwBEAAAwDIEQAAAAMsQAAEAACxDAAQAALAMARAAAMAyBEAAAADL/B8+gbQbDaIWcQAAAABJRU5ErkJggg==", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAoAAAAHgCAYAAAA10dzkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAABN+ElEQVR4nO3deXxU1f3/8fdNMpksJJMEyCYhoAIiwQ2VxcqiEJYCKiooFUH9KhbB8kO+tspXhX4VWv2qtFhFqRUELXQRXEojwQWlLAKKyiKVCgKSEJaQsCaT5Pz+gBmZLBBgwp3l9XyYB5k7Z+793JMhvD1nzr2WMcYIAAAAYSPC7gIAAABwbhEAAQAAwgwBEAAAIMwQAAEAAMIMARAAACDMEAABAADCDAEQAAAgzBAAAQAAwgwBEAAAIMwQAAEAAMIMARAAACDMEAABAADCDAEQAAAgzBAAAQAAwgwBEAAAIMwQAAEAAMIMARAAACDMEAABAADCDAEQAAAgzBAAAQAAwgwBEAAAIMwQAAEAAMIMARAAACDMEAABAADCDAEQAAAgzBAAAQAAwgwBEAAAIMwQAAEAAMIMARAAACDMEAABAADCDAEQAAAgzBAAAQAAwgwBEAAAIMwQAAEAAMIMARAAACDMEAABAADCDAEQCFFfffWV7rrrLrVs2VIxMTFq1KiRrrjiCj399NPat2+f3eUhwGzYsEETJ07U1q1b7S4FwDlAAARC0IwZM9ShQwetWrVK//3f/628vDzNnz9ft956q6ZPn6577rnH7hIRYDZs2KBJkyYRAIEwEWV3AQD8a/ny5fr5z3+uXr16acGCBXI6nd7nevXqpYceekh5eXk2Vnj2KisrVVFR4XNu8HX48GHFxcXZXQaAAMUIIBBiJk+eLMuy9Morr9QakKKjozVw4EDv46qqKj399NO66KKL5HQ6lZqaqjvvvFM7duzweV337t2Vk5OjVatW6dprr1VcXJzOP/98/eY3v1FVVZUkaffu3YqOjtZjjz1W47jffPONLMvS73//e++2wsJCjRw5Us2aNVN0dLRatmypSZMmqaKiwttm69atsixLTz/9tJ588km1bNlSTqdTH330kSRp9erVGjhwoFJSUhQTE6PLL79cf/nLX2ocf+nSpercubNiYmJ03nnn6bHHHtMf//hHWZZVY9Rr3rx56ty5s+Lj49WoUSP17t1bX3zxhU+bESNGqFGjRtq8ebP69eunRo0aKSsrSw899JDKysp82paVlenXv/612rZtq5iYGDVu3Fg9evTQsmXLvG2MMXrxxRd12WWXKTY2VsnJybrlllv03Xff1TiX6iZOnCjLsvT555/rlltuUXJysi644AJv/9x2221q0aKFYmNj1aJFC91+++36/vvvva+fOXOmbr31VklSjx49ZFmWLMvSzJkzvW0WL16s66+/XomJiYqLi9M111yjDz74wKeO3bt367777lNWVpacTqeaNm2qa665RosXLz7lOQA4xwyAkFFRUWHi4uJMx44d6/2a++67z0gyo0ePNnl5eWb69OmmadOmJisry+zevdvbrlu3bqZx48amVatWZvr06SY/P9+MGjXKSDKzZs3ytrvppptMVlaWqays9DnOww8/bKKjo82ePXuMMcYUFBSYrKwsk52dbV5++WWzePFi87//+7/G6XSaESNGeF+3ZcsWI8mcd955pkePHuZvf/ubWbRokdmyZYv58MMPTXR0tLn22mvNvHnzTF5enhkxYoSRZF577TXvPr788ksTExNjLrnkEjN37lzzzjvvmH79+pkWLVoYSWbLli3etk899ZSxLMvcfffd5r333jNvvfWW6dy5s4mPjzfr16/3ths+fLiJjo42bdu2Nf/3f/9nFi9ebB5//HFjWZaZNGmSt53b7TY9evQwUVFRZvz48WbhwoXmnXfeMY8++qj585//7G137733GofDYR566CGTl5dn3nzzTXPRRReZtLQ0U1hYeNKf4RNPPGEkmezsbPPLX/7S5OfnmwULFhhjjPnrX/9qHn/8cTN//nyzZMkSM3fuXNOtWzfTtGlT78+3qKjITJ482Ugyf/jDH8zy5cvN8uXLTVFRkTHGmNmzZxvLssyNN95o3nrrLfPuu++a/v37m8jISLN48WJvHb179zZNmzY1r7zyivn444/NggULzOOPP27mzp170voBnHsEQCCEFBYWGknmtttuq1f7jRs3Gklm1KhRPttXrlxpJJlHH33Uu61bt25Gklm5cqVP24svvtj07t3b+/idd94xksyiRYu82yoqKkxmZqa5+eabvdtGjhxpGjVqZL7//nuf/f3f//2fkeQNW54AeMEFF5jy8nKfthdddJG5/PLLjdvt9tnev39/k5GR4Q2ht956q4mPj/cJtJWVlebiiy/2CYDbtm0zUVFRZsyYMT77O3DggElPTzeDBw/2bhs+fLiRZP7yl7/4tO3Xr59p06aN9/Hrr79uJJkZM2aYuixfvtxIMs8++6zP9u3bt5vY2Fjz8MMP1/laY34MgI8//vhJ2xlz7Gdx8OBBEx8fb373u995t//1r381ksxHH33k0/7QoUMmJSXFDBgwwGd7ZWWlufTSS83VV1/t3daoUSMzduzYU9YAwH5MAQNhzDONOmLECJ/tV199tdq2bVtjii89PV1XX321z7ZLLrnEZzqxb9++Sk9P12uvvebd9v7772vnzp26++67vdvee+899ejRQ5mZmaqoqPB+9e3bV5K0ZMkSn+MMHDhQDofD+3jz5s365ptv9LOf/UySfPbRr18/FRQUaNOmTd59XXfddWrSpIn39RERERo8eLDPMd5//31VVFTozjvv9NlfTEyMunXrpo8//tinvWVZGjBgwEn745///KdiYmJ8zr269957T5Zl6Y477vA5bnp6ui699NIax63LzTffXGPbwYMH9ctf/lIXXnihoqKiFBUVpUaNGunQoUPauHHjKfe5bNky7du3T8OHD/epraqqSn369NGqVat06NAhScfeNzNnztSTTz6pFStWyO1216tuAOcei0CAENKkSRPFxcVpy5Yt9Wq/d+9eSVJGRkaN5zIzM32CjCQ1bty4Rjun06kjR454H0dFRWnYsGGaNm2a9u/fr6SkJM2cOVMZGRnq3bu3t92uXbv07rvv+oS6E+3Zs8fncfUad+3aJUkaP368xo8ff9J97N27V2lpaTWer77Ns8+rrrqq1v1FRPj+P3NcXJxiYmJ8tjmdTh09etT7ePfu3crMzKzx2urHNcbUWqMknX/++XW+9kS1/RyHDh2qDz74QI899piuuuoqJSYmyrIs9evXz+fndrLaJOmWW26ps82+ffsUHx+vefPm6cknn9Qf//hHPfbYY2rUqJFuuukmPf3000pPT6/XOQA4NwiAQAiJjIzU9ddfr3/+85/asWOHmjVrdtL2nkBXUFBQo+3OnTt9RsxOx1133aVnnnlGc+fO1ZAhQ/TOO+9o7NixioyM9LZp0qSJLrnkEj311FO17iMzM9PnsWVZPo89tT3yyCMaNGhQrfto06aNpGPn6QkyJyosLKx1n3/729+UnZ19slOst6ZNm2rp0qWqqqqqMwQ2adJElmXp008/rXXhTn1XO1fvo5KSEr333nt64okn9Ktf/cq7vaysrN7XgvT0ybRp09SpU6da23iCa5MmTTR16lRNnTpV27Zt0zvvvKNf/epXKioqCvqV50CoIQACIeaRRx7RwoULde+99+rtt99WdHS0z/Nut1t5eXkaMGCArrvuOknSnDlzfEa9Vq1apY0bN2rChAlnVEPbtm3VsWNHvfbaa6qsrFRZWZnuuusunzb9+/fXwoULdcEFFyg5Ofm0j9GmTRu1atVKX375pSZPnnzStt26ddPChQu1Z88eb6CpqqrSX//6V592vXv3VlRUlP7zn//UOp16Jvr27as///nPmjlzZp3TwP3799dvfvMb/fDDDzWmpc+GZVkyxtQIkH/84x9VWVnps83Tpvqo4DXXXKOkpCRt2LBBo0ePrvexmzdvrtGjR+uDDz7Qv/71rzM8AwANhQAIhJjOnTvrpZde0qhRo9ShQwf9/Oc/V7t27eR2u/XFF1/olVdeUU5OjgYMGKA2bdrovvvu07Rp0xQREaG+fftq69ateuyxx5SVlaX/9//+3xnXcffdd2vkyJHauXOnunTp4h2N8/j1r3+t/Px8denSRQ8++KDatGmjo0ePauvWrVq4cKGmT59+yhHMl19+WX379lXv3r01YsQInXfeedq3b582btyozz//3BvwJkyYoHfffVfXX3+9JkyYoNjYWE2fPt372TXPyFyLFi3061//WhMmTNB3332nPn36KDk5Wbt27dJnn32m+Ph4TZo06bT64fbbb9drr72m+++/X5s2bVKPHj1UVVWllStXqm3btrrtttt0zTXX6L777tNdd92l1atXq2vXroqPj1dBQYGWLl2q9u3b6+c///lpHVeSEhMT1bVrVz3zzDNq0qSJWrRooSVLlujVV19VUlKST9ucnBxJ0iuvvKKEhATFxMSoZcuWaty4saZNm6bhw4dr3759uuWWW5Samqrdu3fryy+/1O7du/XSSy+ppKREPXr00NChQ3XRRRcpISFBq1atUl5eXp0jtABsZPcqFAANY+3atWb48OGmefPmJjo62sTHx5vLL7/cPP74497LexhzbDXnb3/7W9O6dWvjcDhMkyZNzB133GG2b9/us79u3bqZdu3a1TjO8OHDTXZ2do3tJSUlJjY29qQrYHfv3m0efPBB07JlS+NwOExKSorp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aakcDoff94+a6HN70O/2oN/tQb/bo3q/e/7d9vw7Ho4IgGfhwIEDkqSsrCybKwEAAKfrwIEDcrlcdpdhC8uEc/w9S1VVVdq5c6cSEhJkWZZf911aWqqsrCxt375diYmJft03akef24N+twf9bg/63R7V+90YowMHDigzM1MREeH5aThGAM9CRESEmjVr1qDHSExM5JfEOUaf24N+twf9bg/63R4n9nu4jvx5hGfsBQAACGMEQAAAgDBDAAxQTqdTTzzxhJxOp92lhA363B70uz3od3vQ7/ag32tiEQgAAECYYQQQAAAgzBAAAQAAwgwBEAAAIMwQAAEAAMIMATAAvfjii2rZsqViYmLUoUMHffrpp3aXFNImTpwoy7J8vtLT0+0uK+R88sknGjBggDIzM2VZlhYsWODzvDFGEydOVGZmpmJjY9W9e3etX7/enmJDyKn6fcSIETXe/506dbKn2BAxZcoUXXXVVUpISFBqaqpuvPFGbdq0yacN73f/q0+/837/EQEwwMybN09jx47VhAkT9MUXX+jaa69V3759tW3bNrtLC2nt2rVTQUGB9+vrr7+2u6SQc+jQIV166aV64YUXan3+6aef1nPPPacXXnhBq1atUnp6unr16uW95zbOzKn6XZL69Onj8/5fuHDhOaww9CxZskQPPPCAVqxYofz8fFVUVCg3N1eHDh3ytuH97n/16XeJ97uXQUC5+uqrzf333++z7aKLLjK/+tWvbKoo9D3xxBPm0ksvtbuMsCLJzJ8/3/u4qqrKpKenm9/85jfebUePHjUul8tMnz7dhgpDU/V+N8aY4cOHmxtuuMGWesJFUVGRkWSWLFlijOH9fq5U73djeL+fiBHAAFJeXq41a9YoNzfXZ3tubq6WLVtmU1Xh4dtvv1VmZqZatmyp2267Td99953dJYWVLVu2qLCw0Oe973Q61a1bN97758DHH3+s1NRUtW7dWvfee6+KiorsLimklJSUSJJSUlIk8X4/V6r3uwfv92MIgAFkz549qqysVFpams/2tLQ0FRYW2lRV6OvYsaNef/11vf/++5oxY4YKCwvVpUsX7d271+7Swobn/c17/9zr27ev3njjDX344Yd69tlntWrVKl133XUqKyuzu7SQYIzRuHHj9JOf/EQ5OTmSeL+fC7X1u8T7/URRdheAmizL8nlsjKmxDf7Tt29f7/ft27dX586ddcEFF2jWrFkaN26cjZWFH977596QIUO83+fk5OjKK69Udna2/vGPf2jQoEE2VhYaRo8era+++kpLly6t8Rzv94ZTV7/zfv8RI4ABpEmTJoqMjKzxf4BFRUU1/k8RDSc+Pl7t27fXt99+a3cpYcOz6pr3vv0yMjKUnZ3N+98PxowZo3feeUcfffSRmjVr5t3O+71h1dXvtQnn9zsBMIBER0erQ4cOys/P99men5+vLl262FRV+CkrK9PGjRuVkZFhdylho2XLlkpPT/d575eXl2vJkiW898+xvXv3avv27bz/z4IxRqNHj9Zbb72lDz/8UC1btvR5nvd7wzhVv9cmnN/vTAEHmHHjxmnYsGG68sor1blzZ73yyivatm2b7r//frtLC1njx4/XgAED1Lx5cxUVFenJJ59UaWmphg8fbndpIeXgwYPavHmz9/GWLVu0du1apaSkqHnz5ho7dqwmT56sVq1aqVWrVpo8ebLi4uI0dOhQG6sOfifr95SUFE2cOFE333yzMjIytHXrVj366KNq0qSJbrrpJhurDm4PPPCA3nzzTb399ttKSEjwjvS5XC7FxsbKsize7w3gVP1+8OBB3u8nsnEFMurwhz/8wWRnZ5vo6GhzxRVX+Cxhh/8NGTLEZGRkGIfDYTIzM82gQYPM+vXr7S4r5Hz00UdGUo2v4cOHG2OOXRrjiSeeMOnp6cbpdJquXbuar7/+2t6iQ8DJ+v3w4cMmNzfXNG3a1DgcDtO8eXMzfPhws23bNrvLDmq19bck89prr3nb8H73v1P1O+93X5YxxpzLwAkAAAB78RlAAACAMEMABAAACDMEQAAAgDBDAAQAAAgzBEAAAIAwQwAEAAAIMwRAAACAMEMABIDT0KJFC02dOtXuMgDgrBAAAQSsESNG6MYbb5Qkde/eXWPHjj1nx545c6aSkpJqbF+1apXuu+++c1YHADQE7gUMIKyUl5crOjr6jF/ftGlTP1YDAPZgBBBAwBsxYoSWLFmi3/3ud7IsS5ZlaevWrZKkDRs2qF+/fmrUqJHS0tI0bNgw7dmzx/va7t27a/To0Ro3bpyaNGmiXr16SZKee+45tW/fXvHx8crKytKoUaN08OBBSdLHH3+su+66SyUlJd7jTZw4UVLNKeBt27bphhtuUKNGjZSYmKjBgwdr165d3ucnTpyoyy67TLNnz1aLFi3kcrl022236cCBA942f/vb39S+fXvFxsaqcePG6tmzpw4dOtRAvQkABEAAQeB3v/udOnfurHvvvVcFBQUqKChQVlaWCgoK1K1bN1122WVavXq18vLytGvXLg0ePNjn9bNmzVJUVJT+9a9/6eWXX5YkRURE6Pe//73WrVunWbNm6cMPP9TDDz8sSerSpYumTp2qxMRE7/HGjx9foy5jjG688Ubt27dPS5YsUX5+vv7zn/9oyJAhPu3+85//aMGCBXrvvff03nvvacmSJfrNb34jSSooKNDtt9+uu+++Wxs3btTHH3+sQYMGidu0A2hITAEDCHgul0vR0dGKi4tTenq6d/tLL72kK664QpMnT/Zu+9Of/qSsrCz9+9//VuvWrSVJF154oZ5++mmffZ74ecKWLVvqf//3f/Xzn/9cL774oqKjo+VyuWRZls/xqlu8eLG++uorbdmyRVlZWZKk2bNnq127dlq1apWuuuoqSVJVVZVmzpyphIQESdKwYcP0wQcf6KmnnlJBQYEqKio0aNAgZWdnS5Lat29/Fr0FAKfGCCCAoLVmzRp99NFHatSokffroosuknRs1M3jyiuvrPHajz76SL169dJ5552nhIQE3Xnnndq7d+9pTb1u3LhRWVlZ3vAnSRdffLGSkpK0ceNG77YWLVp4w58kZWRkqKioSJJ06aWX6vrrr1f79u116623asaMGSouLq5/JwDAGSAAAghaVVVVGjBggNauXevz9e2336pr167edvHx8T6v+/7779WvXz/l5OTo73//u9asWaM//OEPkiS3213v4xtjZFnWKbc7HA6f5y3LUlVVlSQpMjJS+fn5+uc//6mLL75Y06ZNU5s2bbRly5Z61wEAp4sACCAoREdHq7Ky0mfbFVdcofXr16tFixa68MILfb6qh74TrV69WhUVFXr22WfVqVMntW7dWjt37jzl8aq7+OKLtW3bNm3fvt27bcOGDSopKVHbtm3rfW6WZemaa67RpEmT9MUXXyg6Olrz58+v9+sB4HQRAAEEhRYtWmjlypXaunWr9uzZo6qqKj3wwAPat2+fbr/9dn322Wf67rvvtGjRIt19990nDW8XXHCBKioqNG3aNH333XeaPXu2pk+fXuN4Bw8e1AcffKA9e/bo8OHDNfbTs2dPXXLJJfrZz36mzz//XJ999pnuvPNOdevWrdZp59qsXLlSkydP1urVq7Vt2za99dZb2r1792kFSAA4XQRAAEFh/PjxioyM1MUXX6ymTZtq27ZtyszM1L/+9S9VVlaqd+/eysnJ0S9+8Qu5XC5FRNT96+2yyy7Tc889p9/+9rfKycnRG2+8oSlTpvi06dKli+6//34NGTJETZs2rbGIRDo2crdgwQIlJyera9eu6tmzp84//3zNmzev3ueVmJioTz75RP369VPr1q31P//zP3r22WfVt2/f+ncOAJwmy3CtAQAAgLDCCCAAAECYIQACAACEGQIgAABAmCEAAgAAhBkCIAAAQJghAAIAAIQZAiAAAECYIQACAACEGQIgAABAmCEAAgAAhBkCIAAAQJghAAIAAISZ/w+SsXD13DWgxgAAAABJRU5ErkJggg==", "text/html": [ "\n", "
\n", "
\n", " Figure\n", "
\n", - " \n", + " \n", "
\n", " " ], @@ -318,6 +202,8 @@ "source": [ "import matplotlib.pyplot as plt\n", "\n", + "stats = API.get_log(engine)\n", + "\n", "fig = plt.figure()\n", "ax = plt.subplot(111)\n", "ax.set_title('Converegence rates')\n", diff --git a/python/rainbow/simulators/prox_rigid_bodies_ccd/solver.py b/python/rainbow/simulators/prox_rigid_bodies_ccd/solver.py index 683ab29..93f74f9 100644 --- a/python/rainbow/simulators/prox_rigid_bodies_ccd/solver.py +++ b/python/rainbow/simulators/prox_rigid_bodies_ccd/solver.py @@ -590,13 +590,12 @@ def step(self, dt: float, engine: Engine, debug_on: bool) -> None: stats = {} dti = dt - # while (dti > 0): - toi, stats = CD.run_collision_detection(dti, engine, stats, debug_on) - # if toi < 1.0e-5: - # toi = dti - print(toi) - stats = solve_dynamics(toi, engine, stats, debug_on) - dti -= toi + while (dti > 0): + toi, stats = CD.run_collision_detection(dti, engine, stats, debug_on) + if toi < 1.0e-5: + toi = dti + stats = solve_dynamics(toi, engine, stats, debug_on) + dti -= toi if debug_on: timer.end()