From fa5a9f0f89dd897db894c1ed7994bed80adee5c2 Mon Sep 17 00:00:00 2001 From: gitea Date: Wed, 10 Jul 2024 18:55:18 +0800 Subject: [PATCH] =?UTF-8?q?Surprisingly=20I=20made=20it!=20=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E4=BA=86=E5=88=B6=E5=8A=A8=E6=80=A7=E8=83=BD=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aio/assets/target.zip | Bin 24139 -> 26259 bytes aio/code/automatic_test/do_brake.py | 78 +++++++++++++--------------- 2 files changed, 35 insertions(+), 43 deletions(-) diff --git a/aio/assets/target.zip b/aio/assets/target.zip index 92a917449d0cf8286b6153b6cd4c532fb68b05ca..d7aea5ac501ba3a02b102e0f48150355659c9f92 100644 GIT binary patch delta 16088 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 M0Dv#xJOJST1FjWiN&o-= delta 13997 zcmZvD1y~$Q);8`I+!@^61HmD<1sUAkHTd8ff($OfU4wgYm*5&maF-AyNcact?tb^~ zzdcVs)zx*Ry84{yuJ^45Pe6}#K%=WFz{24|AwfYw!Fui_pmV`K7ZL(5h5zDn0oI28 zjtwb+&R$YKhGC$fK0~DOpuo`j1fcAc4V4vD+@TzW-X~|n6l2$c6o~;^;ar{=g#F$$ z5k3ojc-A?wM_x12HT;sg78WB#P%j}C-;a4CwP%}GU1Q9X_IvO+R>P2LmU^d6^Wz>Yglt!;1zWCeO(tq44LcD`5p z;^%?rHgDl6$@L~aaB*Kl+#1EgKCk0@&NlMUoi{n5AHtn$)Aok)Weom&#zMxei4}oRLlpKF&(JjA%9A$Uxp&!t9bmY8HH= z7Fp{fo(#sR9}a?5Vo{kP!sws-za1oLK3b3(%-3}BuN$V#v+vprc)crI#HcbFogKZp z-y4j%Jh~K3d$oaD)S>(iCo42vEoxr&^N`6vRKt%d`jQ=Awz{>EiU$P+ve&xBWw?+_wemPNwIDr0~9yGXf z9~@z!pr*mTNWvgS=cG0Xbd3^jx_p<&&2x!V!t6{v%Z^uy#p!LYy3nee8*6IaR@6z^ zXX-yR#y9N=`UmViow+GfV*TtozZU~+$07)W#kckuu-;=5&ogssx7DPOXj72PA3okW zbhg=X-AUq*i+UX(hX{UBLWKdRhry&36xe)6a8uDn!(UObC>pFxg7=>%t0dO)dneXj zTv>t8L5Y?B73x(XSpU))lgHL~^ZK{gLdWP#+zfDLfB-v1X*NtyMHa}XZosERVEUDh z3qOy|_ud;Egsk-{Hi?gE!cT6III5g`wAe((7`%^61~R+{;JMx0FV1*4e!u4*aYMGi z%0AoB{92QA$Zuzj3rD!RVR9O6PIym|7QyJtjmrwp6Q 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 OSrjO!6G$5r)c*s220DHK diff --git a/aio/code/automatic_test/do_brake.py b/aio/code/automatic_test/do_brake.py index 3fe1feb..926df32 100644 --- a/aio/code/automatic_test/do_brake.py +++ b/aio/code/automatic_test/do_brake.py @@ -1,4 +1,4 @@ -import random +from random import randint from time import sleep, time from sys import argv from os import scandir, mkdir @@ -178,33 +178,33 @@ def run_rl(path, loadsel, hr, md, config_file, prj_file, result_dirs, w2t): continue for count in range(1, 4): _count += 1 - w2t(f"[{_count}/64-{count}] 正在执行{axis}轴{condition}的制动测试......", 0, 0, 'purple', 'Automatic Test') + w2t(f"[{_count}/63-{count}] 正在执行{axis}轴{condition}的制动测试......", 0, 0, 'purple', 'Automatic Test') # 1. 关闭诊断曲线,触发软急停,并解除,目的是让可能正在运行着的机器停下来,切手动模式并下电 md.trigger_estop() md.reset_estop() + md.write_act(False) _response = execution('diagnosis.open', hr, w2t, open=False, display_open=False) - sleep(2) # 让曲线彻底关闭 + sleep(1) # 让曲线彻底关闭 _response = execution('state.switch_manual', hr, w2t) _response = execution('state.switch_motor_off', hr, w2t) # 2. 修改未要执行的场景 - if count == 1: - ssh = SSHClient() - ssh.set_missing_host_key_policy(AutoAddPolicy()) - ssh.connect('192.168.0.160', 22, username='luoshi', password='luoshi2019') - _rl_cmd = f"brake_E(j{axis}_{_reach}_p, j{axis}_{_reach}_n, p_speed, p_tool)" - _rl_speed = f"VelSet {_speed}" - cmd = 'cd /home/luoshi/bin/controller/; ' - cmd += 'sudo sed -i "/brake_E/d" projects/target/_build/brake/main.mod; ' - cmd += f'sudo sed -i "/DONOTDELETE/i {_rl_cmd}" projects/target/_build/brake/main.mod; ' - cmd += f'sudo sed -i "/VelSet/d" projects/target/_build/brake/main.mod; ' - cmd += f'sudo sed -i "/MoveAbsJ/i {_rl_speed}" projects/target/_build/brake/main.mod; ' - stdin, stdout, stderr = ssh.exec_command(cmd, get_pty=True) - stdin.write('luoshi2019' + '\n') - stdin.flush() - print(stdout.read().decode()) # 必须得输出一下stdout,才能正确执行sudo - print(stderr.read().decode()) # 顺便也执行以下stderr + ssh = SSHClient() + ssh.set_missing_host_key_policy(AutoAddPolicy()) + ssh.connect('192.168.0.160', 22, username='luoshi', password='luoshi2019') + _rl_cmd = f"brake_E(j{axis}_{_reach}_p, j{axis}_{_reach}_n, p_speed, p_tool)" + _rl_speed = f"VelSet {_speed}" + cmd = 'cd /home/luoshi/bin/controller/; ' + cmd += 'sudo sed -i "/brake_E/d" projects/target/_build/brake/main.mod; ' + cmd += f'sudo sed -i "/DONOTDELETE/i {_rl_cmd}" projects/target/_build/brake/main.mod; ' + cmd += f'sudo sed -i "/VelSet/d" projects/target/_build/brake/main.mod; ' + cmd += f'sudo sed -i "/MoveAbsJ/i {_rl_speed}" projects/target/_build/brake/main.mod; ' + stdin, stdout, stderr = ssh.exec_command(cmd, get_pty=True) + stdin.write('luoshi2019' + '\n') + stdin.flush() + print(stdout.read().decode()) # 必须得输出一下stdout,才能正确执行sudo + print(stderr.read().decode()) # 顺便也执行以下stderr # 3. reload工程后,pp2main,并且自动模式和上电,最后运行程序 prj_path = 'target/_build/target.prj' @@ -216,8 +216,6 @@ def run_rl(path, loadsel, hr, md, config_file, prj_file, result_dirs, w2t): for i in range(3): if md.read_ready_to_go() == 1: md.write_act(True) - sleep(1) - md.write_act(False) break else: sleep(1) @@ -226,7 +224,6 @@ def run_rl(path, loadsel, hr, md, config_file, prj_file, result_dirs, w2t): # 4. 第一次打开诊断曲线,并执行采集8s,之后触发软急停,关闭曲线采集,找出最大速度,传递给RL程序,最后清除相关记录 if count == 1: - sleep(4) # 排除从零点位置到目标位置的干扰 _response = execution('diagnosis.open', hr, w2t, open=True, display_open=True) _response = execution('diagnosis.set_params', hr, w2t, display_pdo_params=display_pdo_params) sleep(8) # 前八秒获取实际最大速度 @@ -244,10 +241,8 @@ def run_rl(path, loadsel, hr, md, config_file, prj_file, result_dirs, w2t): wb = load_workbook(config_file, read_only=True) ws = wb['Target'] speed_target = float(ws.cell(row=3, column=axis+1).value) * float(_speed) / 100 - print(f"speed target = {speed_target}") - print(f"speed max = {speed_max}") if speed_max < speed_target*0.95 or speed_max > speed_target*1.05: - w2t(f"Axis: {axis}-{count} | Speed: {speed_max*RADIAN} | Shouldbe: {speed_target}", 0, 0, 'indigo') + w2t(f"Axis: {axis}-{count} | Speed: {speed_max} | Shouldbe: {speed_target}", 0, 0, 'indigo', 'Automatic Test') md.write_speed_max(speed_max) sleep(1) @@ -260,27 +255,24 @@ def run_rl(path, loadsel, hr, md, config_file, prj_file, result_dirs, w2t): break # 5. 清除软急停,重新运行程序,并打开曲线发送继续运动信号,当速度达到最大值时,通过DO触发急停 - if count == 1: - md.reset_estop() - _response = execution('overview.reload', hr, w2t, prj_path=prj_path, tasks=['brake', 'stop0_related']) - _response = execution('rl_task.pp_to_main', hr, w2t, tasks=['brake', 'stop0_related']) - _response = execution('state.switch_auto', hr, w2t) - _response = execution('state.switch_motor_on', hr, w2t) - _response = execution('rl_task.run', hr, w2t, tasks=['brake', 'stop0_related']) - for i in range(3): - if md.read_ready_to_go() == 1: - md.write_act(True) - sleep(1) - md.write_act(False) - break - else: - sleep(1) + md.reset_estop() + _response = execution('overview.reload', hr, w2t, prj_path=prj_path, tasks=['brake', 'stop0_related']) + _response = execution('rl_task.pp_to_main', hr, w2t, tasks=['brake', 'stop0_related']) + _response = execution('state.switch_auto', hr, w2t) + _response = execution('state.switch_motor_on', hr, w2t) + _response = execution('rl_task.run', hr, w2t, tasks=['brake', 'stop0_related']) + for i in range(3): + if md.read_ready_to_go() == 1: + md.write_act(True) + break else: - w2t("未收到机器人的运行信号,需要确认RL程序编写正确并正常执行...", 0, 111, 'red', 'Automatic Test') + sleep(1) + else: + w2t("未收到机器人的运行信号,需要确认RL程序编写正确并正常执行...", 0, 111, 'red', 'Automatic Test') _response = execution('diagnosis.open', hr, w2t, open=True, display_open=True) _response = execution('diagnosis.set_params', hr, w2t, display_pdo_params=display_pdo_params) - sleep(random.randint(2, 8)) + # sleep(randint(3, 6)) md.write_probe(True) _t_start = time() while True: @@ -321,7 +313,7 @@ def main(path, hr, md, loadsel, w2t): run_rl(path, loadsel, hr, md, config_file, prj_file, result_dirs, w2t) _e_time = time() time_total = _e_time - _s_time - w2t(f"处理总时长:{time_total // 3600:02.0f} h {time_total % 3600 // 60:02.0f} m {time_total % 60:02.0f} s") + w2t(f"处理总时长:{time_total // 3600:02.0f} h {time_total % 3600 // 60:02.0f} m {time_total % 60:02.0f} s", 0, 0, 'green', 'Automatic Test') if __name__ == '__main__':