fix(legs, balance): invert wheel1/3 velocities and persist offset state

- Negated velocities for wheel1 and wheel3 in `control_wheels_vel` to match hardware direction, ensuring correct movement.
- Introduced `self.offs` in `BalanceController` to store offset values across calls instead of recreating them each update.
- Refactored `_update_offsets` to operate on the instance offsets, increased threshold sensitivity from 0.2 to 1, and adjusted scaling factors for smoother offset accumulation.
- Simplified offset limiting and normalization logic, removing redundant local variables.
- Updated `run_balance_loop` to initialize and use the persistent `self.offs` state.

These changes fix incorrect wheel commands and improve the stability and accuracy of the balance controller's offset handling.
This commit is contained in:
2025-12-21 11:23:46 +08:00
parent 7c3d18ffcb
commit c331d0bac0
9 changed files with 540 additions and 73 deletions

View File

@@ -88,7 +88,7 @@ class LegsController:
self.mc.control_Pos_Vel(self.motor4, -pos4, vel)
def control_wheels_vel(self,vel,of_vel):
self.mc.control_Vel(self.wheel1,vel+of_vel)
self.mc.control_Vel(self.wheel2,vel-of_vel)
self.mc.control_Vel(self.wheel3,vel-of_vel)
self.mc.control_Vel(self.wheel4,vel+of_vel)
self.mc.control_Vel(self.wheel1,-(vel+of_vel))
self.mc.control_Vel(self.wheel2,(vel-of_vel))
self.mc.control_Vel(self.wheel3,-(vel-of_vel))
self.mc.control_Vel(self.wheel4,(vel+of_vel))

Binary file not shown.

View File

@@ -31,6 +31,7 @@ class BalanceController:
self.imu = DummyImu()
# 运行标志,控制主循环的退出
self._running = False
self.offs=[0.0,0.0,0.0,0.0]
# ---------- 电机管理 ----------
def enable_all(self):
@@ -71,31 +72,30 @@ class BalanceController:
return min(max(offs, 0.0), 0.5)
def _update_offsets(self, data, dt):
offs=[0.0,0.0,0.0,0.0]
if data['pitch']>0.2:
offs[0]=offs[0]+0.0001*(data['pitch'])*pow(data['pitch'],0.1)
offs[1]=offs[1]+0.0001*(data['pitch'])*pow(data['pitch'],0.1)
if data['pitch']<-0.2:
offs[2]=offs[2]+0.0001*(-data['pitch'])*pow(-data['pitch'],0.1)
offs[3]=offs[3]+0.0001*(-data['pitch'])*pow(-data['pitch'],0.1)
if data['roll']<-0.2:
offs[0]=offs[0]+0.0001*(-data['roll'])*pow(-data['roll'],0.1)
offs[3]=offs[3]+0.0001*(-data['roll'])*pow(-data['roll'],0.1)
if data['roll']>0.2:
offs[1]=offs[1]+0.0001*(data['roll'])*pow(data['roll'],0.1)
offs[2]=offs[2]+0.0001*(data['roll'])*pow(data['roll'],0.1)
if data['pitch']>1:
self.offs[0]=self.offs[0]+0.0002*(data['pitch'])
self.offs[1]=self.offs[1]+0.0002*(data['pitch'])
if data['pitch']<-1:
self.offs[2]=self.offs[2]+0.0002*(-data['pitch'])
self.offs[3]=self.offs[3]+0.0002*(-data['pitch'])
if data['roll']<-1:
self.offs[0]=self.offs[0]+0.0001*(-data['roll'])
self.offs[3]=self.offs[3]+0.0001*(-data['roll'])
if data['roll']>1:
self.offs[1]=self.offs[1]+0.0001*(data['roll'])
self.offs[2]=self.offs[2]+0.0001*(data['roll'])
# 归一化到 0~0.5 区间
min_off = min(offs)
offs = [o - min_off for o in offs]
offs = [self._limit_offsets(o) for o in offs]
min_off = min(self.offs)
self.offs = [o - min_off for o in self.offs]
self.offs = [self._limit_offsets(o) for o in self.offs]
return offs
return self.offs
# ---------- 主循环 ----------
def run_balance_loop(self, max_vel=1.0):
self._running = True
offs = [0.0, 0.0, 0.0, 0.0]
self.offs = [0.0, 0.0, 0.0, 0.0]
prev_time = time.time()
while self._running:
@@ -108,19 +108,20 @@ class BalanceController:
prev_time = cur_time
data = self.imu.getData()
offs = self._update_offsets(data, dt)
self.offs = self._update_offsets(data, dt)
if getattr(self.legs, "mc", None):
vel = min(1.0, max_vel)
vel = min(12, max_vel)
# print(self.offs,data["roll"],data["pitch"])
self.control_legs_pos(
0.85 - offs[0],
0.85 - offs[1],
0.85 - offs[2],
0.85 - offs[3],
0.85 - self.offs[0],
0.85 - self.offs[1],
0.85 - self.offs[2],
0.85 - self.offs[3],
vel=vel,
)
else:
print("调试: 偏置计算结果", offs)
print("调试: 偏置计算结果", self.offs)
#print(f"euler: (roll={data['roll']:.2f}, pitch={data['pitch']:.2f}, yaw={data['yaw']:.2f})")
time.sleep(0.001)

44
main.py
View File

