Files
balance/u2can/__pycache__/DM_CAN.cpython-313.pyc

222 lines
29 KiB
Plaintext
Raw Normal View History

new file: .vscode/settings.json new file: Legs_controller.py modified: README.md new file: __pycache__/Legs_controller.cpython-310.pyc new file: __pycache__/Legs_controller.cpython-313.pyc new file: __pycache__/balance.cpython-310.pyc new file: __pycache__/gradio.cpython-310.pyc new file: __pycache__/gradio.cpython-313.pyc new file: app_ui.py new file: balance.py new file: build/.cmake/api/v1/query/client-vscode/query.json new file: build/.cmake/api/v1/reply/cache-v2-ae4a9db768b4bbb36baa.json new file: build/.cmake/api/v1/reply/cmakeFiles-v1-389eb8769a8295e7571d.json new file: build/.cmake/api/v1/reply/codemodel-v2-5ea8cfc0b9263cbe5ae5.json new file: build/.cmake/api/v1/reply/directory-.-Debug-f5ebdc15457944623624.json new file: build/.cmake/api/v1/reply/index-2025-09-11T04-53-20-0515.json new file: build/.cmake/api/v1/reply/target-imu_py-Debug-3913d741f2156d7faae9.json new file: build/.cmake/api/v1/reply/toolchains-v1-3105704d088db7adbfb5.json new file: build/CMakeCache.txt new file: build/CMakeFiles/3.22.1/CMakeCXXCompiler.cmake new file: build/CMakeFiles/3.22.1/CMakeDetermineCompilerABI_CXX.bin new file: build/CMakeFiles/3.22.1/CMakeSystem.cmake new file: build/CMakeFiles/3.22.1/CompilerIdCXX/CMakeCXXCompilerId.cpp new file: build/CMakeFiles/3.22.1/CompilerIdCXX/a.out new file: build/CMakeFiles/CMakeDirectoryInformation.cmake new file: build/CMakeFiles/CMakeOutput.log new file: build/CMakeFiles/Makefile.cmake new file: build/CMakeFiles/Makefile2 new file: build/CMakeFiles/TargetDirectories.txt new file: build/CMakeFiles/cmake.check_cache new file: build/CMakeFiles/imu_py.dir/DependInfo.cmake new file: build/CMakeFiles/imu_py.dir/build.make new file: build/CMakeFiles/imu_py.dir/cmake_clean.cmake new file: build/CMakeFiles/imu_py.dir/compiler_depend.make new file: build/CMakeFiles/imu_py.dir/compiler_depend.ts new file: build/CMakeFiles/imu_py.dir/depend.make new file: build/CMakeFiles/imu_py.dir/flags.make new file: build/CMakeFiles/imu_py.dir/link.txt new file: build/CMakeFiles/imu_py.dir/progress.make new file: build/CMakeFiles/progress.marks new file: build/Makefile new file: build/cmake_install.cmake new file: build/compile_commands.json new file: dm_imu/bsp_crc.cpp new file: dm_imu/bsp_crc.h new file: dm_imu/imu_data.csv new file: dm_imu/imu_driver.cpp new file: dm_imu/imu_driver.h new file: dm_imu/imu_plot.png new file: dm_imu/plot_imu.py new file: dm_imu/test_imu.cpp new file: imu_data.csv new file: pybind_imu/CMakeLists.txt new file: pybind_imu/README.md new file: pybind_imu/build/CMakeCache.txt new file: pybind_imu/build/CMakeFiles/3.22.1/CMakeCXXCompiler.cmake new file: pybind_imu/build/CMakeFiles/3.22.1/CMakeDetermineCompilerABI_CXX.bin new file: pybind_imu/build/CMakeFiles/3.22.1/CMakeSystem.cmake new file: pybind_imu/build/CMakeFiles/3.22.1/CompilerIdCXX/CMakeCXXCompilerId.cpp new file: pybind_imu/build/CMakeFiles/3.22.1/CompilerIdCXX/a.out new file: pybind_imu/build/CMakeFiles/CMakeDirectoryInformation.cmake new file: pybind_imu/build/CMakeFiles/CMakeOutput.log new file: pybind_imu/build/CMakeFiles/Makefile.cmake new file: pybind_imu/build/CMakeFiles/Makefile2 new file: pybind_imu/build/CMakeFiles/TargetDirectories.txt new file: pybind_imu/build/CMakeFiles/cmake.check_cache new file: pybind_imu/build/CMakeFiles/imu_py.dir/DependInfo.cmake new file: pybind_imu/build/CMakeFiles/imu_py.dir/build.make new file: pybind_imu/build/CMakeFiles/imu_py.dir/cmake_clean.cmake new file: pybind_imu/build/CMakeFiles/imu_py.dir/compiler_depend.make new file: pybind_imu/build/CMakeFiles/imu_py.dir/compiler_depend.ts new file: pybind_imu/build/CMakeFiles/imu_py.dir/depend.make new file: pybind_imu/build/CMakeFiles/imu_py.dir/flags.make new file: pybind_imu/build/CMakeFiles/imu_py.dir/home/allenyuan/balance/dm_imu/bsp_crc.cpp.o new file: pybind_imu/build/CMakeFiles/imu_py.dir/home/allenyuan/balance/dm_imu/bsp_crc.cpp.o.d new file: pybind_imu/build/CMakeFiles/imu_py.dir/home/allenyuan/balance/dm_imu/imu_driver.cpp.o new file: pybind_imu/build/CMakeFiles/imu_py.dir/home/allenyuan/balance/dm_imu/imu_driver.cpp.o.d new file: pybind_imu/build/CMakeFiles/imu_py.dir/link.txt new file: pybind_imu/build/CMakeFiles/imu_py.dir/progress.make new file: pybind_imu/build/CMakeFiles/imu_py.dir/pybind_imu.cpp.o new file: pybind_imu/build/CMakeFiles/imu_py.dir/pybind_imu.cpp.o.d new file: pybind_imu/build/CMakeFiles/progress.marks new file: pybind_imu/build/Makefile new file: pybind_imu/build/cmake_install.cmake new file: pybind_imu/build/imu_py.cpython-310-aarch64-linux-gnu.so new file: pybind_imu/example.py new file: pybind_imu/pybind_imu.cpp new file: src/example.py new file: test_imu new file: u2can/DM_CAN.py new file: u2can/DM_Motor_Test.py new file: u2can/LICENSE new file: u2can/README.md new file: u2can/__pycache__/DM_CAN.cpython-310.pyc new file: u2can/__pycache__/DM_CAN.cpython-312.pyc new file: u2can/__pycache__/DM_CAN.cpython-313.pyc new file: u2can/__pycache__/gradio.cpython-313.pyc new file: u2can/__pycache__/motor_interface.cpython-313.pyc new file: u2can/motor_interface.py new file: u2can/requirements.txt new file: ui.log
2025-12-06 22:47:57 +08:00
<EFBFBD>
<0E><>hjX<00><00><00>SSKJr SSKrSSKJr SSKJr SSKJr "SS5r "SS 5r
S
r S \ S \ S \ 4Sjr S \RS\ S\ 4SjrSrSrSrSrSrSrSr"SS\5r"SS\5r"SS\5rg)<1F>)<01>sleepN)<01>IntEnum)<01>unpack)<01>packc<00>H<00>\rSrSrSrS\S\S\4SjrSrSrS r S
r
S r g ) <0A>Motor<6F>c<00><00>[S5Ul[S5Ul[S5Ul[S5Ul[S5UlX lX0lXlSUl [RUl 0Ul g)u<>
define Motor object 定义电机对象
:param MotorType: Motor type 电机类型
:param SlaveID: CANID 电机ID
:param MasterID: MasterID 主机ID 建议不要设为0
rFN)<0E>float<61>Pd<50>Vd<56>state_q<5F>state_dq<64> state_tau<61>SlaveID<49>MasterID<49> MotorType<70>isEnable<6C> Control_Type<70>MIT<49>NowControlMode<64>temp_param_dict)<04>selfrrrs <20>'/home/allenyuan/balance/u2can/DM_CAN.py<70>__init__<5F>Motor.__init__ sg<00><00><18><01>(<28><04><07><17><01>(<28><04><07><1C>Q<EFBFBD>x<EFBFBD><04> <0C><1D>a<EFBFBD><08><04> <0A><1E>q<EFBFBD><18><04><0E><1E> <0C> <20> <0A>"<22><0E><1D><04> <0A>*<2A>.<2E>.<2E><04><1B>!<21><04><1C><00>q<>dq<64>tauc<00>(<00>XlX lX0lg<00>N)rrr)rrrr s r<00> recv_data<74>Motor.recv_datas<00><00><18> <0C><1A> <0A><1C>rc<00><00>UR$)ub
get the position of the motor 获取电机位置
:return: the position of the motor 电机位置
)r<00>rs r<00> getPosition<6F>Motor.getPosition!s<00><00>
<14>|<7C>|<7C>rc<00><00>UR$)ub
get the velocity of the motor 获取电机速度
:return: the velocity of the motor 电机速度
)rr&s r<00> getVelocity<74>Motor.getVelocity(s<00><00>
<14>}<7D>}<7D>rc<00><00>UR$)u^
get the torque of the motor 获取电机力矩
:return: the torque of the motor 电机力矩
)rr&s r<00> getTorque<75>Motor.getTorque/s<00><00>
<14>~<7E>~<7E>rc<00>@<00>XR;aURU$g)u<>
get the parameter of the motor 获取电机内部的参数,需要提前读取
:param RID: DM_variable 电机参数
:return: the parameter of the motor 电机参数
N)r)r<00>RIDs r<00>getParam<61>Motor.getParam6s$<00><00> <0F>&<26>&<26> &<26><17>'<27>'<27><03>,<2C> ,<2C>r) rrrr rr rrrrrN) <0C>__name__<5F>
__module__<EFBFBD> __qualname__<5F>__firstlineno__rr r#r'r*r-r1<00>__static_attributes__<5F>rrrrs5<00><00>"<22>&<1D>5<EFBFBD><1D>e<EFBFBD><1D>%<25><1D>
<1C><1D><1E> rrc <00><><00>\rSrSr\R
"/SQ\R 5r/SQ/SQ/SQ/SQ/SQ/SQ/S Q/S
Q/S Q/S Q/S Q/S Q/ rSr S\
S\
S\
S\
S\
4
Sjr S\
S\
S\
S\
S\
S\
4 Sjr S\
S\
4Sjr SrS\
4SjrSrSrSrS rS!rS"rS#rS$rS%rS&\R 4S'jrS(rS)rS*rS+rS,rS-rS.r S/r!S0r"S1r#S2r$g3)4<> MotorControl<6F>B)<1E>U<00><><00><00><00>rrr<00>
rrrrrrrrrr rrrrrrrrrrr)<03>)@r>rA)rB<00>2rA)rBr <00>)rBrArD)rB<00>-<00>)rBrE<00>()rBrE<00>6)rB<00><00><>)rBrFrJ)rBir@)rBrErAc<00><><00>Xl[5Ul[5UlURR
(a[ S5 UR5 URR5 g)uf
define MotorControl object 定义电机控制对象
:param serial_device: serial object 串口对象
zSerial port is openN) <09>serial_<6C>dict<63>
motors_map<EFBFBD>bytes<65> data_save<76>is_open<65>print<6E>close<73>open)r<00> serial_devices rr<00>MotorControl.__init__MsM<00><00>
%<25> <0C><1E>&<26><04><0F><1E><17><04><0E> <0F><<3C><<3C> <1F> <1F> <11>'<27> (<28> <19> <1F> <1F> !<21> <0C> <0C> <0C><19><19>r<00>kp<6B>kdrrr c<00><><00>URUR;a [S5 g[USSS5n[USSS5nURn UR
U Sn
UR
U Sn UR
U Sn [XJ*U
S 5n [X[*U S5n[Xl*U S5n[ R"/S
Q[ R5nU S - S -US'U S -US'US - US'US-S -US - S--US'US -US 'US - US'US-S -US - S--US'US -US'URURU5 UR5 g)u<>
MIT Control Mode Function 达妙电机MIT控制模式函数
:param DM_Motor: Motor object 电机对象
:param kp: kp
:param kd: kd
:param q: position 期望位置
:param dq: velocity 期望速度
:param tau: torque 期望力矩
:return: None
z%controlMIT ERROR : Motor ID not foundNri<><00> <00>r@<00><00><00>rrrrrrrrr <00><><00><00>r?<00><00>) rrNrR<00> float_to_uintr<00> Limit_Param<61>np<6E>array<61>uint8<74>_MotorControl__send_data<74>recv)r<00>DM_MotorrWrXrrr <00>kp_uint<6E>kd_uintr<00>Q_MAX<41>DQ_MAX<41>TAU_MAX<41>q_uint<6E>dq_uint<6E>tau_uint<6E>data_bufs r<00>
controlMIT<EFBFBD>MotorControl.controlMITZs<><00><00> <14> <1B> <1B>4<EFBFBD>?<3F>?<3F> 2<> <11>9<> :<3A> <12><1F><02>A<EFBFBD>s<EFBFBD>B<EFBFBD>/<2F><07><1F><02>A<EFBFBD>q<EFBFBD>"<22>-<2D><07><1C>&<26>&<26> <09><14> <20> <20><19>+<2B>A<EFBFBD>.<2E><05><15>!<21>!<21>)<29>,<2C>Q<EFBFBD>/<2F><06><16>"<22>"<22>9<EFBFBD>-<2D>a<EFBFBD>0<><07><1E>q<EFBFBD>&<26>%<25><12>4<><06><1F><02>G<EFBFBD>V<EFBFBD>R<EFBFBD>8<><07> <20><13>h<EFBFBD><07><12><<3C><08><15>8<EFBFBD>8<EFBFBD>L<>b<EFBFBD>h<EFBFBD>h<EFBFBD>W<><08><1D><11>{<7B>d<EFBFBD>*<2A><08><11> <0B><1C>t<EFBFBD>m<EFBFBD><08><11> <0B><1D><11>l<EFBFBD><08><11> <0B><1F>#<23> <0A>!<21>+<2B><17>A<EFBFBD><1C><13>0D<30>E<><08><11> <0B><1D><04>n<EFBFBD><08><11> <0B><1D><11>l<EFBFBD><08><11> <0B><1F>#<23> <0A>!<21>+<2B><18>Q<EFBFBD><1D>#<23>0E<30>F<><08><11> <0B><1E><14>o<EFBFBD><08><11> <0B> <0C><18><18><18>)<29>)<29>8<EFBFBD>4<> <0C> <09> <09> r<00>delayc<00>@<00>URXX4XV5 [U5 g)u.
MIT Control Mode Function with delay 达妙电机MIT控制模式函数带延迟
:param DM_Motor: Motor object 电机对象
:param kp: kp
:param kd: kd
:param q: position 期望位置
:param dq: velocity 期望速度
:param tau: torque 期望力矩
:param delay: delay time 延迟时间 单位秒
N)rur)rrkrWrXrrr rws r<00> control_delay<61>MotorControl.control_delay}s<00><00> <0A><0F><0F><08>b<EFBFBD>R<EFBFBD>5<> <0A>e<EFBFBD> r<00> P_desired<65> V_desiredc<00>:<00>URUR;a [S5 gSUR-n[R"/SQ[R
5n[ U5n[ U5nXeSS&XuSS&URXE5 UR5 g)u<>
control the motor in position and velocity control mode 电机位置速度控制模式
:param Motor: Motor object 电机对象
:param P_desired: desired position 期望位置
:param V_desired: desired velocity 期望速度
:return: None
z*Control Pos_Vel Error : Motor ID not foundN<64>r^rr`r <00> rrNrRrfrgrh<00>float_to_uint8srirj)rrr{r|<00>motoridrt<00>P_desired_uint8s<38>V_desired_uint8ss r<00>control_Pos_Vel<65>MotorControl.control_Pos_Vel<65>s<><00><00> <11>=<3D>=<3D><04><0F><0F> /<2F> <11>><3E> ?<3F> <12><17>%<25>-<2D>-<2D>'<27><07><15>8<EFBFBD>8<EFBFBD>L<>b<EFBFBD>h<EFBFBD>h<EFBFBD>W<><08>*<2A>9<EFBFBD>5<><18>*<2A>9<EFBFBD>5<><18>(<28><11>1<EFBFBD> <0A>(<28><11>1<EFBFBD> <0A> <0C><18><18><17>+<2B> <0C> <09> <09> rc<00><00>URUR;a [S5 gSUR-n[R"/SQ[R
5n[ U5nXTSS&URX45 UR5 g)u<>
control the motor in velocity control mode 电机速度控制模式
:param Motor: Motor object 电机对象
:param Vel_desired: desired velocity 期望速度
z&control_VEL ERROR : Motor ID not foundNir^rr`r)rr<00> Vel_desiredr<64>rt<00>Vel_desired_uint8ss r<00> control_Vel<65>MotorControl.control_Vel<65>sn<00><00> <11>=<3D>=<3D><04><0F><0F> /<2F> <11>:<3A> ;<3B> <12><17>%<25>-<2D>-<2D>'<27><07><15>8<EFBFBD>8<EFBFBD>L<>b<EFBFBD>h<EFBFBD>h<EFBFBD>W<><08>,<2C>[<5B>9<><1A>*<2A><11>1<EFBFBD> <0A> <0C><18><18><17>+<2B> <0C> <09> <09> r<00>Pos_desc<00><><00>URUR;a [S5 gSUR-n[R"/SQ[R
5n[ U5nXvSS&[R"U5n[R"U5n US-US'US- US 'U S-US
'U S- US 'URXV5 UR5 g) uj
control the motor in EMIT control mode 电机力位混合模式
:param Pos_des: desired position rad 期望位置 单位为rad
:param Vel_des: desired velocity rad/s 期望速度 为放大100倍
:param i_des: desired current rang 0-10000 期望电流标幺值放大10000倍
电流标幺值:实际电流值除以最大电流值,最大电流见上电打印
z*control_pos_vel ERROR : Motor ID not foundNir^rr`r_r r[rbrc)
rrNrRrfrgrhr<><00>uint16rirj)
rrr<><00>Vel_des<65>i_desr<73>rt<00>Pos_desired_uint8s<38>Vel_uint<6E> ides_uints
r<00>control_pos_force<63>MotorControl.control_pos_force<63>s<><00><00> <11>=<3D>=<3D><04><0F><0F> /<2F> <11>><3E> ?<3F> <12><17>%<25>-<2D>-<2D>'<27><07><15>8<EFBFBD>8<EFBFBD>L<>b<EFBFBD>h<EFBFBD>h<EFBFBD>W<><08>,<2C>W<EFBFBD>5<><1A>*<2A><11>1<EFBFBD> <0A><15>9<EFBFBD>9<EFBFBD>W<EFBFBD>%<25><08><16>I<EFBFBD>I<EFBFBD>e<EFBFBD>$<24> <09><1E><14>o<EFBFBD><08><11> <0B><1E>!<21>m<EFBFBD><08><11> <0B><1F>$<24>&<26><08><11> <0B><1F>1<EFBFBD>n<EFBFBD><08><11> <0B> <0C><18><18><17>+<2B> <0C> <09> <09> rc<00><><00>URU[R"S55 [S5 UR 5 g)un
enable motor 使能电机
最好在上电后几秒后再使能电机
:param Motor: Motor object 电机对象
<EFBFBD><EFBFBD><><E79A99><EFBFBD><EFBFBD><EFBFBD>?N<><05>_MotorControl__control_cmdrfrhrrj<00>rrs r<00>enable<6C>MotorControl.enable<6C>s,<00><00> <0A><1A><1A>5<EFBFBD>"<22>(<28>(<28>4<EFBFBD>.<2E>1<> <0A>c<EFBFBD>
<EFBFBD> <0C> <09> <09> rc<00><><00>[R"/SQ[R5n[U5S-
S-UR-nUR XC5 [ S5 UR5 g)u<>
enable motor old firmware 使能电机旧版本固件,这个是为了旧版本电机固件的兼容性
可恶的旧版本固件使能需要加上偏移量
最好在上电后几秒后再使能电机
:param Motor: Motor object 电机对象
)r_r_r_r_r_r_r_r<>r@r\r<>N)rfrgrh<00>intrrirrj)rr<00> ControlModert<00> enable_ids r<00>
enable_old<EFBFBD>MotorControl.enable_old<6C>sT<00><00><16>8<EFBFBD>8<EFBFBD>L<>b<EFBFBD>h<EFBFBD>h<EFBFBD>W<><08><19>+<2B>&<26>q<EFBFBD>(<28>Q<EFBFBD>.<2E>%<25>-<2D>-<2D>?<3F> <09> <0C><18><18><19>-<2D> <0A>c<EFBFBD>
<EFBFBD> <0C> <09> <09> rc<00>f<00>URU[R"S55 [S5 g)uD
disable motor 失能电机
:param Motor: Motor object 电机对象
<EFBFBD><EFBFBD>g{<14>G<EFBFBD>z<EFBFBD>?N)r<>rfrhrr<>s r<00>disable<6C>MotorControl.disable<6C>s#<00><00>
<0A><1A><1A>5<EFBFBD>"<22>(<28>(<28>4<EFBFBD>.<2E>1<> <0A>d<EFBFBD> rc<00><><00>URU[R"S55 [S5 UR 5 g)u]
set the zero position of the motor 设置电机0位
:param Motor: Motor object 电机对象
<EFBFBD><EFBFBD>r<>Nr<4E>r<>s r<00>set_zero_position<6F>MotorControl.set_zero_position<6F>s,<00><00>
<0A><1A><1A>5<EFBFBD>"<22>(<28>(<28>4<EFBFBD>.<2E>1<> <0A>c<EFBFBD>
<EFBFBD> <0C> <09> <09> rc<00><00>SRURURR5/5nUR U5nUH?nUSSnUSS-USS--USS --US
-nUS nUR XEU5 MA g) Nrrcrarb<00>r[r]r`r r?r@)<06>joinrPrL<00>read_all<6C>_MotorControl__extract_packets<74>_MotorControl__process_packet<65>r<00> data_recv<63>packets<74>packet<65>data<74>CANID<49>CMDs rrj<00>MotorControl.recv<63>s<><00><00><17>H<EFBFBD>H<EFBFBD>d<EFBFBD>n<EFBFBD>n<EFBFBD>d<EFBFBD>l<EFBFBD>l<EFBFBD>.C<>.C<>.E<>F<>G<> <09><16>(<28>(<28><19>3<><07><1D>F<EFBFBD><19>!<21>B<EFBFBD><<3C>D<EFBFBD><1B>A<EFBFBD>Y<EFBFBD>"<22>_<EFBFBD><16><01><19>b<EFBFBD><1F>9<>V<EFBFBD>A<EFBFBD>Y<EFBFBD>!<21>^<5E>L<>v<EFBFBD>VW<56>y<EFBFBD>X<>E<EFBFBD><18><11>)<29>C<EFBFBD> <10> !<21> !<21>$<24>s<EFBFBD> 3<> rc<00><><00>URR5nURU5nUH?nUSSnUSS-USS--USS--US -nUS
nURXEU5 MA g) Nrcrarbr<>r[r]r`r r?r@)rLr<>r<><00>'_MotorControl__process_set_param_packetr<74>s r<00>recv_set_param_data<74> MotorControl.recv_set_param_data<74>s<><00><00><18>L<EFBFBD>L<EFBFBD>)<29>)<29>+<2B> <09><16>(<28>(<28><19>3<><07><1D>F<EFBFBD><19>!<21>B<EFBFBD><<3C>D<EFBFBD><1B>A<EFBFBD>Y<EFBFBD>"<22>_<EFBFBD><16><01><19>b<EFBFBD><1F>9<>V<EFBFBD>A<EFBFBD>Y<EFBFBD>!<21>^<5E>L<>v<EFBFBD>VW<56>y<EFBFBD>X<>E<EFBFBD><18><11>)<29>C<EFBFBD> <10> +<2B> +<2B>D<EFBFBD><13> =<3D> rc<00>(<00>US:XGa<>US:wGa>X R;Ga-[R"[R"US5S-US-5n[R"[R"US5S-USS- -5n[R"USS-S-US -5nURURnURUSnURUSn URUSn
[ XH*US
5n [ XY*U S 5n [ Xj*U
S 5n URUR X<>U 5 ggUSS-nX<>R;Ga-[R"[R"US5S-US-5n[R"[R"US5S-USS- -5n[R"USS-S-US -5nURURnURUSnURUSn URUSn
[ XH*US
5n [ XY*U S 5n [ Xj*U
S 5n URUR X<>U 5 ggg) N<>rr@r r\r?r`rar[r]rZ)rNrfr<>rre<00> uint_to_floatr#)rr<>r<>r<>rqrrrs<00>MotorType_recvrnrorp<00>recv_q<5F>recv_dq<64>recv_taurs r<00>__process_packet<65>MotorControl.__process_packetsp<00><00> <0E>$<24>;<3B><14><04>}<7D><18>O<EFBFBD>O<EFBFBD>+<2B><1F>Y<EFBFBD>Y<EFBFBD><02> <09> <09>$<24>q<EFBFBD>'<27>(:<3A>a<EFBFBD>(?<3F>4<EFBFBD><01>7<EFBFBD>'J<>K<>F<EFBFBD> <20>i<EFBFBD>i<EFBFBD><12><19><19>4<EFBFBD><01>7<EFBFBD>);<3B>q<EFBFBD>)@<40>T<EFBFBD>!<21>W<EFBFBD>PQ<50>\<5C>(R<>S<>G<EFBFBD>!<21>y<EFBFBD>y<EFBFBD>4<EFBFBD><01>7<EFBFBD>S<EFBFBD>=<3D>Q<EFBFBD>*><3E>$<24>q<EFBFBD>'<27>)I<>J<>H<EFBFBD>%)<29>_<EFBFBD>_<EFBFBD>U<EFBFBD>%;<3B>%E<>%E<>N<EFBFBD> <20>,<2C>,<2C>^<5E><<3C>Q<EFBFBD>?<3F>E<EFBFBD>!<21>-<2D>-<2D>n<EFBFBD>=<3D>a<EFBFBD>@<40>F<EFBFBD>"<22>.<2E>.<2E>~<7E>><3E>q<EFBFBD>A<>G<EFBFBD>*<2A>6<EFBFBD>6<EFBFBD>5<EFBFBD>"<22>E<>F<EFBFBD>+<2B>G<EFBFBD>W<EFBFBD>f<EFBFBD>b<EFBFBD>I<>G<EFBFBD>,<2C>X<EFBFBD>x<EFBFBD><17>"<22>M<>H<EFBFBD><18>O<EFBFBD>O<EFBFBD>E<EFBFBD>*<2A>4<>4<>V<EFBFBD>h<EFBFBD>O<>,<2C><1E>a<EFBFBD><17>4<EFBFBD><1E><08><1B><EFBFBD><EFBFBD>.<2E><1F>Y<EFBFBD>Y<EFBFBD><02> <09> <09>$<24>q<EFBFBD>'<27>(:<3A>a<EFBFBD>(?<3F>4<EFBFBD><01>7<EFBFBD>'J<>K<>F<EFBFBD> <20>i<EFBFBD>i<EFBFBD><12><19><19>4<EFBFBD><01>7<EFBFBD>);<3B>q<EFBFBD>)@<40>T<EFBFBD>!<21>W<EFBFBD>PQ<50>\<5C>(R<>S<>G<EFBFBD>!<21>y<EFBFBD>y<EFBFBD>4<EFBFBD><01>7<EFBFBD>S<EFBFBD>=<3D>Q<EFBFBD>*><3E>$<24>q<EFBFBD>'<27>)I<>J<>H<EFBFBD>%)<29>_<EFBFBD>_<EFBFBD>X<EFBFBD>%><3E>%H<>%H<>N<EFBFBD> <20>,<2C>,<2C>^<5E><<3C>Q<EFBFBD>?<3F>E<EFBFBD>!<21>-<2D>-<2D>n<EFBFBD>=<3D>a<EFBFBD>@<40>F<EFBFBD>"<22>.<2E>.<2E>~<7E>><3E>q<EFBFBD>A<>G<EFBFBD>*<2A>6<EFBFBD>6<EFBFBD>5<EFBFBD>"<22>E<>F<EFBFBD>+<2B>G<EFBFBD>W<EFBFBD>f<EFBFBD>b<EFBFBD>I<>G<EFBFBD>,<2C>X<EFBFBD>x<EFBFBD><17>"<22>M<>H<EFBFBD><18>O<EFBFBD>O<EFBFBD>H<EFBFBD>-<2D>7<>7<><06><18>R<>/<2F>! rc<00><><00>US:Xa<>USS:Xd USS:Xa<>UnUSS-US-nUS:XaUnX@R;aXPR;agUnUSn[U5(a6[US US
US US 5nXpRURU'g[ US US
US US 5nXpRURU'ggg) Nr<4E>r\<00>3r<r@r rr?r`r[rbrc)rN<00> is_in_ranges<65>uint8s_to_uint32r<00>uint8s_to_float)rr<>r<>r<><00>masterid<69>slaveIdr0<00>nums r<00>__process_set_param_packet<65>'MotorControl.__process_set_param_packet"s<><00><00> <0E>$<24>;<3B>D<EFBFBD><11>G<EFBFBD>t<EFBFBD>O<EFBFBD>t<EFBFBD>A<EFBFBD>w<EFBFBD>$<24><EFBFBD><1A>H<EFBFBD><1C>Q<EFBFBD><07>1<EFBFBD> <0C><04>Q<EFBFBD><07>/<2F>G<EFBFBD><14>d<EFBFBD>{<7B> <20><08><17><EFBFBD><EFBFBD>.<2E><1A>/<2F>/<2F>1<><1A>$<24>H<EFBFBD><16>q<EFBFBD>'<27>C<EFBFBD><1B>C<EFBFBD> <20> <20>&<26>t<EFBFBD>A<EFBFBD>w<EFBFBD><04>Q<EFBFBD><07><14>a<EFBFBD><17>$<24>q<EFBFBD>'<27>J<><03>AD<41><0F><0F><08>)<29>9<>9<>#<23>><3E>&<26>d<EFBFBD>1<EFBFBD>g<EFBFBD>t<EFBFBD>A<EFBFBD>w<EFBFBD><04>Q<EFBFBD><07><14>a<EFBFBD><17>I<><03>AD<41><0F><0F><08>)<29>9<>9<>#<23>><3E>-0?<3F>;rc<00><><00>XRUR'URS:waXRUR'g)uq
add motor to the motor control object 添加电机到电机控制对象
:param Motor: Motor object 电机对象
rT)rNrrr<>s r<00>addMotor<6F>MotorControl.addMotor<s3<00><00>
*/<2F><0F><0F><05> <0A> <0A>&<26> <10>><3E>><3E>Q<EFBFBD> <1E>.3<EFBFBD>O<EFBFBD>O<EFBFBD>E<EFBFBD>N<EFBFBD>N<EFBFBD> +<2B>r<00>cmdc
<00><><00>[R"SSSSSSSU/[R5nURURU5 g)Nr_)rfrgrhrir)rrr<>rts r<00> __control_cmd<6D>MotorControl.__control_cmdFs;<00><00><15>8<EFBFBD>8<EFBFBD>T<EFBFBD>4<EFBFBD><14>t<EFBFBD>T<EFBFBD>4<EFBFBD><14>s<EFBFBD>K<>R<EFBFBD>X<EFBFBD>X<EFBFBD>V<><08> <0C><18><18><15><1D><1D><08>1rc<00><><00>US-URS'US- S-URS'X RSS&URR[URR55 g)uU
send data to the motor 发送数据到电机
:param motor_id:
:param data:
:return:
r_<00> r <00><00><00>N)<05>send_data_framerL<00>writerO<00>T)r<00>motor_idr<64>s r<00> __send_data<74>MotorControl.__send_dataJsd<00><00>$,<2C>d<EFBFBD>?<3F><04><1C><1C>R<EFBFBD> <20>$,<2C><01>M<EFBFBD>D<EFBFBD>#8<><04><1C><1C>R<EFBFBD> <20>&*<2A><1C><1C>R<EFBFBD><02>#<23> <0C> <0C> <0C><1A><1A>5<EFBFBD><14>!5<>!5<>!7<>!7<>8<>9rc
<00><<00>URS-nURS- S-n[R"[R"U5[R"U5S[R"U5SSSS/[R5nUR SU5 g)Nr_r r<>r<00><>)rrfrgrhri)rrr0<00>can_id_l<5F>can_id_hrts r<00>__read_RID_param<61>MotorControl.__read_RID_paramVsz<00><00><18>=<3D>=<3D>4<EFBFBD>'<27><08><19>M<EFBFBD>M<EFBFBD>Q<EFBFBD>&<26><14>-<2D><08><15>8<EFBFBD>8<EFBFBD>R<EFBFBD>X<EFBFBD>X<EFBFBD>h<EFBFBD>/<2F><12><18><18>(<28>1C<31>T<EFBFBD>2<EFBFBD>8<EFBFBD>8<EFBFBD>TW<54>=<3D>Z^<5E>`d<>fj<66>lp<6C>q<>su<73>s{<7B>s{<7B>|<7C><08> <0C><18><18><15><08>)rc
<00><><00>URS-nURS- S-n[R"[R"U5[R"U5S[R"U5SSSS/[R5n[ U5(d[ U5USS&O[ [U55USS&URSU5 g)Nr_r r<rr`r<>) rrfrgrhr<>r<><00>data_to_uint8sr<73>ri)rrr0r<>r<>r<>rts r<00>__write_motor_param<61> MotorControl.__write_motor_param\s<><00><00><18>=<3D>=<3D>4<EFBFBD>'<27><08><19>M<EFBFBD>M<EFBFBD>Q<EFBFBD>&<26><14>-<2D><08><15>8<EFBFBD>8<EFBFBD>R<EFBFBD>X<EFBFBD>X<EFBFBD>h<EFBFBD>/<2F><12><18><18>(<28>1C<31>T<EFBFBD>2<EFBFBD>8<EFBFBD>8<EFBFBD>TW<54>=<3D>Z^<5E>`d<>fj<66>lp<6C>q<>su<73>s{<7B>s{<7B>|<7C><08><1B>C<EFBFBD> <20> <20>+<2B>D<EFBFBD>1<>H<EFBFBD>Q<EFBFBD>q<EFBFBD>M<EFBFBD>+<2B>3<EFBFBD>t<EFBFBD>9<EFBFBD>5<>H<EFBFBD>Q<EFBFBD>q<EFBFBD>M<EFBFBD> <0C><18><18><15><08>)rc<00><><00>SnSnSnURX[R"U55 [U5H<>n[ U5 UR 5 UR UR;dM:XPRUR R;dMbURUR RUU:Xa g g g)u<>
switch the control mode of the motor 切换电机控制模式
:param Motor: Motor object 电机对象
:param ControlMode: Control_Type 电机控制模式 example:MIT:Control_Type.MIT MIT模式
rA<><E79A99><EFBFBD><EFBFBD><EFBFBD>?TF) <09> _MotorControl__write_motor_paramrfrh<00>rangerr<>rrNr)rrr<><00> max_retries<65>retry_intervalr0<00>_s r<00>switchControlMode<64>MotorControl.switchControlModehs<><00><00> <19> <0B><1D><0E><10><03> <0C> <20> <20><15>R<EFBFBD>X<EFBFBD>X<EFBFBD>k<EFBFBD>-B<>C<><16>{<7B>#<23>A<EFBFBD> <11>.<2E> !<21> <10> $<24> $<24> &<26><14>}<7D>}<7D><04><0F><0F>/<2F><16>/<2F>/<2F>%<25>-<2D>-<2D>8<>H<>H<>H<><1B><EFBFBD><EFBFBD>u<EFBFBD>}<7D>}<7D>5<>E<>E<>c<EFBFBD>J<>k<EFBFBD>Y<>#<23>$<24>$<24>rc
<00>L<00>URS-nURS- S-n[R"[R"U5[R"U5SSSSSS/[R5nUR U5 UR SU5 [ S5 g)ul
save the all parameter to flash 保存所有电机参数
:param Motor: Motor object 电机对象
:return:
r_r r=rr<>g<><67><EFBFBD><EFBFBD>MbP?N)rrfrgrhr<>rir<00>rrr<>r<>rts r<00>save_motor_param<61>MotorControl.save_motor_param}s<><00><00> <19>=<3D>=<3D>4<EFBFBD>'<27><08><19>M<EFBFBD>M<EFBFBD>Q<EFBFBD>&<26><14>-<2D><08><15>8<EFBFBD>8<EFBFBD>R<EFBFBD>X<EFBFBD>X<EFBFBD>h<EFBFBD>/<2F><12><18><18>(<28>1C<31>T<EFBFBD>4<EFBFBD>QU<51>W[<5B>]a<>cg<63>h<>jl<6A>jr<6A>jr<6A>s<><08> <0C> <0C> <0C>U<EFBFBD><1B> <0C><18><18><15><08>)<29> <0A>e<EFBFBD> rc<00>j<00>X RUS'X0RUS'X@RUS'g)u<>
change the PMAX VMAX TMAX of the motor 改变电机的PMAX VMAX TMAX
:param Motor_Type:
:param PMAX: 电机的PMAX
:param VMAX: 电机的VMAX
:param TMAX: 电机的TMAX
:return:
rr@r\N)re)r<00>
Motor_Type<EFBFBD>PMAX<41>VMAX<41>TMAXs r<00>change_limit_param<61>MotorControl.change_limit_param<61>s=<00><00>+/<2F><18><18><1A>$<24>Q<EFBFBD>'<27>*.<2E><18><18><1A>$<24>Q<EFBFBD>'<27>*.<2E><18><18><1A>$<24>Q<EFBFBD>'rc
<00>4<00>URS-nURS- S-n[R"[R"U5[R"U5SSSSSS/[R5nUR SU5 UR 5 g)u)
get the motor status 获得电机状态
r_r <00><>rr<>N)rrfrgrhrirjr<>s r<00>refresh_motor_status<75>!MotorControl.refresh_motor_status<75>s|<00><00><19>=<3D>=<3D>4<EFBFBD>'<27><08><19>M<EFBFBD>M<EFBFBD>Q<EFBFBD>&<26>$<24>.<2E><08><15>8<EFBFBD>8<EFBFBD>R<EFBFBD>X<EFBFBD>X<EFBFBD>h<EFBFBD>/<2F><12><18><18>(<28>1C<31>T<EFBFBD>4<EFBFBD>QU<51>W[<5B>]a<>cg<63>h<>jl<6A>jr<6A>jr<6A>s<><08> <0C><18><18><15><08>)<29> <0C> <09> <09> rc<00>~<00>SnSnURXU5 [U5H<>nUR5 URUR;a`X RURR
;a:[ URURR
UU-
5S:a g g[U5 M<> g)u<>
change the RID of the motor 改变电机的参数
:param Motor: Motor object 电机对象
:param RID: DM_variable 电机参数
:param data: 电机参数的值
:return: True or False ,True means success, False means fail
rFr<>r<>TF)r<>r<>r<>rrNr<00>absr)rrr0r<>r<>r<>r<>s r<00>change_motor_param<61>MotorControl.change_motor_param<61>s<><00><00><19> <0B><1D><0E> <0C> <20> <20><15>T<EFBFBD>2<><16>{<7B>#<23>A<EFBFBD> <10> $<24> $<24> &<26><14>}<7D>}<7D><04><0F><0F>/<2F>C<EFBFBD>?<3F>?<3F>5<EFBFBD>=<3D>=<3D>;Y<>;i<>;i<>4i<34><16>t<EFBFBD><EFBFBD><EFBFBD>u<EFBFBD>}<7D>}<7D>5<>E<>E<>c<EFBFBD>J<>T<EFBFBD>Q<>R<>UX<55>X<><1F> <20> <11>.<2E> !<21>$<24>rc<00>\<00>SnSnURX5 [U5H<>n[U5 UR5 URUR
;dM:X R
URR ;a(UR
URR Us $ g g)u<>
read only the RID of the motor 读取电机的内部信息例如 版本号等
:param Motor: Motor object 电机对象
:param RID: DM_variable 电机参数
:return: 电机参数的值
rFr<>N)<07>_MotorControl__read_RID_paramr<6D>rr<>rrNr)rrr0r<>r<>r<>s r<00>read_motor_param<61>MotorControl.read_motor_param<61>s<><00><00><19> <0B><1D><0E> <0C><1D><1D>e<EFBFBD>)<29><16>{<7B>#<23>A<EFBFBD> <11>.<2E> !<21> <10> $<24> $<24> &<26><14>}<7D>}<7D><04><0F><0F>/<2F><16>/<2F>/<2F>%<25>-<2D>-<2D>8<>H<>H<>H<><1F>?<3F>?<3F>5<EFBFBD>=<3D>=<3D>9<>I<>I<>#<23>N<>N<><1F>$<24>rc<00><><00>/nSnSnSnSnSnU[U5U-
::aMXU:Xa,XU-S-
U:XaXXe-nURU5 Xe- nUnOUS- nU[U5U-
::aMMXSUlU$)Nr=r<r]rr@)<03>len<65>appendrP) rr<><00>frames<65>header<65>tail<69> frame_length<74>i<> remainder_pos<6F>frames r<00>__extract_packets<74>MotorControl.__extract_packets<74>s<><00><00><13><06><15><06><13><04><19> <0C> <0A><01><19> <0A><0F>3<EFBFBD>t<EFBFBD>9<EFBFBD>|<7C>+<2B>+<2B><13>w<EFBFBD>&<26> <20>T<EFBFBD>l<EFBFBD>*:<3A>Q<EFBFBD>*><3E>%?<3F>4<EFBFBD>%G<><1C>q<EFBFBD>/<2F>0<><05><16> <0A> <0A>e<EFBFBD>$<24><11>!<21><01> !<21> <0A><11>Q<EFBFBD><06><01><10>3<EFBFBD>t<EFBFBD>9<EFBFBD>|<7C>+<2B>+<2B><1E>n<EFBFBD>-<2D><04><0E><15> r)rPrNrLN)%r3r4r5r6rfrgrhr<>rerr ruryr<>r<>r<>r<>r<>r<>r<>rjr<>r<>r<>r<>r<>rir r<>r<>r<>r<>rrr
r<>r7r8rrr:r:Bs9<00><00><18>h<EFBFBD>h<EFBFBD> -<2D>.0<EFBFBD>h<EFBFBD>h<EFBFBD>8<>O<EFBFBD>"<22>><3E>=<3D>.<2E>!<21>><3E>><3E>?<3F>Tc<54>#<23>$4<>5E<35> G<01>K<EFBFBD> <1C>!<14>u<EFBFBD>!<14>%<25>!<14>E<EFBFBD>!<14>u<EFBFBD>!<14>SX<53>!<14>F <15>%<25> <15>U<EFBFBD> <15>u<EFBFBD> <15>%<25> <15>V[<5B> <15>di<64> <15><14><05><14>%<25><14>*<14> <14><05><14>0<14> <14><14><14>4<>><3E>S<01>>E<01>4<14>2<><02><08><08>2<>
:<3A>*<2A>
*<2A><15>* <15> /<2F><14><15>,<14>,rr:c<00>$<00>X::aUngX:<3A>aUnggr"r8)<03>x<>min<69>maxs r<00> LIMIT_MIN_MAXr<00>s<00><00><08>x<EFBFBD> <0F><01>
<EFBFBD><17> <0F><01>
rr<00>x_min<69>x_maxc<00>n<00>[XU5 X!-
nX-
U- n[R"USU-S-
-5$<00>Nr@)rrfr<>)rrr<00>bits<74>span<61> data_norms rrdrd<00>s;<00><00><11>!<21>E<EFBFBD>"<22> <10>=<3D>D<EFBFBD><12><19>d<EFBFBD>"<22>I<EFBFBD> <0A>9<EFBFBD>9<EFBFBD>Y<EFBFBD>1<EFBFBD><04>9<EFBFBD><01>/<2F>2<> 3<>3rrrc<00>l<00>X!-
n[U5SU-S-
- nXT-U-n[R"U5$r )r rf<00>float32)rrrr!r"r#<00>temps rr<>r<><00>s;<00><00> <0E>9<EFBFBD>D<EFBFBD><15>a<EFBFBD><08>Q<EFBFBD>$<24>Y<EFBFBD>!<21>O<EFBFBD>,<2C>I<EFBFBD> <14> <1B>c<EFBFBD> !<21>D<EFBFBD> <0A>:<3A>:<3A>d<EFBFBD> <1B>rc<00>2<00>[SU5n[SU5$)N<>f<>4B<34>rr<00><02>value<75>packeds rr<>r<><00>s<00><00> <11>#<23>u<EFBFBD> <1D>F<EFBFBD> <11>$<24><06> <1F>rc<00><><00>[U[5(aSUs=::aS::aO O [SU5nO [S5e[ SU5$)Nrl<00><EFBFBD><00>Iz3Value must be an integer within the range of uint32r))<05>
isinstancer<EFBFBD>r<00>
ValueErrorrr+s rr<>r<><00>sB<00><00><11>%<25><13><1D><1D>1<EFBFBD><05>#;<3B><1A>#;<3B><15>c<EFBFBD>5<EFBFBD>!<21><06><18>N<>O<>O<> <12>$<24><06> <1F>rc<00>d<00>SUs=::aS::d"O SUs=::aS::dO SUs=::aS::ag ggg) zG
check if the number is in the range of uint32
:param number:
:return:
rcrAr<>r]<00>#<00>$TFr8)<01>numbers rr<>r<> s=<00><00>
<EFBFBD>V<EFBFBD><19>r<EFBFBD><19>r<EFBFBD>V<EFBFBD>1<>r<EFBFBD>1<>r<EFBFBD>V<EFBFBD>7I<37>r<EFBFBD>7I<37><13>8J<01> <10><14> rc<00>:<00>[SXX#5n[SU5S$)N<><4Bz<Irr*<00><05>byte1<65>byte2<65>byte3<65>byte4r-s rr<>r<><00>"<00><00> <11>%<25><15>u<EFBFBD> 4<>F<EFBFBD> <11>$<24><06> <1F><01> "<22>"rc<00>:<00>[SXX#5n[SU5S$)Nr7z<frr*r8s rr<>r<>r=rc<00>h<00>UVs/sHoSPM nn[SRU55 gs snf)N<>02X<32> )rRr<>)r<><00>byte<74>
hex_valuess r<00> print_hexrD"s0<00><00>,0<>1<>D<EFBFBD>D<EFBFBD>#<23>J<EFBFBD>-<2D>D<EFBFBD>J<EFBFBD>1<> <09>#<23>(<28>(<28>:<3A>
<1E><1F><>2s<00> /c<00>4<00>U"U5$![a gf=fr")r1)<02>index<65>
enum_classs r<00>get_enum_by_indexrH's$<00><00><14><19>%<25> <20> <20><> <15><14><13><14>s <00>
<00>
<03>c<00>D<00>\rSrSrSrSrSrSrSrSr Sr
S r S
r S r S rS rSrg)<10> DM_Motor_Typei.rr@r\r?r`r[rbrcr <00> rA<00> r8N)r3r4r5r6<00>DM4310<31>
DM4310_48V<EFBFBD>DM4340<34>
DM4340_48V<EFBFBD>DM6006<30>DM8006<30>DM8009<30>DM10010L<30>DM10010<31>DMH3510<31>DMH6215<31>DMG6220r7r8rrrJrJ.s><00><00> <0E>F<EFBFBD><12>J<EFBFBD> <0E>F<EFBFBD><12>J<EFBFBD> <0E>F<EFBFBD> <0E>F<EFBFBD> <0E>F<EFBFBD><10>H<EFBFBD><0F>G<EFBFBD><0F>G<EFBFBD><10>G<EFBFBD><10>GrrJc<00><><00>\rSrSrSrSrSrSrSrSr Sr
S r S
r S r S rS rSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSr Sr!S r"S!r#S"r$S#r%S$r&S%r'S&r(S'r)S(r*S)r+S*r,S+r-S,r.S-r/S.r0S/r1g0)1<> DM_variablei=rr@r\r?r`r[rbrcr rKrArLrZr<>r<>rar]r<><00><00>rFr<><00><00>r<>rI<00><00>rDr<>r><00><00> <00>!<00>"r3r4rCr<><00>4<00>5rH<00>7<00>P<00>Qr8N)2r3r4r5r6<00>UV_Value<75>KT_Value<75>OT_Value<75>OC_Value<75>ACC<43>DEC<45>MAX_SPD<50>MST_ID<49>ESC_ID<49>TIMEOUT<55> CTRL_MODE<44>Damp<6D>Inertia<69>hw_ver<65>sw_ver<65>SN<53>NPP<50>Rs<52>LS<4C>Flux<75>Grr<72>r<>r<><00>I_BW<42>KP_ASR<53>KI_ASR<53>KP_APR<50>KI_APR<50>OV_Value<75>GREF<45>Deta<74>V_BW<42>IQ_c1<63>VL_c1<63>can_br<62>sub_ver<65>u_off<66>v_off<66>k1<6B>k2<6B>m_off<66>dir<69>p_m<5F>xoutr7r8rrrZrZ=s<><00><00><10>H<EFBFBD><10>H<EFBFBD><10>H<EFBFBD><10>H<EFBFBD>
<0B>C<EFBFBD>
<0B>C<EFBFBD><0F>G<EFBFBD> <0E>F<EFBFBD> <0E>F<EFBFBD><0F>G<EFBFBD><12>I<EFBFBD> <0A>D<EFBFBD><10>G<EFBFBD> <0F>F<EFBFBD> <0F>F<EFBFBD> <0B>B<EFBFBD>
<0C>C<EFBFBD> <0B>B<EFBFBD> <0B>B<EFBFBD> <0A>D<EFBFBD> <0B>B<EFBFBD> <0A>D<EFBFBD> <0A>D<EFBFBD> <0A>D<EFBFBD> <0A>D<EFBFBD> <0F>F<EFBFBD> <0F>F<EFBFBD> <0F>F<EFBFBD> <0F>F<EFBFBD><11>H<EFBFBD> <0A>D<EFBFBD> <0A>D<EFBFBD> <0A>D<EFBFBD> <0E>E<EFBFBD> <0E>E<EFBFBD> <0F>F<EFBFBD><10>G<EFBFBD> <0E>E<EFBFBD> <0E>E<EFBFBD> <0B>B<EFBFBD> <0B>B<EFBFBD> <0E>E<EFBFBD>
<0C>C<EFBFBD>
<0C>C<EFBFBD> <0A>DrrZc<00>$<00>\rSrSrSrSrSrSrSrg)rimr@r\r?r`r8N) r3r4r5r6r<00>POS_VEL<45>VEL<45>
Torque_Posr7r8rrrrms<00><00>
<0B>C<EFBFBD><0F>G<EFBFBD>
<0B>C<EFBFBD><12>Jrr)<1A>timer<00>numpyrf<00>enumr<00>structrrrr:rr rdr<>r<>r<>r<>r<>r<>r<>rDrHrJrZrr8rr<00><module>r<>s<><00><01><16><12><18><19><17>7<18>7<18>t\<16>\<16>~ <10>4<>U<EFBFBD>4<>5<EFBFBD>4<><15>4<><1C>R<EFBFBD>Y<EFBFBD>Y<EFBFBD><1C>U<EFBFBD><1C><15><1C> <20>  <20><11>#<23>#<23> <20>
<14> <11>G<EFBFBD> <11>-<0E>'<27>-<0E>`<13>7<EFBFBD>r