545 lines
17 KiB
Plaintext
545 lines
17 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"what are the actual interest values on the hopejr? make like a map"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"can change these dynamically so if the arm is moving down we can relax it instead of tensing it? so for example decreasing torque if the target position is lower than the actual position, for example. "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"arm_calibration = robot.get_arm_calibration()\n",
|
|
"robot.arm_bus.write(\"Goal_Position\", arm_calibration[\"start_pos\"])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Present Position: [1494]\n",
|
|
"Acceleration Read: [20]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"import time\n",
|
|
"from hopejr import HopeJuniorRobot\n",
|
|
"\n",
|
|
"\n",
|
|
"robot = HopeJuniorRobot()\n",
|
|
"robot.connect()\n",
|
|
"\n",
|
|
"# Example read of the current position\n",
|
|
"print(\"Present Position:\", robot.arm_bus.read(\"Present_Position\"))\n",
|
|
"\n",
|
|
"# Enable torque and set acceleration\n",
|
|
"robot.arm_bus.write(\"Torque_Enable\", 1)\n",
|
|
"robot.arm_bus.write(\"Acceleration\", 20)\n",
|
|
"print(\"Acceleration Read:\", robot.arm_bus.read(\"Acceleration\"))\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"robot.arm_bus.write(\"Torque_Limit\", 100,[\"elbow_flex\"])\n",
|
|
"robot.arm_bus.write(\"Protective_Torque\", 0, [\"elbow_flex\"])\n",
|
|
"robot.arm_bus.write(\"Acceleration\", 20)\n",
|
|
"robot.arm_bus.write(\"Goal_Position\", [2000], [\"elbow_flex\"])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"array([1000, 1000, 1000, 1000, 1000, 1000, 1000])"
|
|
]
|
|
},
|
|
"execution_count": 8,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"robot.arm_bus.read(\"Max_Torque_Limit\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"robot.arm_bus.write(\"Goal_Position\", [1909, 1977, 1820, 1000, 707, 1941, 1036]) #"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"robot.arm_bus.write(\"Max_Voltage_Limit\", [160, 140, 140, 160, 140, 140, 140]) #so its not torque limit nor max torque limit, , no protective torque or overload torque\n",
|
|
"#it's 1) max voltage limit, min-max angle limits are arbitrairly set for all the motors, max temp is only set for the shoulder\n",
|
|
"#max acceleration is also set, we could lower that in the elbow to make it less responsive to commands basically\n",
|
|
"#so we limit speed and temperature, maybe we should limit torque thouhg, minimum startup force is also important. protection current as well\n",
|
|
"#changed that to 310.\n",
|
|
"#\"Max_Voltage_Limit\" also needs to be changed, different from torque_limit"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Model = [777]\n",
|
|
"ID = [7]\n",
|
|
"Baud_Rate = [0]\n",
|
|
"Return_Delay = [0]\n",
|
|
"Response_Status_Level = [1]\n",
|
|
"Min_Angle_Limit = [1140]\n",
|
|
"Max_Angle_Limit = [2750]\n",
|
|
"Max_Temperature_Limit = [70]\n",
|
|
"Max_Voltage_Limit = [140]\n",
|
|
"Min_Voltage_Limit = [40]\n",
|
|
"Max_Torque_Limit = [1000]\n",
|
|
"Phase = [12]\n",
|
|
"Unloading_Condition = [44]\n",
|
|
"LED_Alarm_Condition = [47]\n",
|
|
"P_Coefficient = [32]\n",
|
|
"D_Coefficient = [32]\n",
|
|
"I_Coefficient = [0]\n",
|
|
"Minimum_Startup_Force = [16]\n",
|
|
"CW_Dead_Zone = [1]\n",
|
|
"CCW_Dead_Zone = [1]\n",
|
|
"Protection_Current = [310]\n",
|
|
"Angular_Resolution = [1]\n",
|
|
"Offset = [1047]\n",
|
|
"Mode = [0]\n",
|
|
"Protective_Torque = [20]\n",
|
|
"Protection_Time = [200]\n",
|
|
"Overload_Torque = [80]\n",
|
|
"Speed_closed_loop_P_proportional_coefficient = [10]\n",
|
|
"Over_Current_Protection_Time = [200]\n",
|
|
"Velocity_closed_loop_I_integral_coefficient = [200]\n",
|
|
"Torque_Enable = [1]\n",
|
|
"Acceleration = [20]\n",
|
|
"Goal_Position = [0]\n",
|
|
"Goal_Time = [0]\n",
|
|
"Goal_Speed = [0]\n",
|
|
"Torque_Limit = [1000]\n",
|
|
"Lock = [1]\n",
|
|
"Present_Position = [1494]\n",
|
|
"Present_Speed = [0]\n",
|
|
"Present_Load = [0]\n",
|
|
"Present_Voltage = [123]\n",
|
|
"Present_Temperature = [24]\n",
|
|
"Status = [0]\n",
|
|
"Moving = [0]\n",
|
|
"Present_Current = [0]\n",
|
|
"Maximum_Acceleration = [306]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"STS_SERIES_CONTROL_TABLE = {\n",
|
|
" \"Model\": (3, 2),\n",
|
|
" \"ID\": (5, 1),\n",
|
|
" \"Baud_Rate\": (6, 1),\n",
|
|
" \"Return_Delay\": (7, 1),\n",
|
|
" \"Response_Status_Level\": (8, 1),\n",
|
|
" \"Min_Angle_Limit\": (9, 2),\n",
|
|
" \"Max_Angle_Limit\": (11, 2),\n",
|
|
" \"Max_Temperature_Limit\": (13, 1),\n",
|
|
" \"Max_Voltage_Limit\": (14, 1),\n",
|
|
" \"Min_Voltage_Limit\": (15, 1),\n",
|
|
" \"Max_Torque_Limit\": (16, 2),\n",
|
|
" \"Phase\": (18, 1),\n",
|
|
" \"Unloading_Condition\": (19, 1),\n",
|
|
" \"LED_Alarm_Condition\": (20, 1),\n",
|
|
" \"P_Coefficient\": (21, 1),\n",
|
|
" \"D_Coefficient\": (22, 1),\n",
|
|
" \"I_Coefficient\": (23, 1),\n",
|
|
" \"Minimum_Startup_Force\": (24, 2),\n",
|
|
" \"CW_Dead_Zone\": (26, 1),\n",
|
|
" \"CCW_Dead_Zone\": (27, 1),\n",
|
|
" \"Protection_Current\": (28, 2),\n",
|
|
" \"Angular_Resolution\": (30, 1),\n",
|
|
" \"Offset\": (31, 2),\n",
|
|
" \"Mode\": (33, 1),\n",
|
|
" \"Protective_Torque\": (34, 1),\n",
|
|
" \"Protection_Time\": (35, 1),\n",
|
|
" \"Overload_Torque\": (36, 1),\n",
|
|
" \"Speed_closed_loop_P_proportional_coefficient\": (37, 1),\n",
|
|
" \"Over_Current_Protection_Time\": (38, 1),\n",
|
|
" \"Velocity_closed_loop_I_integral_coefficient\": (39, 1),\n",
|
|
" \"Torque_Enable\": (40, 1),\n",
|
|
" \"Acceleration\": (41, 1),\n",
|
|
" \"Goal_Position\": (42, 2),\n",
|
|
" \"Goal_Time\": (44, 2),\n",
|
|
" \"Goal_Speed\": (46, 2),\n",
|
|
" \"Torque_Limit\": (48, 2),\n",
|
|
" \"Lock\": (55, 1),\n",
|
|
" \"Present_Position\": (56, 2),\n",
|
|
" \"Present_Speed\": (58, 2),\n",
|
|
" \"Present_Load\": (60, 2),\n",
|
|
" \"Present_Voltage\": (62, 1),\n",
|
|
" \"Present_Temperature\": (63, 1),\n",
|
|
" \"Status\": (65, 1),\n",
|
|
" \"Moving\": (66, 1),\n",
|
|
" \"Present_Current\": (69, 2),\n",
|
|
" # Not in the Memory Table\n",
|
|
" \"Maximum_Acceleration\": (85, 2),\n",
|
|
"}\n",
|
|
"\n",
|
|
"import time\n",
|
|
"\n",
|
|
"# Assuming STS_SERIES_CONTROL_TABLE is defined globally\n",
|
|
"\n",
|
|
"def print_all_params(robot):\n",
|
|
" \"\"\"\n",
|
|
" Reads all parameters from the STS_SERIES_CONTROL_TABLE and prints their values.\n",
|
|
" \"\"\"\n",
|
|
" for param in STS_SERIES_CONTROL_TABLE.keys():\n",
|
|
" try:\n",
|
|
" val = robot.arm_bus.read(param)\n",
|
|
" print(f\"{param} = {val}\")\n",
|
|
" except Exception as e:\n",
|
|
" print(f\"{param} read failed: {e}\")\n",
|
|
"\n",
|
|
"\n",
|
|
"# Example usage:\n",
|
|
"print_all_params(robot)\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"probably max input voltage, we can also look at temperature and "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Acceleration Read: [20 20]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"\n",
|
|
"print(\"Acceleration Read:\", robot.arm_bus.read(\"Acceleration\"))"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 37,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"robot.arm_bus.write(\"LED_Alarm_Condition\", 2, [\"elbow_flex\"])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 16,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"robot.arm_bus.write(\"Acceleration\", 20, [\"elbow_flex\"])\n",
|
|
"robot.arm_bus.write(\"Acceleration\", 100, [\"wrist_yaw\"])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 73,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": []
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"robot.arm_bus.write(\"Goal_Position\", [1000, 1000], [\"elbow_flex\", \"wrist_yaw\"])\n",
|
|
"time.sleep(2)\n",
|
|
"robot.arm_bus.write(\"Goal_Position\", [2000, 2000], [\"elbow_flex\", \"wrist_yaw\"])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 68,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Elbow Flex Current: [1]\n",
|
|
"Elbow Flex Current: [0]\n",
|
|
"Elbow Flex Current: [3]\n",
|
|
"Elbow Flex Current: [1]\n",
|
|
"Elbow Flex Current: [1]\n",
|
|
"Elbow Flex Current: [2]\n",
|
|
"Elbow Flex Current: [1]\n",
|
|
"Elbow Flex Current: [1]\n",
|
|
"Elbow Flex Current: [2]\n",
|
|
"Elbow Flex Current: [1]\n",
|
|
"Elbow Flex Current: [1]\n",
|
|
"Elbow Flex Current: [0]\n"
|
|
]
|
|
},
|
|
{
|
|
"ename": "KeyboardInterrupt",
|
|
"evalue": "",
|
|
"output_type": "error",
|
|
"traceback": [
|
|
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
|
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
|
|
"Cell \u001b[0;32mIn[68], line 25\u001b[0m\n\u001b[1;32m 22\u001b[0m time\u001b[38;5;241m.\u001b[39msleep(\u001b[38;5;241m2\u001b[39m)\n\u001b[1;32m 23\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 24\u001b[0m \u001b[38;5;66;03m# If current is zero, hold at pos_a for a bit\u001b[39;00m\n\u001b[0;32m---> 25\u001b[0m \u001b[43mtime\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msleep\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n",
|
|
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"import time\n",
|
|
"\n",
|
|
"# Enable torque on elbow_flex\n",
|
|
"robot.arm_bus.write(\"Torque_Enable\", 1, [\"elbow_flex\"])\n",
|
|
"\n",
|
|
"pos_a = 2500\n",
|
|
"pos_b = 1000\n",
|
|
"\n",
|
|
"robot.arm_bus.write(\"Goal_Position\", pos_a, [\"elbow_flex\"])\n",
|
|
"time.sleep(2)\n",
|
|
"\n",
|
|
"while True:\n",
|
|
" current_val = robot.arm_bus.read(\"Present_Current\", \"elbow_flex\")\n",
|
|
" print(\"Elbow Flex Current:\", current_val)\n",
|
|
" \n",
|
|
" # If the servo is under non-zero load/current, switch position\n",
|
|
" if current_val > 1:\n",
|
|
" robot.arm_bus.write(\"Goal_Position\", pos_b, [\"elbow_flex\"])\n",
|
|
" time.sleep(2)\n",
|
|
" # Go back to pos_a again\n",
|
|
" robot.arm_bus.write(\"Goal_Position\", pos_a, [\"elbow_flex\"])\n",
|
|
" time.sleep(2)\n",
|
|
" else:\n",
|
|
" # If current is zero, hold at pos_a for a bit\n",
|
|
" time.sleep(1)\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"\"Acceleration\" = 0, infinitely fast\n",
|
|
"\"Acceleration\" = 20 slow\n",
|
|
"elbow_flex is the LED one (4)\n",
|
|
"\n",
|
|
"robot.arm_bus.write(\"LED_Alarm_Condition\", 2, [\"elbow_flex\"]) #on constantly\n",
|
|
"robot.arm_bus.write(\"LED_Alarm_Condition\", 1, [\"elbow_flex\"]) #beeping\n",
|
|
"robot.arm_bus.write(\"LED_Alarm_Condition\", 0, [\"elbow_flex\"]) #off\n",
|
|
"\n",
|
|
"\"Max_Torque_Limit\": (16, 2), is what i have o play around with or \"Protective_Torque\": (37, 1), maybe\n",
|
|
"\n",
|
|
"robot.arm_bus.write(\"Torque_Enable\", 1, [\"elbow_flex\"]) 1 can move 0 cant move\n",
|
|
"\n",
|
|
"robot.arm_bus.write(\"Torque_Limit\", 300, [\"elbow_flex\"]) #how strong/weak the servo is. 0 makes it so that it cannot move basically, but i'd like to have that value change honestly and for it to be waeaker\n",
|
|
"\n",
|
|
"robot.arm_bus.write(\"Torque_Limit\", 20,[\"elbow_flex\"]) 20 in ordre to get some motion\n",
|
|
"\n",
|
|
"default is 1000\n",
|
|
"\n",
|
|
"robot.arm_bus.write(\"Goal_Speed\", -s, [\"elbow_flex\"]) #changes how fast the servo moves when going to the target, does not make it move with a specific speed "
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"import time\n",
|
|
"\n",
|
|
"# Enable torque on elbow_flex\n",
|
|
"robot.arm_bus.write(\"Torque_Enable\", 1, [\"elbow_flex\"])\n",
|
|
"\n",
|
|
"pos_a = 1000\n",
|
|
"pos_b = 2500\n",
|
|
"\n",
|
|
"robot.arm_bus.write(\"Goal_Position\", pos_a, [\"elbow_flex\"])\n",
|
|
"time.sleep(2)\n",
|
|
"\n",
|
|
"while True:\n",
|
|
" current_val = robot.arm_bus.read(\"Present_Current\", \"elbow_flex\")\n",
|
|
" print(\"Elbow Flex Current:\", current_val)\n",
|
|
" \n",
|
|
" # If the servo is under non-zero load/current, switch position\n",
|
|
" if current_val > 1:\n",
|
|
" robot.arm_bus.write(\"Goal_Position\", pos_b, [\"elbow_flex\"])\n",
|
|
" time.sleep(2)\n",
|
|
" # Go back to pos_a again\n",
|
|
" robot.arm_bus.write(\"Goal_Position\", pos_a, [\"elbow_flex\"])\n",
|
|
" time.sleep(2)\n",
|
|
" else:\n",
|
|
" # If current is zero, hold at pos_a for a bit\n",
|
|
" time.sleep(1)\n",
|
|
"\n",
|
|
"\n",
|
|
"so if current is larger than x then you disable it \n",
|
|
"\n"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"robot.arm_bus.write(\"LED_Alarm_Condition\", 2, [\"elbow_flex\"])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 43,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"[0]\n",
|
|
"[0]\n",
|
|
"[2]\n",
|
|
"[4]\n",
|
|
"[0]\n",
|
|
"[0]\n",
|
|
"[0]\n"
|
|
]
|
|
},
|
|
{
|
|
"ename": "KeyboardInterrupt",
|
|
"evalue": "",
|
|
"output_type": "error",
|
|
"traceback": [
|
|
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
|
|
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
|
|
"Cell \u001b[0;32mIn[43], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28mprint\u001b[39m(robot\u001b[38;5;241m.\u001b[39marm_bus\u001b[38;5;241m.\u001b[39mread(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mPresent_Current\u001b[39m\u001b[38;5;124m\"\u001b[39m, [\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124melbow_flex\u001b[39m\u001b[38;5;124m\"\u001b[39m]))\n\u001b[0;32m----> 3\u001b[0m \u001b[43mtime\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msleep\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m)\u001b[49m\n",
|
|
"\u001b[0;31mKeyboardInterrupt\u001b[0m: "
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"while True:\n",
|
|
" print(robot.arm_bus.read(\"Present_Current\", [\"elbow_flex\"]))\n",
|
|
" time.sleep(1)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 47,
|
|
"metadata": {},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"Max_Voltage_Limit = [160 140 140 160 140 140 80]\n",
|
|
"Min_Angle_Limit = [ 650 1300 1300 1200 600 1725 0]\n",
|
|
"Max_Angle_Limit = [2600 2050 2800 2500 4096 2250 4095]\n",
|
|
"Max_Temperature_Limit = [80 70 70 80 70 70 70]\n",
|
|
"Acceleration = [20 20 20 20 20 20 20]\n",
|
|
"Torque_Limit = [1000 1000 1000 200 1000 1000 1000]\n",
|
|
"Minimum_Startup_Force = [15 16 16 12 16 16 16]\n",
|
|
"Protection_Current = [310 310 310 310 310 310 500]\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"import time\n",
|
|
"\n",
|
|
"def print_important_params(robot):\n",
|
|
"\n",
|
|
" # Example parameters you mentioned; adjust as needed\n",
|
|
" param_list = [\n",
|
|
" \"Max_Voltage_Limit\",\n",
|
|
" \"Min_Angle_Limit\",\n",
|
|
" \"Max_Angle_Limit\",\n",
|
|
" \"Max_Temperature_Limit\",\n",
|
|
" \"Acceleration\", # or \"Maximum_Acceleration\" if you prefer that register\n",
|
|
" \"Torque_Limit\", # or \"Max_Torque_Limit\" if your table uses that\n",
|
|
" \"Minimum_Startup_Force\",\n",
|
|
" \"Protection_Current\",\n",
|
|
" ]\n",
|
|
" \n",
|
|
" for param in param_list:\n",
|
|
" try:\n",
|
|
" val = robot.arm_bus.read(param)\n",
|
|
" print(f\"{param} = {val}\")\n",
|
|
" except Exception as e:\n",
|
|
" print(f\"{param} read failed: {e}\")\n",
|
|
"\n",
|
|
"# -------------------------------\n",
|
|
"# Example usage\n",
|
|
"\n",
|
|
"print_important_params(robot)\n"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "lerobot",
|
|
"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.10.16"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 2
|
|
}
|