@@ -174,6 +174,14 @@ def start_balance_thread() -> None:
thread.start()
log("平衡控制线程已启动")
def start_spd_thread(nomspd,offspd) -> None:
"""在守护线程中启动平衡循环。"""
if controller is None:
log("启动speed控制失败无法创建 BalanceController")
return
controller.legs.control_wheels_vel(nomspd,offspd)
log("speed线程已启动")
def start_balance() -> tuple:
"""检查电机是否已使能后启动平衡控制。"""
if not port_opened:
@@ -204,6 +212,21 @@ def refresh_log() -> str:
# -------------------------------------------------
init_status = "未打开串口"
def control_speed(spd,off_spd):
"""检查电机是否已使能后启动平衡控制。"""
if not port_opened:
msg = "请先打开串口"
log(msg)
return (msg, msg)
if not motors_enabled:
msg = "启动平衡控制失败:电机未使能"
log(msg)
return (msg, msg)
start_spd_thread(spd,off_spd)
msg = "平衡控制已启动"
log(msg)
return (msg, msg)
# -------------------------------------------------
# Gradio UI
# -------------------------------------------------
@@ -231,26 +254,17 @@ with gr.Blocks() as demo:
disable_btn.click(fn=disable_all, inputs=None, outputs=[status_box, log_box])
start_btn.click(fn=start_balance, inputs=None, outputs=[status_box, log_box])
# 中间:位置控制
with gr.Column():
gr.Markdown("## 位置控制")
pos1 = gr.Slider(0, 0.85, label="腿 1 位置")
pos2 = gr.Slider(0, 0.85, label="腿 2 位置")
pos3 = gr.Slider(0, 0.85, label="腿 3 位置")
pos4 = gr.Slider(0, 0.85, label="腿 4 位置")
vel = gr.Slider(0.1, 1.0, value=0.5, step=0.1, label="速度比例")
set_btn = gr.Button("📍 设置位置")
pos_status = gr.Textbox(label="位置设置结果", interactive=False)
set_btn.click(fn=set_position,
inputs=[pos1, pos2, pos3, pos4, vel],
outputs=[pos_status, log_box])
gr.Markdown("## speed控制")
normal_speed = gr.Slider(label="spd",minimum=-1,maximum=1,value=0.0,step=0.01)
off_speed = gr.Slider(label="off",minimum=-1,maximum=1,value=0.0,step=0.01)
normal_speed.change(fn= control_speed,inputs=[normal_speed,off_speed], outputs=[status_box, log_box])
off_speed.change(fn= control_speed,inputs=[normal_speed,off_speed], outputs=[status_box, log_box])
# 右侧:扭矩读取
with gr.Column():
gr.Markdown("## 扭矩读取")
torque_output = gr.Textbox(label="腿部扭矩 (N/m)", interactive=False)
read_btn = gr.Button("🔍 读取扭矩")
read_btn = gr.Button("<EFBFBD> 读取扭矩")
read_btn.click(fn=get_torque, inputs=None, outputs=[torque_output, log_box])
demo.launch(server_name="0.0.0.0", server_port=7860, debug=True)

View File

@@ -46,40 +46,40 @@ print("#####################")
time.sleep(5)
offs1=0.0
offs2=0.0
offs3=0.0
offs4=0.0
self.offs1=0.0
self.offs2=0.0
self.offs3=0.0
self.offs4=0.0
for i in range(1,10000):
MC1.control_Pos_Vel(Motor1,-0.85+offs1,12)
MC1.control_Pos_Vel(Motor2,0.85-offs2,12)
MC1.control_Pos_Vel(Motor3,0.85-offs3,12)
MC1.control_Pos_Vel(Motor4,-0.85+offs4,12)
MC1.control_Pos_Vel(Motor1,-0.85+self.offs1,12)
MC1.control_Pos_Vel(Motor2,0.85-self.offs2,12)
MC1.control_Pos_Vel(Motor3,0.85-self.offs3,12)
MC1.control_Pos_Vel(Motor4,-0.85+self.offs4,12)
data = imu.getData()
if data['pitch']>0.2:
offs1=offs1+0.0001*(data['pitch'])*pow(data['pitch'],0.5)
offs2=offs2+0.0001*(data['pitch'])*pow(data['pitch'],0.5)
self.offs1=self.offs1+0.0001*(data['pitch'])*pow(data['pitch'],0.5)
self.offs2=self.offs2+0.0001*(data['pitch'])*pow(data['pitch'],0.5)
if data['pitch']<-0.2:
offs3=offs3+0.0001*(-data['pitch'])*pow(-data['pitch'],0.5)
offs4=offs4+0.0001*(-data['pitch'])*pow(-data['pitch'],0.5)
self.offs3=self.offs3+0.0001*(-data['pitch'])*pow(-data['pitch'],0.5)
self.offs4=self.offs4+0.0001*(-data['pitch'])*pow(-data['pitch'],0.5)
if data['roll']<-0.2:
offs1=offs1+0.0001*(-data['roll'])*pow(-data['roll'],0.2)
offs4=offs4+0.0001*(-data['roll'])*pow(-data['roll'],0.2)
self.offs1=self.offs1+0.0001*(-data['roll'])*pow(-data['roll'],0.2)
self.offs4=self.offs4+0.0001*(-data['roll'])*pow(-data['roll'],0.2)
if data['roll']>0.2:
offs2=offs2+0.0001*(data['roll'])*pow(data['roll'],0.2)
offs3=offs3+0.0001*(data['roll'])*pow(data['roll'],0.2)
add = min(offs1,offs2,offs3,offs4)
offs1=offs1-add
offs2=offs2-add
offs3=offs3-add
offs4=offs4-add
if offs1>0.5: offs1=0.5
if offs2>0.5: offs2=0.5
if offs3>0.5: offs3=0.5
if offs4>0.5: offs4=0.5
self.offs2=self.offs2+0.0001*(data['roll'])*pow(data['roll'],0.2)
self.offs3=self.offs3+0.0001*(data['roll'])*pow(data['roll'],0.2)
add = min(self.offs1,self.offs2,self.offs3,self.offs4)
self.offs1=self.offs1-add
self.offs2=self.offs2-add
self.offs3=self.offs3-add
self.offs4=self.offs4-add
if self.offs1>0.5: self.offs1=0.5
if self.offs2>0.5: self.offs2=0.5
if self.offs3>0.5: self.offs3=0.5
if self.offs4>0.5: self.offs4=0.5
print(f"euler: (roll={data['roll']:.2f}, pitch={data['pitch']:.2f}, yaw={data['yaw']:.2f})")
print(offs3,offs4,offs1,offs2,data['pitch'])
print(self.offs3,self.offs4,self.offs1,self.offs2,data['pitch'])
time.sleep(0.001)
MC1.disable(Wheel1)

