2024-03-21 05:40:33 +08:00
{
"cells": [
2024-05-21 05:35:10 +08:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Test In Simulation"
]
},
{
"cell_type": "code",
2024-10-02 02:45:06 +08:00
"execution_count": 1,
2024-05-21 05:35:10 +08:00
"metadata": {},
2024-10-10 06:23:15 +08:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"pygame 2.6.1 (SDL 2.28.4, Python 3.10.12)\n",
"Hello from the pygame community. https://www.pygame.org/contribute.html\n"
]
}
],
2024-05-21 05:35:10 +08:00
"source": [
"from Go2Py.robot.fsm import FSM\n",
"from Go2Py.robot.remote import KeyboardRemote\n",
"from Go2Py.robot.safety import SafetyHypervisor\n",
"from Go2Py.sim.mujoco import Go2Sim\n",
"from Go2Py.control.walk_these_ways import *"
]
},
{
"cell_type": "code",
2024-10-02 02:45:06 +08:00
"execution_count": 2,
2024-05-21 05:35:10 +08:00
"metadata": {},
"outputs": [],
"source": [
"robot = Go2Sim()"
]
},
2024-10-02 09:07:58 +08:00
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"map = np.zeros((1200, 1200))\n",
"map[:200, :200] = 255\n",
"robot.updateHeightMap(map)"
]
},
2024-05-21 05:35:10 +08:00
{
"cell_type": "code",
2024-10-10 06:23:15 +08:00
"execution_count": 4,
2024-05-21 05:35:10 +08:00
"metadata": {},
"outputs": [],
"source": [
"remote = KeyboardRemote()\n",
2024-10-02 02:45:06 +08:00
"robot.sitDownReset()\n",
2024-05-21 05:35:10 +08:00
"safety_hypervisor = SafetyHypervisor(robot)"
]
},
2024-03-21 05:40:33 +08:00
{
"cell_type": "code",
2024-10-10 06:23:15 +08:00
"execution_count": 5,
2024-03-21 05:40:33 +08:00
"metadata": {},
"outputs": [],
"source": [
"class walkTheseWaysController:\n",
" def __init__(self, robot, remote, checkpoint):\n",
" self.remote = remote\n",
" self.robot = robot\n",
" self.cfg = loadParameters(checkpoint)\n",
" self.policy = Policy(checkpoint)\n",
" self.command_profile = CommandInterface()\n",
" self.agent = WalkTheseWaysAgent(self.cfg, self.command_profile, self.robot)\n",
" self.agent = HistoryWrapper(self.agent)\n",
2024-10-10 06:23:15 +08:00
" self.hist_data = {}\n",
2024-03-21 05:40:33 +08:00
" self.init()\n",
"\n",
" def init(self):\n",
" self.obs = self.agent.reset()\n",
" self.policy_info = {}\n",
" self.command_profile.yaw_vel_cmd = 0.0\n",
" self.command_profile.x_vel_cmd = 0.0\n",
" self.command_profile.y_vel_cmd = 0.0\n",
2024-03-21 12:06:35 +08:00
" self.command_profile.stance_width_cmd=0.25\n",
" self.command_profile.footswing_height_cmd=0.08\n",
" self.command_profile.step_frequency_cmd = 3.0\n",
" self.command_profile.bodyHeight = 0.00\n",
2024-03-21 05:40:33 +08:00
"\n",
" def update(self, robot, remote):\n",
" action = self.policy(self.obs, self.policy_info)\n",
" self.obs, self.ret, self.done, self.info = self.agent.step(action)\n",
2024-10-02 02:45:06 +08:00
" vy = 0. # Update these based on your implementation of the remote controller\n",
" vx = 0.\n",
" omega = 0.\n",
2024-03-21 12:06:35 +08:00
" self.command_profile.x_vel_cmd = vx*1.5\n",
" self.command_profile.y_vel_cmd = vy*1.5\n",
2024-10-10 06:23:15 +08:00
" self.command_profile.yaw_vel_cmd = omega\n",
" for key, value in self.info.items():\n",
" if key in self.hist_data:\n",
" self.hist_data[key].append(value)\n",
" else:\n",
" self.hist_data[key] = [value]"
2024-03-21 05:40:33 +08:00
]
},
{
"cell_type": "code",
2024-10-10 06:23:15 +08:00
"execution_count": 6,
2024-03-21 05:40:33 +08:00
"metadata": {},
2024-10-02 02:45:06 +08:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"p_gains: [20. 20. 20. 20. 20. 20. 20. 20. 20. 20. 20. 20.]\n"
]
}
],
2024-03-21 05:40:33 +08:00
"source": [
2024-05-21 05:35:10 +08:00
"checkpoint = \"../Go2Py/assets/checkpoints/walk_these_ways/\"\n",
"controller = walkTheseWaysController(robot, remote, checkpoint)\n",
"fsm = FSM(robot, remote, safety_hypervisor, user_controller_callback=controller.update)"
2024-05-05 08:09:01 +08:00
]
},
{
"cell_type": "code",
2024-10-10 06:23:15 +08:00
"execution_count": 7,
2024-05-05 08:09:01 +08:00
"metadata": {},
"outputs": [],
"source": [
"controller.command_profile.pitch_cmd=0.0\n",
"controller.command_profile.body_height_cmd=0.0\n",
"controller.command_profile.footswing_height_cmd=0.08\n",
"controller.command_profile.roll_cmd=0.0\n",
"controller.command_profile.stance_width_cmd=0.2\n",
"controller.command_profile.x_vel_cmd=-0.2\n",
"controller.command_profile.y_vel_cmd=0.01\n",
"controller.command_profile.setGaitType(\"trotting\")"
]
},
2024-10-02 02:45:06 +08:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pressing `u` on the keyboard will make the robot stand up. This is equivalent to the `L2+A` combo of the Go2 builtin state machine. After the the robot is on its feet, pressing `s` will hand over the control the RL policy. This action is equivalent to the `start` key of the builtin controller. When you want to stop, pressing `u` again will act similarly to the real robot and locks it in standing mode. Finally, pressing `u` again will command the robot to sit down."
]
},
2024-05-05 08:09:01 +08:00
{
"cell_type": "code",
2024-10-10 06:23:15 +08:00
"execution_count": 8,
2024-05-05 08:09:01 +08:00
"metadata": {},
"outputs": [],
"source": [
"fsm.close()"
]
},
2024-10-10 06:23:15 +08:00
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABc8AAAPeCAYAAADatOK+AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8hTgPZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOy9e5gU1bX3/63uuaHcHBWGiYh4ReONqEGiIkYiF+OVk4RIEomoOQmYY3xPTDxRomgOavwlRiUxJl4TMXmTGH3leFBABRORKIoi3hXFCwMKMgMIc+v6/dFdVbuqeobp7lqru2q+n+fh6cs0teq6195rr/1dlm3bNgghhBBCCCGEEEIIIYQQ4pIq9w4QQgghhBBCCCGEEEIIIZUGg+eEEEIIIYQQQgghhBBCSAAGzwkhhBBCCCGEEEIIIYSQAAyeE0IIIYQQQgghhBBCCCEBGDwnhBBCCCGEEEIIIYQQQgIweE4IIYQQQgghhBBCCCGEBGDwnBBCCCGEEEIIIYQQQggJwOA5IYQQQgghhBBCCCGEEBKAwXNCCCGEEEIIIYQQQgghJACD54QQEkPuuusuWJaFd955R8XePvvsg2nTpqnYIoQQQpIIfTchhBASL+i7CcDgOYkApzHJ9+/HP/6xiM2XX34ZV155ZY8bsHXr1uHHP/4xTjrpJPTr1w+WZeGJJ54o2O4TTzyBs88+Gw0NDaipqcGgQYNw2mmn4f777y94W4Xw8MMP48orrxS1AQC//vWvcdddd/X4911d94aGBrmdFGCfffaBZVkYN25c3r//7ne/c4/t2WefVd67nlPo9SOE9F7i4LsXL16M8847DwceeCB22WUX7Lvvvjj//POxbt26guzSd/uh764s6LsJIT0lDr576dKlOP300zF06FDU1dWhoaEBEyZMwD//+c+C7NJ3+6Hvrizou3sfVeXeAZIcZs+ejeHDh/u+O/TQQ0Vsvfzyy7jqqqswduxY7LPPPjv9/WuvvYbrrrsOBxxwAA477DAsW7asYJs//elPMXv2bBxwwAH4zne+g2HDhmHjxo14+OGHMXnyZNx7770455xzijianfPwww9j7ty54o7817/+NfbYY4+CZjq/9KUv4Vvf+pbvuz59+kS8Z/LU1dXh8ccfR1NTU6gTcu+996Kurg47duwo096F+eY3v4kpU6agtrbW/a6Y60cI6d1Usu/+0Y9+hE2bNuErX/kKDjjgALz99tu45ZZbMH/+fKxcubJHA0b67vzQd5cH+m5CSBRUsu9+/fXXkUql8O///u9oaGjAJ598gj/+8Y8YM2YM/ud//gcTJkzY6Tbou/ND310e6LsJwOA5iZCJEyfi6KOPLvdu5OWoo47Cxo0bUV9fj7/+9a/4yle+UtD//+tf/4rZs2fj3/7t3zBv3jxUV1e7f/vhD3+IRx55BO3t7VHvdiw48MAD8Y1vfCPy7XZ0dCCTyaCmpibybefjuOOOwzPPPIM///nP+I//+A/3+/fffx9PPvkkzjrrLPztb39T2ZeekE6nkU6ny70bhJCYU8m++xe/+AWOP/54pFLeQskJEybgxBNPxC233IJrrrmm2/9P39019N3lgb6bEBIFley7zz//fJx//vm+7773ve9h3333xY033rjT4Dl9d9fQd5cH+m4CULaFKPLYY4/hhBNOwK677oqBAwfijDPOwCuvvBL63fPPP4+JEyeif//+6Nu3L04++WQ8/fTT7t/vuusuN/h90kknuct6upNh6devH+rr64ve9yuuuAL19fW44447fA7cYfz48fjyl7/sft6wYQOmT5+OwYMHo66uDkcccQTuvvtu3/955513YFkWbrjhBtx2223Yb7/9UFtbi2OOOQbPPPOM+7tp06Zh7ty5APzLtRxuuOEGfOELX8Duu++OPn364KijjsJf//rXvMfxxz/+EZ///Oexyy67YLfddsOYMWPw6KOPAsguoVq9ejWWLFni2hg7dmzR56zYc3HjjTe65+Lll18GALz66qv46le/ij333BN9+vTBQQcdhJ/85Ce+bXzwwQc477zzMHjwYNTW1uKzn/0s7rjjjh7vZ11dHc4++2zMmzfP9/19992H3XbbDePHjw/9nxdffBHTpk3Dvvvu6y5LPO+887Bx48bQb5944gkcffTRqKurw3777Yff/va3uPLKK33XEshe45kzZ+KBBx7AoYce6h7LggULfL8Laq91d/3y2cm3DQCwbRvXXHMN9tprL+yyyy446aSTsHr16rznbPPmzbj44osxdOhQ1NbWYv/998d1112HTCaT9/eEkPhRTt89ZswYX+Dc+a6+vj7vPgSh7y4e+u4s9N2EkDhSTt+dj1122QV77rknNm/evNPf0ncXD313FvpuIgEzz0lkNDc34+OPP/Z9t8ceewAAFi1ahIkTJ2LffffFlVdeie3bt+Pmm2/Gcccdh+eee85dArZ69WqccMIJ6N+/Py699FJUV1fjt7/9LcaOHYslS5Zg1KhRGDNmDL7//e/jpptuwn/913/h4IMPBgD3NWreeOMNvPrqqzjvvPPQr1+/nf5++/btGDt2LN58803MnDkTw4cPx1/+8hdMmzYNmzdv9s2uAsC8efOwZcsWfOc734FlWbj++utx9tln4+2330Z1dTW+853v4MMPP8TChQvxhz/8IWTvV7/6FU4//XRMnToVbW1t+NOf/oSvfOUrmD9/Pk499VT3d1dddRWuvPJKfOELX8Ds2bNRU1OD5cuX47HHHsMpp5yCG2+8ERdddBH69u3rOsjBgwfv9Hh37NgRuu79+vVDbW1twefizjvvxI4dO3DhhReitrYW9fX1ePHFF3HCCSeguroaF154IfbZZx+89dZbeOihh/Czn/0MALB+/Xoce+yxrgPcc8898b//+7+YPn06WlpacPHFF+/0OADgnHPOwSmnnIK33noL++23n3t9/u3f/i1v523hwoV4++238e1vfxsNDQ1YvXo1brvtNqxevRpPP/206ziff/55TJgwAUOGDMFVV12Fzs5OzJ49G3vuuWfe/fjHP/6B+++/H9/73vfQr18/3HTTTZg8eTLWrl2L3XffPe//Kfb6BZk1axauueYaTJo0CZMmTcJzzz2HU045BW1tbb7fffrppzjxxBPxwQcf4Dvf+Q723ntvPPXUU7jsssuwbt063HjjjQXbJoToEzffvXXrVmzdutXdx66g7+4e+m76bvpuQuJLHHx3S0sL2tra8PHHH+Oee+7BSy+9hP/6r//q9v/Qd3cPfTd9N313GbEJKZE777zTBpD3n8ORRx5pDxo0yN64caP73QsvvGCnUin7W9/6lvvdmWeeadfU1NhvvfWW+92HH35o9+vXzx4zZoz73V/+8hcbgP34448XvL+F/t8HH3zQBmD/8pe/7NHvb7zxRhuA/cc//tH9rq2tzR49erTdt29fu6WlxbZt216zZo0NwN59993tTZs2hew99NBD7nczZsywu3pcP/30U9/ntrY2+9BDD7W/+MUvut+98cYbdiqVss866yy7s7PT9/tMJuO+/+xnP2ufeOKJPTpO27a7vO533nlnUeeif//+9oYNG3w2xowZY/fr189+9913u9zv6dOn20OGDLE//vhj32+mTJliDxgwIHSOggwbNsw+9dRT7Y6ODruhocG++uqrbdu27ZdfftkGYC9ZssS9z5955hn3/+Xb7n333WcDsJcuXep+d9ppp9m77LKL/cEHH7jfvfHGG3ZVVVXougKwa2pq7DfffNP97oUXXrAB2DfffLP7nbM/a9ascb/r6vr99Kc/zXv/BLexYcMGu6amxj711FN95/e//uu/bAD2ueee63539dVX27vuuqv9+uuv+7b54x//2E6n0/batWtD9gghlUPcfLfD1VdfbQOwFy9e3O3v6Lu7hr6bvpu+m5B4EiffPX78eHffampq7O985zv29u3bu/0/9N1dQ99N303fXV4o20IiY+7cuVi4cKHvHwCsW7cOK1euxLRp03zSKYcffji+9KUv4eGHHwYAdHZ24tFHH8WZZ56Jfffd1/3dkCFDcM455+Af//gHWlpadA8
"text/plain": [
"<Figure size 1500x1000 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"# Assuming 'controller.hist_data[\"foot_contact_forces_mag\"]' is a dictionary with foot contact force magnitudes\n",
"foot_contact_forces_mag = np.array(controller.hist_data[\"foot_contact_forces_mag\"])\n",
"\n",
"# Number of feet (foot_nb)\n",
"foot_nb = foot_contact_forces_mag.shape[1]\n",
"\n",
"# Number of rows needed for the grid, with 3 columns per row\n",
"n_cols = 3\n",
"n_rows = int(np.ceil(foot_nb / n_cols))\n",
"\n",
"# Create the figure and axes for subplots\n",
"fig, axes = plt.subplots(n_rows, n_cols, figsize=(15, 5 * n_rows))\n",
"\n",
"# Flatten the axes array for easy indexing (in case of multiple rows)\n",
"axes = axes.flatten()\n",
"\n",
"# Plot each foot's contact force magnitude\n",
"for i in range(foot_nb):\n",
" axes[i].plot(foot_contact_forces_mag[:, i])\n",
" axes[i].set_title(f'Foot {i+1} Contact Force Magnitude')\n",
" axes[i].set_xlabel('Time')\n",
" axes[i].set_ylabel('Force Magnitude')\n",
"\n",
"# Remove any empty subplots if foot_nb is not a multiple of 3\n",
"for j in range(foot_nb, len(axes)):\n",
" fig.delaxes(axes[j])\n",
"\n",
"# Adjust layout\n",
"plt.tight_layout()\n",
"plt.savefig(\"foot_contact_profile.png\")\n",
"plt.show()"
]
},
2024-05-05 08:09:01 +08:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Test on Real Robot"
]
},
{
"cell_type": "code",
2024-10-10 06:23:15 +08:00
"execution_count": 1,
2024-05-05 08:09:01 +08:00
"metadata": {},
2024-10-10 06:23:15 +08:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"pygame 2.6.1 (SDL 2.28.4, Python 3.10.12)\n",
"Hello from the pygame community. https://www.pygame.org/contribute.html\n"
]
}
],
2024-05-05 08:09:01 +08:00
"source": [
"from Go2Py.robot.fsm import FSM\n",
2024-05-21 05:35:10 +08:00
"from Go2Py.robot.remote import UnitreeRemote\n",
2024-05-05 08:09:01 +08:00
"from Go2Py.robot.safety import SafetyHypervisor\n",
"from Go2Py.control.walk_these_ways import *"
]
},
{
"cell_type": "code",
2024-10-10 06:23:15 +08:00
"execution_count": 2,
2024-05-05 08:09:01 +08:00
"metadata": {},
"outputs": [],
"source": [
2024-05-21 05:35:10 +08:00
"from Go2Py.robot.interface import GO2Real\n",
2024-05-05 08:09:01 +08:00
"import numpy as np\n",
"robot = GO2Real(mode='lowlevel')"
]
},
2024-03-21 05:40:33 +08:00
{
"cell_type": "code",
2024-10-10 06:23:15 +08:00
"execution_count": 3,
2024-03-21 05:40:33 +08:00
"metadata": {},
"outputs": [],
"source": [
"remote = UnitreeRemote(robot)\n",
"safety_hypervisor = SafetyHypervisor(robot)"
]
},
2024-05-21 05:35:10 +08:00
{
"cell_type": "code",
2024-10-10 06:23:15 +08:00
"execution_count": 4,
2024-05-21 05:35:10 +08:00
"metadata": {},
"outputs": [],
"source": [
"class walkTheseWaysController:\n",
" def __init__(self, robot, remote, checkpoint):\n",
" self.remote = remote\n",
" self.robot = robot\n",
" self.cfg = loadParameters(checkpoint)\n",
" self.policy = Policy(checkpoint)\n",
" self.command_profile = CommandInterface()\n",
" self.agent = WalkTheseWaysAgent(self.cfg, self.command_profile, self.robot)\n",
" self.agent = HistoryWrapper(self.agent)\n",
" self.init()\n",
"\n",
" def init(self):\n",
" self.obs = self.agent.reset()\n",
" self.policy_info = {}\n",
" self.command_profile.yaw_vel_cmd = 0.0\n",
" self.command_profile.x_vel_cmd = 0.0\n",
" self.command_profile.y_vel_cmd = 0.0\n",
" self.command_profile.stance_width_cmd=0.25\n",
" self.command_profile.footswing_height_cmd=0.08\n",
" self.command_profile.step_frequency_cmd = 3.0\n",
" self.command_profile.bodyHeight = 0.00\n",
"\n",
" def update(self, robot, remote):\n",
" action = self.policy(self.obs, self.policy_info)\n",
" self.obs, self.ret, self.done, self.info = self.agent.step(action)\n",
" vy = -robot.getRemoteState().lx\n",
" vx = robot.getRemoteState().ly\n",
" omega = -robot.getRemoteState().rx*2.2\n",
" self.command_profile.x_vel_cmd = vx*1.5\n",
" self.command_profile.y_vel_cmd = vy*1.5\n",
" self.command_profile.yaw_vel_cmd = omega"
]
},
2024-03-21 05:40:33 +08:00
{
"cell_type": "code",
2024-10-10 06:23:15 +08:00
"execution_count": 5,
2024-03-21 05:40:33 +08:00
"metadata": {},
2024-10-10 06:23:15 +08:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"p_gains: [20. 20. 20. 20. 20. 20. 20. 20. 20. 20. 20. 20.]\n"
]
}
],
2024-03-21 05:40:33 +08:00
"source": [
2024-05-05 08:09:01 +08:00
"checkpoint = \"../Go2Py/assets/checkpoints/walk_these_ways/\"\n",
2024-03-21 05:40:33 +08:00
"controller = walkTheseWaysController(robot, remote, checkpoint)\n",
2024-05-05 08:09:01 +08:00
"safety_hypervisor = SafetyHypervisor(robot)"
2024-03-21 05:40:33 +08:00
]
2024-03-21 12:06:35 +08:00
},
2024-05-05 09:14:41 +08:00
{
"cell_type": "code",
2024-10-10 06:23:15 +08:00
"execution_count": 6,
2024-05-05 09:14:41 +08:00
"metadata": {},
"outputs": [],
"source": [
"controller.command_profile.pitch_cmd=0.0\n",
"controller.command_profile.body_height_cmd=0.0\n",
"controller.command_profile.footswing_height_cmd=0.04\n",
"controller.command_profile.roll_cmd=0.0\n",
"controller.command_profile.stance_width_cmd=0.2\n",
"controller.command_profile.x_vel_cmd=-0.2\n",
"controller.command_profile.y_vel_cmd=0.01\n",
"controller.command_profile.setGaitType(\"trotting\")"
]
},
2024-03-21 12:06:35 +08:00
{
"cell_type": "code",
2024-10-10 06:23:15 +08:00
"execution_count": 7,
2024-03-21 12:06:35 +08:00
"metadata": {},
2024-10-10 06:23:15 +08:00
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"1728339973.560716 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.581085 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.601326 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.621690 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.642041 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.662610 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.683227 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.703813 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.724463 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.745079 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.765681 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.782172 [0] tev: ddsi_udp_conn_write to udp/239.255.0.1:7400 failed with retcode -1\n",
"1728339973.785983 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.806214 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.826430 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.846921 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.867324 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.887923 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.908528 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.929048 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.949323 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.969705 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339973.989890 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.010358 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.030675 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.051135 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.071715 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.092328 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.112921 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.133569 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.154189 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.174789 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.182335 [0] tev: ddsi_udp_conn_write to udp/239.255.0.1:7400 failed with retcode -1\n",
"1728339974.195392 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.215765 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.236137 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.256464 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.276806 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.297382 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.317962 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.338543 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.359184 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.379747 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.400285 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.420633 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.440894 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.461405 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.481924 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.502695 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.523301 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.543972 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.564363 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.584687 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.605047 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.625409 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.645712 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.666267 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.686868 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.707527 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.728323 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.749003 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.769833 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.790421 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.811051 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.831443 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.851959 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.872375 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.893042 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.913684 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.934285 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.954893 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.975536 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339974.982511 [0] tev: ddsi_udp_conn_write to udp/239.255.0.1:7400 failed with retcode -1\n",
"1728339974.996077 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.016392 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.036692 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.056987 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.077571 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.098188 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.118788 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.139345 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.159970 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.180616 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.201191 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.221733 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.242121 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.262382 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.282826 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.303389 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.323993 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.344661 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.365312 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.385901 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.406565 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.427139 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.447597 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.467987 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.488775 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.509333 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.529891 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.550518 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.571126 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.591779 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.612369 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.632978 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.653610 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.674010 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.694264 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.714594 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.734863 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.755241 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.775602 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.782605 [0] tev: ddsi_udp_conn_write to udp/239.255.0.1:7400 failed with retcode -1\n",
"1728339975.796091 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.816673 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.837379 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.857935 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.878451 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.899045 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.919689 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.940311 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.961099 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339975.981705 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.002190 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.022798 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.043227 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.063554 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.083799 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.104246 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.124622 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.145178 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.165977 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.186764 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.207552 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.228138 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.248809 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.269370 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.289626 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.309898 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.330415 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.351014 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.371637 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.392273 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.412877 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.433454 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.453953 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.474316 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.494678 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.515298 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.535907 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.556514 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.577039 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.597635 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.618174 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.638701 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.659267 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.679636 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.699988 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.720318 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.740980 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.761714 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.782323 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.802932 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.823687 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.844260 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.864882 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.885294 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.905581 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.925786 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.946161 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.966693 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339976.987332 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339977.007956 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339977.028599 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339977.049169 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339977.069776 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339977.090230 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339977.110611 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339977.130871 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339977.151120 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339977.171352 [0] pt_main_th: ddsi_udp_conn_write to udp/192.168.123.18:52988 failed with retcode -1\n",
"1728339980.481009 [0] tev: ddsi_udp_conn_write to udp/239.255.0.1:7400 failed with retcode -1\n"
]
}
],
2024-05-05 08:09:01 +08:00
"source": [
"fsm = FSM(robot, remote, safety_hypervisor, user_controller_callback=controller.update)"
]
},
2024-10-02 02:45:06 +08:00
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pressing `L2+A` to command the robot to stand up. After the the robot is on its feet, pressing `start` will hand over the control the RL policy. When you want to stop, pressing `L2+A` again will act similarly to the factory controller and locks the robot in standing mode. Finally, pressing `L2+A` again will command the robot to sit down."
]
},
2024-05-05 08:09:01 +08:00
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"fsm.close()"
]
2024-03-21 05:40:33 +08:00
}
],
"metadata": {
"kernelspec": {
"display_name": "b1-env",
"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",
2024-10-02 02:45:06 +08:00
"version": "3.10.12"
2024-03-21 05:40:33 +08:00
}
},
"nbformat": 4,
"nbformat_minor": 2
}