Pf calb table py
From DIDEAS Wiki
PF Users Navigation:
- PCB; Lifefix_users; Pf_users; benchtest_users; CalibFix Users; Hardware; Assembly ; iochan ;
- PCA : PCB ; AKENC SC/MC 218 ; FET 217 ; IMU219 ; Swifi ; Rev200_mods ; PCA Inventory
- Special Commands to the Ankle (PFCMD) : State Controller Commands; Motor Controller Commands; Python Examples; IMU Commands ;PFCMD_PY; Pf_calb_table_py; Virtual spring test; PF EEPROM
- DOC: Pf_users; Powerfoot Keyboard User Interface; Steps for Manual Tuning; "Dashboard" Program For Assisting with Tuning
- NEW (CEB) WIKI
- Torque Feedback Controller Guide
Contents
new
parse robot source code
This method parses the robot source.
- Build a data structure for all complex data types
- Look for special macros that will help map data types, global variable names, and variable ID for query
#define RAM_ADDRESS_MACRO(type, variable_name) (&variable_name),((void*)sizeof(type)) #define EEPROM_ADDRESS_MACRO(type, ee_address) ((void*)ee_address),((void*)sizeof(type)) #define RAM_EEPROM_ADDRESS_MACRO(type, variable_name, ee_address) (&variable_name),((void*)ee_address),((void*)sizeof(type)) float robot_param_calb; float sensors; const void * SHARED_OBJECT_ADDRESSES[] = { RAM_EEPROM_ADDRESS_MACRO(SC_PARAM_T, robot_param_calb, EEPROM_SC_PARAM_ADDR), RAM_ADDRESS_MACRO(SENSORS_PARAM_T, sensors), EEPROM_ADDRESS_MACRO(MC_PARAM_T, EEPROM_MC_PARAM_ADDR), EEPROM_ADDRESS_MACRO(IMU_PARAM_T, EEPROM_IMU_PARAM_ADDR), } ;
Note: a table may only exist in RAM or EEPROM, or exist in both.
Create a table image
Need a python module that given a table type, and a set of keys and values will create a robot 'table' memory image.
- the module should return a list of keys that were specified
- the module should return a list of unknown keys that were specified
example: create_table_image('SC_PARAM_T', calb_dict);
get address of specified table type
- Query the robot to look up the RAM or EEPROM address of the table by table ID.
write a table to EEPROM on robot
- Given a table id and table image, write the table to the EEPROM
read a table from RAM or EEPROM
save table to text file
parse text file, build key:value list
The file will contain comments and key value pairs separated by a wide range of delimiters. There are a few special key names that python will use to match the text file to elements of the source code:
# comments about the source of the file # key, value pairs that will be used to identify the table in the firmware source code DATA_STRUCTURE_NAME = CALB_PARAM_T GLOBAL_VARIABLE_NAME = robot_param_calb FIRMWARE_VERSION_REQUIRED = 1.00, 2.00 # start of key value pairs that will be written to EEPROM, RAM spring_stiffness_push = 1000 # newton meters per radian spring_stiffness_pull = 500 # newton meters per radian
typedef struct { float spring_stiffness_push; float spring_stiffness_push; int16 joint_ankle_resolution; } CALB_PARAM_T; CALB_PARAM_T robot_param_calb; =old= Calibration tables live in a file called calb_table.py. The table is formatted as a python dictionary of dictionarys. The first dictionary uses a key equal to the robot code name. Eg "S01", "WB2", etc. The 2nd dictionary level is has two keys 'name' and 'value_list'. Value list is a list of numbers that represent the calibration coefficients. See the following example: == example calibration table entry == <pre> calb_table_x201['S01'] = {'name' : 'DS_S01_2009_05_01', 'value_list' : [ 9999.0, 9.9, -9.9, # motor current offset sin params : offset, amplitude , phase 9999.0, 9.9, 9.9, -421.59, -14.17, # pyramid 13000.0, -544, -2293, # hall sensor max plantar,zero, 8deg dors -0.04, 0.03, # hall segment boundary (seg a to b, seg b to c) -7912.4000, -2384.5000, -282.9800, -2.8549, # hall fit poly seg a -26904.0000, -287.6500, -93.0930, 0.0227, # seg b -1324.7000, 818.5000, -189.2800, 0.7572, # seg c 623.0, # k3 nM per radian 462.0, 1407, # series spring ] } ;
names of coefficients in the value list
v_x201_keys=[ 'phase_a_offset, phase_a_amplitude, phase_a_phase', 'phase_b_offset, phase_b_amplitude, phase_b_phase', 'pyramid_m','pyramid_b', 'hall_seg_ab_boundary', 'hall_seg_bc_boundary', 'hall_max_plantar', 'hall_zero', 'hall_max_dors', 'hall_poly_fit_seg_a0', 'hall_poly_fit_seg_a1', 'hall_poly_fit_seg_a2', 'hall_poly_fit_seg_a3', 'hall_poly_fit_seg_b0', 'hall_poly_fit_seg_b1', 'hall_poly_fit_seg_b2', 'hall_poly_fit_seg_b3', 'hall_poly_fit_seg_c0', 'hall_poly_fit_seg_c1', 'hall_poly_fit_seg_c2', 'hall_poly_fit_seg_c3', 'k3_const_nmpr', 'k2_pull_nmpr', 'k2_push_nmpr' ];