452
ui.log
View File

@@ -1,3 +1,455 @@
2025-12-09 22:02:40,904 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-09 22:03:37,277 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-09 23:07:08,033 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-11 17:49:30,081 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-11 17:49:30,124 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-11 17:49:30,531 - INFO - HTTP Request: GET https://api.gradio.app/pkg-version "HTTP/1.1 200 OK"
2025-12-11 17:49:51,624 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 18:02:08,193 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 18:02:08,235 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 18:02:08,578 - INFO - HTTP Request: GET https://api.gradio.app/pkg-version "HTTP/1.1 200 OK"
2025-12-12 18:40:29,886 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 18:40:29,930 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 18:40:30,989 - INFO - HTTP Request: GET https://api.gradio.app/pkg-version "HTTP/1.1 200 OK"
2025-12-12 19:43:34,912 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 19:43:34,950 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 19:43:35,445 - INFO - HTTP Request: GET https://api.gradio.app/pkg-version "HTTP/1.1 200 OK"
2025-12-12 19:43:48,299 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 19:43:48,897 - INFO - 串口已打开
2025-12-12 19:43:53,584 - INFO - 电机已全部使能
2025-12-12 19:44:13,969 - INFO - 平衡控制线程已启动
2025-12-12 19:44:13,970 - INFO - 平衡控制已启动
2025-12-12 19:44:14,776 - INFO - 平衡循环启动
2025-12-12 19:44:20,140 - INFO - 读取扭矩: [-0.006837607, -0.034188036, 0.7042735, -0.6905983]
2025-12-12 19:44:21,760 - INFO - 读取扭矩: [-0.006837607, -0.006837607, 0.6495727, -0.74529916]
2025-12-12 19:44:23,077 - INFO - 读取扭矩: [-0.034188036, 0.034188036, 0.71794873, -0.8136752]
2025-12-12 19:44:24,550 - INFO - 平衡控制线程已启动
2025-12-12 19:44:24,551 - INFO - 平衡控制已启动
2025-12-12 19:44:25,053 - INFO - 平衡循环异常: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
2025-12-12 19:44:25,139 - INFO - 平衡循环已结束,资源已清理
2025-12-12 19:44:25,142 - INFO - 平衡循环已结束,资源已清理
2025-12-12 19:45:51,172 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 19:45:51,207 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 19:45:51,648 - INFO - HTTP Request: GET https://api.gradio.app/pkg-version "HTTP/1.1 200 OK"
2025-12-12 19:46:25,515 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 19:46:26,108 - INFO - 串口已打开
2025-12-12 19:46:28,623 - INFO - 电机已全部使能
2025-12-12 19:46:30,669 - INFO - 平衡控制线程已启动
2025-12-12 19:46:30,671 - INFO - 平衡控制已启动
2025-12-12 19:46:31,479 - INFO - 平衡循环启动
2025-12-12 19:46:41,176 - INFO - 所有电机已失能
2025-12-12 19:47:30,321 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 19:47:30,359 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 19:47:31,072 - INFO - HTTP Request: GET https://api.gradio.app/pkg-version "HTTP/1.1 200 OK"
2025-12-12 19:47:33,845 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 19:47:34,436 - INFO - 串口已打开
2025-12-12 19:47:37,250 - INFO - 电机已全部使能
2025-12-12 19:47:38,673 - INFO - 平衡控制线程已启动
2025-12-12 19:47:38,673 - INFO - 平衡控制已启动
2025-12-12 19:47:39,479 - INFO - 平衡循环启动
2025-12-12 19:47:49,232 - INFO - 所有电机已失能
2025-12-12 19:49:38,018 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 19:49:38,059 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 19:49:39,481 - INFO - HTTP Request: GET https://api.gradio.app/pkg-version "HTTP/1.1 200 OK"
2025-12-12 19:49:40,250 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 19:49:40,840 - INFO - 串口已打开
2025-12-12 19:49:44,536 - INFO - 电机已全部使能
2025-12-12 19:49:45,614 - INFO - 平衡控制线程已启动
2025-12-12 19:49:45,615 - INFO - 平衡控制已启动
2025-12-12 19:49:46,422 - INFO - 平衡循环启动
2025-12-12 19:50:03,067 - INFO - 所有电机已失能
2025-12-12 19:50:12,408 - INFO - 启动平衡控制失败:电机未使能
2025-12-12 19:52:05,287 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 19:52:05,319 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 19:52:05,818 - INFO - HTTP Request: GET https://api.gradio.app/pkg-version "HTTP/1.1 200 OK"
2025-12-12 19:52:07,973 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 19:52:08,562 - INFO - 串口已打开
2025-12-12 19:52:11,845 - INFO - 电机已全部使能
2025-12-12 19:52:12,720 - INFO - 平衡控制线程已启动
2025-12-12 19:52:12,722 - INFO - 平衡控制已启动
2025-12-12 19:52:13,529 - INFO - 平衡循环启动
2025-12-12 19:53:01,505 - INFO - 所有电机已失能
2025-12-12 20:13:59,109 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:13:59,144 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:15:49,484 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:15:50,072 - INFO - 串口已打开
2025-12-12 20:15:53,453 - INFO - 电机已全部使能
2025-12-12 20:15:54,866 - INFO - 所有电机已失能
2025-12-12 20:16:08,401 - INFO - 电机已全部使能
2025-12-12 20:16:09,619 - INFO - 平衡控制线程已启动
2025-12-12 20:16:09,619 - INFO - 平衡控制已启动
2025-12-12 20:16:10,424 - INFO - 平衡循环启动
2025-12-12 20:16:15,616 - INFO - 所有电机已失能
2025-12-12 20:17:07,970 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:17:08,001 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:17:22,535 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:17:23,121 - INFO - 串口已打开
2025-12-12 20:17:25,447 - INFO - 电机已全部使能
2025-12-12 20:17:27,074 - INFO - 平衡控制线程已启动
2025-12-12 20:17:27,074 - INFO - 平衡控制已启动
2025-12-12 20:17:27,881 - INFO - 平衡循环启动
2025-12-12 20:17:53,765 - INFO - 所有电机已失能
2025-12-12 20:09:28,169 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:09:28,206 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:11:51,185 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:11:51,774 - INFO - 串口已打开
2025-12-12 20:11:54,100 - INFO - 电机已全部使能
2025-12-12 20:11:55,781 - INFO - 平衡控制线程已启动
2025-12-12 20:11:55,782 - INFO - 平衡控制已启动
2025-12-12 20:11:56,587 - INFO - 平衡循环启动
2025-12-12 20:12:36,380 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:12:36,414 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:12:58,252 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:12:58,846 - INFO - 创建 BalanceController 失败: 'BalanceController' object has no attribute 'self'
2025-12-12 20:12:59,858 - INFO - 尝试创建 BalanceController第 2 次)
2025-12-12 20:13:00,447 - INFO - 创建 BalanceController 失败: 'BalanceController' object has no attribute 'self'
2025-12-12 20:13:01,456 - INFO - 尝试创建 BalanceController第 3 次)
2025-12-12 20:13:02,047 - INFO - 创建 BalanceController 失败: 'BalanceController' object has no attribute 'self'
2025-12-12 20:13:02,058 - INFO - 全部重试结束,仍未能创建 BalanceController
2025-12-12 20:13:02,059 - INFO - 打开串口失败:无法创建 BalanceController
2025-12-12 20:13:04,347 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:13:04,935 - INFO - 创建 BalanceController 失败: 'BalanceController' object has no attribute 'self'
2025-12-12 20:13:05,948 - INFO - 尝试创建 BalanceController第 2 次)
2025-12-12 20:13:06,535 - INFO - 创建 BalanceController 失败: 'BalanceController' object has no attribute 'self'
2025-12-12 20:13:07,544 - INFO - 尝试创建 BalanceController第 3 次)
2025-12-12 20:13:08,133 - INFO - 创建 BalanceController 失败: 'BalanceController' object has no attribute 'self'
2025-12-12 20:13:08,142 - INFO - 全部重试结束,仍未能创建 BalanceController
2025-12-12 20:13:08,145 - INFO - 打开串口失败:无法创建 BalanceController
2025-12-12 20:09:00,169 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:09:00,206 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:09:12,056 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:09:12,649 - INFO - 创建 BalanceController 失败: 'BalanceController' object has no attribute 'self'
2025-12-12 20:09:13,658 - INFO - 尝试创建 BalanceController第 2 次)
2025-12-12 20:09:14,244 - INFO - 创建 BalanceController 失败: 'BalanceController' object has no attribute 'self'
2025-12-12 20:09:15,255 - INFO - 尝试创建 BalanceController第 3 次)
2025-12-12 20:09:15,840 - INFO - 创建 BalanceController 失败: 'BalanceController' object has no attribute 'self'
2025-12-12 20:09:15,847 - INFO - 全部重试结束,仍未能创建 BalanceController
2025-12-12 20:09:15,847 - INFO - 打开串口失败:无法创建 BalanceController
2025-12-12 20:09:17,483 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:09:18,068 - INFO - 创建 BalanceController 失败: 'BalanceController' object has no attribute 'self'
2025-12-12 20:09:19,079 - INFO - 尝试创建 BalanceController第 2 次)
2025-12-12 20:09:19,663 - INFO - 创建 BalanceController 失败: 'BalanceController' object has no attribute 'self'
2025-12-12 20:09:20,672 - INFO - 尝试创建 BalanceController第 3 次)
2025-12-12 20:09:21,258 - INFO - 创建 BalanceController 失败: 'BalanceController' object has no attribute 'self'
2025-12-12 20:09:21,266 - INFO - 全部重试结束,仍未能创建 BalanceController
2025-12-12 20:09:21,267 - INFO - 打开串口失败:无法创建 BalanceController
2025-12-12 20:11:00,833 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:11:01,421 - INFO - 创建 BalanceController 失败: 'BalanceController' object has no attribute 'self'
2025-12-12 20:11:02,433 - INFO - 尝试创建 BalanceController第 2 次)
2025-12-12 20:11:03,020 - INFO - 创建 BalanceController 失败: 'BalanceController' object has no attribute 'self'
2025-12-12 20:11:04,029 - INFO - 尝试创建 BalanceController第 3 次)
2025-12-12 20:11:04,615 - INFO - 创建 BalanceController 失败: 'BalanceController' object has no attribute 'self'
2025-12-12 20:11:04,626 - INFO - 全部重试结束,仍未能创建 BalanceController
2025-12-12 20:11:04,627 - INFO - 打开串口失败:无法创建 BalanceController
2025-12-12 20:11:30,921 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:11:30,971 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:11:36,329 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:11:36,924 - INFO - 串口已打开
2025-12-12 20:11:40,955 - INFO - 电机已全部使能
2025-12-12 20:11:43,553 - INFO - 平衡控制线程已启动
2025-12-12 20:11:43,554 - INFO - 平衡控制已启动
2025-12-12 20:11:44,361 - INFO - 平衡循环启动
2025-12-12 20:11:44,449 - INFO - 平衡循环已结束,资源已清理
2025-12-12 20:11:49,471 - INFO - 失能电机异常: Attempting to use a port that is not open
2025-12-12 20:11:52,108 - INFO - 使能电机异常: Attempting to use a port that is not open
2025-12-12 20:11:53,686 - INFO - 串口已打开(已存在实例)
2025-12-12 20:11:55,762 - INFO - 串口已打开(已存在实例)
2025-12-12 20:11:57,032 - INFO - 使能电机异常: Attempting to use a port that is not open
2025-12-12 20:11:58,248 - INFO - 使能电机异常: Attempting to use a port that is not open
2025-12-12 20:12:48,604 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:12:48,639 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:12:53,542 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:12:54,131 - INFO - 串口已打开
2025-12-12 20:12:56,454 - INFO - 电机已全部使能
2025-12-12 20:12:57,423 - INFO - 平衡控制线程已启动
2025-12-12 20:12:57,423 - INFO - 平衡控制已启动
2025-12-12 20:12:58,230 - INFO - 平衡循环启动
2025-12-12 20:12:58,317 - INFO - 平衡循环已结束,资源已清理
2025-12-12 20:13:26,805 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:13:26,840 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:13:32,313 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:13:32,903 - INFO - 串口已打开
2025-12-12 20:13:34,568 - INFO - 电机已全部使能
2025-12-12 20:13:35,542 - INFO - 平衡控制线程已启动
2025-12-12 20:13:35,542 - INFO - 平衡控制已启动
2025-12-12 20:13:36,348 - INFO - 平衡循环启动
2025-12-12 20:13:36,435 - INFO - 平衡循环已结束,资源已清理
2025-12-12 20:15:10,276 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:15:10,308 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:15:17,704 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:15:18,295 - INFO - 串口已打开
2025-12-12 20:15:20,501 - INFO - 电机已全部使能
2025-12-12 20:15:21,927 - INFO - 平衡控制线程已启动
2025-12-12 20:15:21,928 - INFO - 平衡控制已启动
2025-12-12 20:15:22,734 - INFO - 平衡循环启动
2025-12-12 20:15:39,318 - INFO - 所有电机已失能
2025-12-12 20:16:14,397 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:16:14,430 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:16:20,913 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:16:21,501 - INFO - 串口已打开
2025-12-12 20:16:23,002 - INFO - 电机已全部使能
2025-12-12 20:16:23,927 - INFO - 平衡控制线程已启动
2025-12-12 20:16:23,927 - INFO - 平衡控制已启动
2025-12-12 20:16:24,736 - INFO - 平衡循环启动
2025-12-12 20:16:31,461 - INFO - 所有电机已失能
2025-12-12 20:17:13,234 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:17:13,268 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:17:18,781 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:17:19,370 - INFO - 串口已打开
2025-12-12 20:17:21,473 - INFO - 电机已全部使能
2025-12-12 20:17:22,508 - INFO - 平衡控制线程已启动
2025-12-12 20:17:22,508 - INFO - 平衡控制已启动
2025-12-12 20:17:23,316 - INFO - 平衡循环启动
2025-12-12 20:17:48,275 - INFO - 所有电机已失能
2025-12-12 20:09:29,475 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:09:29,513 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:11:11,245 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:11:11,833 - INFO - 串口已打开
2025-12-12 20:11:13,582 - INFO - 电机已全部使能
2025-12-12 20:11:14,391 - INFO - 平衡控制线程已启动
2025-12-12 20:11:14,392 - INFO - 平衡控制已启动
2025-12-12 20:11:15,198 - INFO - 平衡循环启动
2025-12-12 20:11:22,820 - INFO - 所有电机已失能
2025-12-12 20:17:27,329 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:17:27,367 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:18:08,455 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:18:09,048 - INFO - 串口已打开
2025-12-12 20:18:13,829 - INFO - 电机已全部使能
2025-12-12 20:18:15,310 - INFO - 平衡控制线程已启动
2025-12-12 20:18:15,311 - INFO - 平衡控制已启动
2025-12-12 20:18:16,120 - INFO - 平衡循环启动
2025-12-12 20:18:16,210 - INFO - 平衡循环已结束,资源已清理
2025-12-12 20:19:10,231 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:19:10,262 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:19:14,394 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:19:14,986 - INFO - 串口已打开
2025-12-12 20:19:18,055 - INFO - 电机已全部使能
2025-12-12 20:19:19,945 - INFO - 平衡控制线程已启动
2025-12-12 20:19:19,945 - INFO - 平衡控制已启动
2025-12-12 20:19:20,752 - INFO - 平衡循环启动
2025-12-12 20:19:20,841 - INFO - 平衡循环已结束,资源已清理
2025-12-12 20:20:23,840 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:20:23,873 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:20:29,195 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:20:29,801 - INFO - 串口已打开
2025-12-12 20:20:34,348 - INFO - 电机已全部使能
2025-12-12 20:20:35,372 - INFO - 平衡控制线程已启动
2025-12-12 20:20:35,372 - INFO - 平衡控制已启动
2025-12-12 20:20:36,179 - INFO - 平衡循环启动
2025-12-12 20:20:57,114 - INFO - 所有电机已失能
2025-12-12 20:22:03,369 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:22:03,407 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:22:10,482 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:22:11,073 - INFO - 串口已打开
2025-12-12 20:22:13,375 - INFO - 电机已全部使能
2025-12-12 20:22:16,473 - INFO - 平衡控制线程已启动
2025-12-12 20:22:16,475 - INFO - 平衡控制已启动
2025-12-12 20:22:17,283 - INFO - 平衡循环启动
2025-12-12 20:22:35,560 - INFO - 所有电机已失能
2025-12-12 20:24:00,602 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:24:00,637 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:24:15,531 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:24:16,122 - INFO - 串口已打开
2025-12-12 20:24:18,381 - INFO - 电机已全部使能
2025-12-12 20:24:22,047 - INFO - 平衡控制线程已启动
2025-12-12 20:24:22,048 - INFO - 平衡控制已启动
2025-12-12 20:24:22,854 - INFO - 平衡循环启动
2025-12-12 20:24:53,547 - INFO - 所有电机已失能
2025-12-12 20:08:57,990 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:08:58,029 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:09:57,089 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:09:57,677 - INFO - 串口已打开
2025-12-12 20:10:05,978 - INFO - 电机已全部使能
2025-12-12 20:10:07,159 - INFO - 平衡控制线程已启动
2025-12-12 20:10:07,159 - INFO - 平衡控制已启动
2025-12-12 20:10:07,965 - INFO - 平衡循环启动
2025-12-12 20:10:30,472 - INFO - 所有电机已失能
2025-12-12 20:10:57,908 - INFO - 所有电机已失能
2025-12-12 20:11:05,465 - INFO - 电机已全部使能
2025-12-12 20:11:40,439 - INFO - 所有电机已失能
2025-12-12 20:19:21,769 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:19:21,808 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:21:31,707 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:21:31,746 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:21:37,260 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:21:37,855 - INFO - 串口已打开
2025-12-12 20:21:42,939 - INFO - 电机已全部使能
2025-12-12 20:21:45,534 - INFO - 平衡控制线程已启动
2025-12-12 20:21:45,535 - INFO - 平衡控制已启动
2025-12-12 20:21:46,340 - INFO - 平衡循环启动
2025-12-12 20:21:52,836 - INFO - 所有电机已失能
2025-12-12 20:21:54,787 - INFO - 电机已全部使能
2025-12-12 20:22:58,075 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:22:58,116 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:23:02,868 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:23:03,461 - INFO - 串口已打开
2025-12-12 20:23:05,383 - INFO - 电机已全部使能
2025-12-12 20:23:08,479 - INFO - 平衡控制线程已启动
2025-12-12 20:23:08,479 - INFO - 平衡控制已启动
2025-12-12 20:23:09,284 - INFO - 平衡循环启动
2025-12-12 20:23:15,770 - INFO - 电机已全部使能
2025-12-12 20:24:23,188 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:24:23,222 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:24:37,790 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:24:38,378 - INFO - 串口已打开
2025-12-12 20:24:39,956 - INFO - 电机已全部使能
2025-12-12 20:24:40,824 - INFO - 平衡控制线程已启动
2025-12-12 20:24:40,824 - INFO - 平衡控制已启动
2025-12-12 20:24:41,632 - INFO - 平衡循环启动
2025-12-12 20:24:46,099 - INFO - speed线程已启动
2025-12-12 20:24:46,101 - INFO - 平衡控制已启动
2025-12-12 20:24:46,706 - INFO - speed线程已启动
2025-12-12 20:24:46,707 - INFO - 平衡控制已启动
2025-12-12 20:24:47,061 - INFO - speed线程已启动
2025-12-12 20:24:47,063 - INFO - 平衡控制已启动
2025-12-12 20:24:48,329 - INFO - speed线程已启动
2025-12-12 20:24:48,330 - INFO - 平衡控制已启动
2025-12-12 20:24:48,479 - INFO - speed线程已启动
2025-12-12 20:24:48,481 - INFO - 平衡控制已启动
2025-12-12 20:24:48,683 - INFO - speed线程已启动
2025-12-12 20:24:48,686 - INFO - 平衡控制已启动
2025-12-12 20:24:48,886 - INFO - speed线程已启动
2025-12-12 20:24:48,886 - INFO - 平衡控制已启动
2025-12-12 20:24:59,069 - INFO - speed线程已启动
2025-12-12 20:24:59,070 - INFO - 平衡控制已启动
2025-12-12 20:24:59,315 - INFO - speed线程已启动
2025-12-12 20:24:59,316 - INFO - 平衡控制已启动
2025-12-12 20:24:59,420 - INFO - speed线程已启动
2025-12-12 20:24:59,420 - INFO - 平衡控制已启动
2025-12-12 20:24:59,521 - INFO - speed线程已启动
2025-12-12 20:24:59,521 - INFO - 平衡控制已启动
2025-12-12 20:24:59,622 - INFO - speed线程已启动
2025-12-12 20:24:59,623 - INFO - 平衡控制已启动
2025-12-12 20:25:04,992 - INFO - speed线程已启动
2025-12-12 20:25:04,993 - INFO - 平衡控制已启动
2025-12-12 20:25:05,094 - INFO - speed线程已启动
2025-12-12 20:25:05,095 - INFO - 平衡控制已启动
2025-12-12 20:25:05,247 - INFO - speed线程已启动
2025-12-12 20:25:05,247 - INFO - 平衡控制已启动
2025-12-12 20:25:05,404 - INFO - speed线程已启动
2025-12-12 20:25:05,407 - INFO - 平衡控制已启动
2025-12-12 20:25:05,452 - INFO - speed线程已启动
2025-12-12 20:25:05,453 - INFO - 平衡控制已启动
2025-12-12 20:25:05,707 - INFO - speed线程已启动
2025-12-12 20:25:05,707 - INFO - 平衡控制已启动
2025-12-12 20:25:05,809 - INFO - speed线程已启动
2025-12-12 20:25:05,810 - INFO - 平衡控制已启动
2025-12-12 20:25:06,066 - INFO - speed线程已启动
2025-12-12 20:25:06,066 - INFO - 平衡控制已启动
2025-12-12 20:25:24,731 - INFO - speed线程已启动
2025-12-12 20:25:24,732 - INFO - 平衡控制已启动
2025-12-12 20:25:24,979 - INFO - speed线程已启动
2025-12-12 20:25:24,980 - INFO - 平衡控制已启动
2025-12-12 20:25:25,135 - INFO - speed线程已启动
2025-12-12 20:25:25,136 - INFO - 平衡控制已启动
2025-12-12 20:25:25,237 - INFO - speed线程已启动
2025-12-12 20:25:25,238 - INFO - 平衡控制已启动
2025-12-12 20:25:28,568 - INFO - 所有电机已失能
2025-12-12 20:26:20,242 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:26:20,280 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:26:31,931 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:26:32,519 - INFO - 串口已打开
2025-12-12 20:26:34,410 - INFO - 电机已全部使能
2025-12-12 20:26:35,281 - INFO - 平衡控制线程已启动
2025-12-12 20:26:35,281 - INFO - 平衡控制已启动
2025-12-12 20:26:36,090 - INFO - 平衡循环启动
2025-12-12 20:26:41,417 - INFO - speed线程已启动
2025-12-12 20:26:41,418 - INFO - 平衡控制已启动
2025-12-12 20:26:41,672 - INFO - speed线程已启动
2025-12-12 20:26:41,673 - INFO - 平衡控制已启动
2025-12-12 20:26:41,778 - INFO - speed线程已启动
2025-12-12 20:26:41,779 - INFO - 平衡控制已启动
2025-12-12 20:26:42,030 - INFO - speed线程已启动
2025-12-12 20:26:42,031 - INFO - 平衡控制已启动
2025-12-12 20:26:42,088 - INFO - speed线程已启动
2025-12-12 20:26:42,092 - INFO - 平衡控制已启动
2025-12-12 20:26:45,718 - INFO - 所有电机已失能
2025-12-12 20:08:46,140 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:08:46,184 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:10:10,999 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:10:11,592 - INFO - 串口已打开
2025-12-12 20:10:13,573 - INFO - 电机已全部使能
2025-12-12 20:10:15,500 - INFO - 平衡控制线程已启动
2025-12-12 20:10:15,500 - INFO - 平衡控制已启动
2025-12-12 20:10:16,307 - INFO - 平衡循环启动
2025-12-12 20:10:20,382 - INFO - speed线程已启动
2025-12-12 20:10:20,382 - INFO - 平衡控制已启动
2025-12-12 20:10:20,886 - INFO - speed线程已启动
2025-12-12 20:10:20,887 - INFO - 平衡控制已启动
2025-12-12 20:10:20,974 - INFO - 平衡循环已结束,资源已清理
2025-12-12 20:11:20,126 - INFO - 串口已打开(已存在实例)
2025-12-12 20:11:22,496 - INFO - 使能电机异常: Attempting to use a port that is not open
2025-12-12 20:11:43,762 - INFO - 串口已打开(已存在实例)
2025-12-12 20:11:44,920 - INFO - 使能电机异常: Attempting to use a port that is not open
2025-12-12 20:11:49,863 - INFO - 串口已打开(已存在实例)
2025-12-12 20:11:53,595 - INFO - 使能电机异常: Attempting to use a port that is not open
2025-12-12 20:09:29,266 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:09:29,310 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:09:46,367 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:09:46,959 - INFO - 串口已打开
2025-12-12 20:09:49,649 - INFO - 电机已全部使能
2025-12-12 20:10:09,211 - INFO - 所有电机已失能
2025-12-12 20:10:53,446 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:10:53,484 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:10:56,764 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:10:57,351 - INFO - 串口已打开
2025-12-12 20:11:01,238 - INFO - 电机已全部使能
2025-12-12 20:11:03,592 - INFO - 平衡控制线程已启动
2025-12-12 20:11:03,593 - INFO - 平衡控制已启动
2025-12-12 20:11:04,398 - INFO - 平衡循环启动
2025-12-12 20:11:09,054 - INFO - speed线程已启动
2025-12-12 20:11:09,057 - INFO - 平衡控制已启动
2025-12-12 20:11:09,870 - INFO - speed线程已启动
2025-12-12 20:11:09,871 - INFO - 平衡控制已启动
2025-12-12 20:11:55,611 - INFO - 所有电机已失能
2025-12-12 20:12:01,738 - INFO - 平衡循环已结束,资源已清理
2025-12-12 20:12:01,753 - INFO - 使能电机异常: argument must be an int, or have a fileno() method.
2025-12-12 20:12:15,917 - INFO - 失能电机异常: Attempting to use a port that is not open
2025-12-12 20:12:17,134 - INFO - 失能电机异常: Attempting to use a port that is not open
2025-12-12 20:12:17,994 - INFO - 失能电机异常: Attempting to use a port that is not open
2025-12-12 20:12:18,608 - INFO - 失能电机异常: Attempting to use a port that is not open
2025-12-12 20:12:18,808 - INFO - 失能电机异常: Attempting to use a port that is not open
2025-12-12 20:12:18,960 - INFO - 失能电机异常: Attempting to use a port that is not open
2025-12-12 20:12:19,114 - INFO - 失能电机异常: Attempting to use a port that is not open
2025-12-12 20:12:42,089 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:12:42,142 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:12:48,092 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:12:48,678 - INFO - 串口已打开
2025-12-12 20:12:51,908 - INFO - 电机已全部使能
2025-12-12 20:12:53,191 - INFO - 平衡控制线程已启动
2025-12-12 20:12:53,192 - INFO - 平衡控制已启动
2025-12-12 20:12:53,999 - INFO - 平衡循环启动
2025-12-12 20:13:00,766 - INFO - speed线程已启动
2025-12-12 20:13:00,767 - INFO - 平衡控制已启动
2025-12-12 20:13:00,856 - INFO - 平衡循环已结束,资源已清理
2025-12-12 20:13:51,913 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:13:51,954 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:13:55,687 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:13:56,274 - INFO - 串口已打开
2025-12-12 20:13:57,955 - INFO - 电机已全部使能
2025-12-12 20:13:59,283 - INFO - 平衡控制线程已启动
2025-12-12 20:13:59,284 - INFO - 平衡控制已启动
2025-12-12 20:14:00,090 - INFO - 平衡循环启动
2025-12-12 20:14:24,795 - INFO - speed线程已启动
2025-12-12 20:14:24,795 - INFO - 平衡控制已启动
2025-12-12 20:14:24,883 - INFO - 平衡循环已结束,资源已清理
2025-12-12 20:18:02,631 - INFO - HTTP Request: GET http://localhost:7860/gradio_api/startup-events "HTTP/1.1 200 OK"
2025-12-12 20:18:02,669 - INFO - HTTP Request: HEAD http://localhost:7860/ "HTTP/1.1 200 OK"
2025-12-12 20:18:08,691 - INFO - 尝试创建 BalanceController第 1 次)
2025-12-12 20:18:09,276 - INFO - 串口已打开
2025-12-12 20:18:11,036 - INFO - 电机已全部使能
2025-12-12 20:18:11,924 - INFO - 平衡控制线程已启动
2025-12-12 20:18:11,924 - INFO - 平衡控制已启动
2025-12-12 20:18:12,730 - INFO - 平衡循环启动
2025-12-12 20:18:17,896 - INFO - speed线程已启动
2025-12-12 20:18:17,896 - INFO - 平衡控制已启动
2025-12-12 20:18:18,151 - INFO - speed线程已启动
2025-12-12 20:18:18,152 - INFO - 平衡控制已启动
2025-12-12 20:18:21,192 - INFO - speed线程已启动
2025-12-12 20:18:21,192 - INFO - 平衡控制已启动
2025-12-12 20:18:21,295 - INFO - speed线程已启动
2025-12-12 20:18:21,295 - INFO - 平衡控制已启动
2025-12-12 20:18:21,451 - INFO - speed线程已启动
2025-12-12 20:18:21,452 - INFO - 平衡控制已启动
2025-12-12 20:18:22,157 - INFO - speed线程已启动
2025-12-12 20:18:22,158 - INFO - 平衡控制已启动