44@author: Andrea Del Prete
55"""
66
7+ from __future__ import print_function
8+
79from dynamic_graph import plug
810import numpy as np
911from dynamic_graph .sot .core .latch import Latch
@@ -67,7 +69,7 @@ def get_sim_conf():
6769 conf .motor_params = motor_params
6870 conf .ddp_controller = ddp_controller_conf
6971 return conf
70-
72+
7173def create_encoders (robot ):
7274 encoders = Selec_of_vector ('qn' )
7375 plug (robot .device .robotState , encoders .sin );
@@ -144,7 +146,7 @@ def create_signal_mixer(robot, conf):
144146 #plug(signal_mixer.sout, robot.torque_ctrl.jointsTorquesDesired);
145147 return signal_mixer
146148
147- def create_base_estimator (robot , dt , conf , robot_name = "robot" ):
149+ def create_base_estimator (robot , dt , conf , robot_name = "robot" ):
148150 from dynamic_graph .sot .torque_control .base_estimator import BaseEstimator
149151 base_estimator = BaseEstimator ('base_estimator' );
150152 plug (robot .encoders .sout , base_estimator .joint_positions );
@@ -166,7 +168,7 @@ def create_base_estimator(robot, dt, conf, robot_name="robot"):
166168 base_estimator .w_rf_in .value = conf .w_rf_in ;
167169 except :
168170 pass ;
169-
171+
170172 base_estimator .set_imu_weight (conf .w_imu );
171173 base_estimator .set_stiffness_right_foot (conf .K );
172174 base_estimator .set_stiffness_left_foot (conf .K );
@@ -180,10 +182,10 @@ def create_base_estimator(robot, dt, conf, robot_name="robot"):
180182 base_estimator .set_normal_force_margin_left_foot (conf .normal_force_margin )
181183 base_estimator .set_right_foot_sizes (conf .RIGHT_FOOT_SIZES )
182184 base_estimator .set_left_foot_sizes (conf .LEFT_FOOT_SIZES )
183-
185+
184186 base_estimator .init (dt , robot_name );
185187 return base_estimator ;
186-
188+
187189def create_imu_offset_compensation (robot , dt ):
188190 from dynamic_graph .sot .torque_control .imu_offset_compensation import ImuOffsetCompensation
189191 imu_offset_compensation = ImuOffsetCompensation ('imu_offset_comp' );
@@ -202,7 +204,7 @@ def create_imu_filter(robot, dt):
202204
203205def create_com_traj_gen (robot , dt ):
204206 com_traj_gen = NdTrajectoryGenerator ("com_traj_gen" );
205- com_traj_gen .initial_value .value = robot .dynamic .com .value
207+ com_traj_gen .initial_value .value = robot .dynamic .com .value
206208 com_traj_gen .trigger .value = 1.0
207209 com_traj_gen .init (dt ,3 )
208210 return com_traj_gen
@@ -241,11 +243,10 @@ def create_free_flyer_locator(ent, robot_name="robot"):
241243 try :
242244 plug (ff_locator .base6dFromFoot_encoders , ent .dynamic .position );
243245 except :
244- print "[WARNING] Could not connect to dynamic entity, probably because you are in simulation"
245- pass ;
246- ff_locator .init (robot_name );
247- return ff_locator ;
248-
246+ print ("[WARNING] Could not connect to dynamic entity, probably because you are in simulation" )
247+ ff_locator .init (robot_name )
248+ return ff_locator
249+
249250def create_flex_estimator (robot , dt = 0.001 ):
250251 from dynamic_graph .sot .application .state_observation .initializations .hrp2_model_base_flex_estimator_imu_force import HRP2ModelBaseFlexEstimatorIMUForce
251252 flex_est = HRP2ModelBaseFlexEstimatorIMUForce (robot , useMocap = False , dt = dt );
@@ -257,9 +258,9 @@ def create_flex_estimator(robot, dt=0.001):
257258 plug (robot .ff_locator .v , flex_est .inputVel .sin2 );
258259 plug (robot .ff_locator .v , flex_est .DCom .sin2 );
259260 return flex_est ;
260-
261+
261262def create_floatingBase (robot ):
262- from dynamic_graph .sot .application .state_observation .initializations .hrp2_model_base_flex_estimator_imu_force import FromLocalToGLobalFrame
263+ from dynamic_graph .sot .application .state_observation .initializations .hrp2_model_base_flex_estimator_imu_force import FromLocalToGLobalFrame
263264 floatingBase = FromLocalToGLobalFrame (robot .flex_est , "FloatingBase" )
264265 plug (robot .ff_locator .freeflyer_aa , floatingBase .sinPos );
265266
@@ -269,7 +270,7 @@ def create_floatingBase(robot):
269270 base_vel_no_flex .selec (0 , 6 );
270271 plug (base_vel_no_flex .sout , floatingBase .sinVel );
271272 return floatingBase
272-
273+
273274def create_position_controller (robot , gains , dt = 0.001 , robot_name = "robot" ):
274275 posCtrl = PositionController ('pos_ctrl' )
275276 posCtrl .Kp .value = tuple (gains .kp_pos [round (dt ,3 )]);
@@ -300,15 +301,15 @@ def create_trajectory_generator(robot, dt=0.001, robot_name="robot"):
300301def create_filters (robot , conf , motor_params , dt ):
301302 filters = Bunch ()
302303
303- # create low-pass filter for motor currents
304+ # create low-pass filter for motor currents
304305 filters .current_filter = create_butter_lp_filter_Wn_05_N_3 ('current_filter' , dt , NJ )
305-
306+
306307 #filters.current_filter = NumericalDifference("current_filter");
307308 filters .ft_RF_filter = NumericalDifference ("ft_RF_filter" );
308309 filters .ft_LF_filter = NumericalDifference ("ft_LF_filter" );
309310 filters .ft_RH_filter = NumericalDifference ("ft_RH_filter" );
310311 filters .ft_LH_filter = NumericalDifference ("ft_LH_filter" );
311- filters .acc_filter = NumericalDifference ("dv_filter" );
312+ filters .acc_filter = NumericalDifference ("dv_filter" );
312313 filters .gyro_filter = NumericalDifference ("w_filter" );
313314
314315 filters .estimator_kin = NumericalDifference ("estimator_kin" );
@@ -397,15 +398,15 @@ def create_torque_controller(robot, conf, motor_params, dt=0.001, robot_name="ro
397398 torque_ctrl .polySignDq .value = NJ * (conf .poly_sign_dq ,);
398399 torque_ctrl .init (dt , robot_name );
399400 return torque_ctrl ;
400-
401+
401402def create_balance_controller (robot , conf , motor_params , dt , robot_name = 'robot' ):
402403 from dynamic_graph .sot .torque_control .inverse_dynamics_balance_controller import InverseDynamicsBalanceController
403404 ctrl = InverseDynamicsBalanceController ("invDynBalCtrl" );
404405
405406 try :
406407 plug (robot .base_estimator .q , ctrl .q );
407408 plug (robot .base_estimator .v , ctrl .v );
408- except :
409+ except :
409410 plug (robot .ff_locator .base6dFromFoot_encoders , ctrl .q );
410411 plug (robot .ff_locator .v , ctrl .v );
411412
@@ -416,7 +417,7 @@ def create_balance_controller(robot, conf, motor_params, dt, robot_name='robot')
416417 robot .ddq_des .selec (6 ,NJ + 6 );
417418 #plug(robot.ddq_des.sout, robot.estimator_ft.ddqRef);
418419 except :
419- print "WARNING: Could not connect dv_des from BalanceController to ForceTorqueEstimator" ;
420+ print ( "WARNING: Could not connect dv_des from BalanceController to ForceTorqueEstimator" )
420421
421422 #plug(robot.estimator_ft.contactWrenchRightSole, ctrl.wrench_right_foot);
422423 #plug(robot.estimator_ft.contactWrenchLeftSole, ctrl.wrench_left_foot);
@@ -459,7 +460,7 @@ def create_balance_controller(robot, conf, motor_params, dt, robot_name='robot')
459460 # plug(robot.lh_traj_gen.x, ctrl.lh_ref_pos);
460461 # plug(robot.lh_traj_gen.dx, ctrl.lh_ref_vel);
461462 # plug(robot.lh_traj_gen.ddx, ctrl.lh_ref_acc);
462-
463+
463464 ctrl .posture_ref_pos .value = robot .halfSitting [7 :]
464465 ctrl .posture_ref_vel .value = 32 * (0.0 ,)
465466 ctrl .posture_ref_acc .value = 32 * (0.0 ,)
@@ -524,7 +525,7 @@ def create_balance_controller(robot, conf, motor_params, dt, robot_name='robot')
524525 ctrl .w_torques .value = conf .w_torques ;
525526
526527 ctrl .init (dt , robot_name );
527-
528+
528529 return ctrl ;
529530
530531def create_simple_inverse_dyn_controller (robot , conf , dt , robot_name = 'robot' ):
@@ -544,7 +545,7 @@ def create_simple_inverse_dyn_controller(robot, conf, dt, robot_name='robot'):
544545 # plug(robot.device.robotVelocity, ctrl.v)
545546 # ctrl.q.value = robot.halfSitting
546547 # ctrl.v.value = 38 * (0.0,)
547- # except:
548+ # except:
548549 # plug(robot.ff_locator.base6dFromFoot_encoders, ctrl.q)
549550 # plug(robot.ff_locator.v, ctrl.v)
550551 # plug(ctrl.right_foot_pos, robot.rf_traj_gen.initial_value)
@@ -562,12 +563,12 @@ def create_simple_inverse_dyn_controller(robot, conf, dt, robot_name='robot'):
562563 # plug(robot.lf_traj_gen.x, ctrl.lf_ref_pos)
563564 # plug(robot.lf_traj_gen.dx, ctrl.lf_ref_vel)
564565 # plug(robot.lf_traj_gen.ddx, ctrl.lf_ref_acc)
565-
566+
566567 # ctrl.posture_ref_pos.value = robot.halfSitting[6:]
567568 # ctrl.posture_ref_vel.value = 32*(0.0,)
568569 # ctrl.posture_ref_acc.value = 32*(0.0,)
569570
570- # ctrl.com_ref_pos.value = robot.dynamic.com.value
571+ # ctrl.com_ref_pos.value = robot.dynamic.com.value
571572 # ctrl.com_ref_vel.value = 3*(0.0,)
572573 # ctrl.com_ref_acc.value = 3*(0.0,)
573574
@@ -613,7 +614,7 @@ def create_simple_inverse_dyn_controller(robot, conf, dt, robot_name='robot'):
613614
614615 ctrl .init (dt , robot_name )
615616 return ctrl
616-
617+
617618def create_inverse_dynamics (robot , conf , motor_params , dt = 0.001 ):
618619 inv_dyn_ctrl = InverseDynamicsController ("inv_dyn" );
619620 plug (robot .device .robotState , inv_dyn_ctrl .base6d_encoders );
@@ -634,7 +635,7 @@ def create_inverse_dynamics(robot, conf, motor_params, dt=0.001):
634635 plug (inv_dyn_ctrl .tauDes , robot .torque_ctrl .jointsTorquesDesired );
635636 plug (inv_dyn_ctrl .tauDes , robot .estimator_ft .tauDes );
636637 plug (robot .estimator_ft .dynamicsError , inv_dyn_ctrl .dynamicsError );
637-
638+
638639 inv_dyn_ctrl .dynamicsErrorGain .value = (NJ + 6 )* (0.0 ,);
639640 inv_dyn_ctrl .Kp .value = tuple (conf .k_s ); # joint proportional conf
640641 inv_dyn_ctrl .Kd .value = tuple (conf .k_d ); # joint derivative conf
@@ -654,7 +655,7 @@ def create_inverse_dynamics(robot, conf, motor_params, dt=0.001):
654655 plug(robot.traj_gen.q, ddp_controller.pos_des);
655656 plug(robot.device.ptorque, ddp_controller.tau_measure);
656657 plug(robot.device.motor_angles, ddp_controller.pos_motor_measure);
657-
658+
658659 ddp_controller.temp_measure.value = conf.temp_const;
659660
660661 #plug(ddp_controller.tau, robot.torque_ctrl.jointsTorquesDesired);
@@ -671,7 +672,7 @@ def create_ddp_controller(robot, conf, dt):
671672 plug (robot .joint_torque_selec_ddp .sout , ddp_controller .tau_measure );
672673 plug (robot .motor_pos_selec_ddp .sout , ddp_controller .pos_motor_measure );
673674 plug (robot .tau_des_selec_ddp .sout , ddp_controller .tau_des );
674-
675+
675676 ddp_controller .temp_measure .value = conf .temp_const ;
676677
677678 #plug(ddp_controller.tau, robot.torque_ctrl.jointsTorquesDesired);
@@ -691,27 +692,27 @@ def create_pyrene_ddp_controller(robot, conf, dt):
691692 return ddp_controller
692693
693694def create_ctrl_manager (conf , motor_params , dt , robot_name = 'robot' ):
694- ctrl_manager = ControlManager ("ctrl_man" );
695+ ctrl_manager = ControlManager ("ctrl_man" );
695696
696697 ctrl_manager .tau_predicted .value = NJ * (0.0 ,);
697698 ctrl_manager .i_measured .value = NJ * (0.0 ,);
698699 ctrl_manager .tau_max .value = NJ * (conf .TAU_MAX ,);
699700 ctrl_manager .i_max .value = NJ * (conf .CURRENT_MAX ,);
700701 ctrl_manager .u_max .value = NJ * (conf .CTRL_MAX ,);
701-
702- # Init should be called before addCtrlMode
702+
703+ # Init should be called before addCtrlMode
703704 # because the size of state vector must be known.
704705 ctrl_manager .init (dt , conf .urdfFileName , robot_name )
705706
706707 # Set the map from joint name to joint ID
707708 for key in conf .mapJointNameToID :
708709 ctrl_manager .setNameToId (key ,conf .mapJointNameToID [key ])
709-
710+
710711 # Set the map joint limits for each id
711712 for key in conf .mapJointLimits :
712713 ctrl_manager .setJointLimitsFromId (key ,conf .mapJointLimits [key ][0 ], \
713714 conf .mapJointLimits [key ][1 ])
714-
715+
715716 # Set the force limits for each id
716717 for key in conf .mapForceIdToForceLimits :
717718 ctrl_manager .setForceLimitsFromId (key ,tuple (conf .mapForceIdToForceLimits [key ][0 ]), \
@@ -731,29 +732,29 @@ def create_ctrl_manager(conf, motor_params, dt, robot_name='robot'):
731732 # Set the hand frame name
732733 for key in conf .handFrameNames :
733734 ctrl_manager .setHandFrameName (key ,conf .handFrameNames [key ])
734-
735+
735736 # Set IMU hosting joint name
736737 ctrl_manager .setImuJointName (conf .ImuJointName )
737-
738+
738739 ctrl_manager .setRightFootForceSensorXYZ (conf .rightFootSensorXYZ );
739740 ctrl_manager .setRightFootSoleXYZ (conf .rightFootSoleXYZ );
740741
741742 return ctrl_manager ;
742743
743- def connect_ctrl_manager (robot ):
744- # connect to device
744+ def connect_ctrl_manager (robot ):
745+ # connect to device
745746 plug (robot .device .currents , robot .ctrl_manager .i_measured )
746747 plug (robot .device .ptorque , robot .ctrl_manager .tau )
747- robot .ctrl_manager .addCtrlMode ("torque" )
748+ robot .ctrl_manager .addCtrlMode ("torque" )
748749 plug (robot .inv_dyn .u , robot .ctrl_manager .ctrl_torque )
749750
750751 robot .ctrl_manager .setCtrlMode ("all" , "torque" )
751- plug (robot .ctrl_manager .joints_ctrl_mode_torque , robot .inv_dyn .active_joints )
752+ plug (robot .ctrl_manager .joints_ctrl_mode_torque , robot .inv_dyn .active_joints )
752753 plug (robot .ctrl_manager .u_safe , robot .device .control )
753754 return
754-
755+
755756def create_current_controller (robot , conf , motor_params , dt , robot_name = 'robot' ):
756- current_ctrl = CurrentController ("current_ctrl" );
757+ current_ctrl = CurrentController ("current_ctrl" );
757758
758759 current_ctrl .i_max .value = NJ * (conf .CURRENT_MAX ,);
759760 current_ctrl .u_max .value = NJ * (conf .CTRL_MAX ,);
@@ -772,9 +773,9 @@ def create_current_controller(robot, conf, motor_params, dt, robot_name='robot')
772773 plug (robot .filters .current_filter .x_filtered , current_ctrl .i_measured )
773774 plug (robot .filters .estimator_kin .dx , current_ctrl .dq );
774775 plug (current_ctrl .u_safe , robot .device .control );
775- # initialize
776+ # initialize
776777 current_ctrl .init (dt , robot_name , conf .CURRENT_OFFSET_ITERS )
777-
778+
778779 return current_ctrl ;
779780
780781
@@ -788,7 +789,7 @@ def create_admittance_ctrl(robot, conf, dt=0.001, robot_name='robot'):
788789 plug (robot .filters .ft_LF_filter .x_filtered , admit_ctrl .fLeftFootFiltered );
789790 plug (robot .inv_dyn .f_des_right_foot , admit_ctrl .fRightFootRef );
790791 plug (robot .inv_dyn .f_des_left_foot , admit_ctrl .fLeftFootRef );
791-
792+
792793 admit_ctrl .damping .value = 4 * (0.05 ,);
793794 admit_ctrl .controlledJoints .value = NJ * (1.0 ,);
794795 admit_ctrl .kp_force .value = conf .kp_force ;
@@ -797,14 +798,14 @@ def create_admittance_ctrl(robot, conf, dt=0.001, robot_name='robot'):
797798 admit_ctrl .ki_vel .value = conf .ki_vel ;
798799 admit_ctrl .force_integral_saturation .value = conf .force_integral_saturation ;
799800 admit_ctrl .force_integral_deadzone .value = conf .force_integral_deadzone ;
800-
801+
801802 # connect it to torque control
802803 from dynamic_graph .sot .core import Add_of_vector
803804 robot .sum_torque_adm = Add_of_vector ('sum_torque_adm' );
804805 plug (robot .inv_dyn .tau_des , robot .sum_torque_adm .sin1 );
805806 plug (admit_ctrl .u , robot .sum_torque_adm .sin2 );
806807 plug (robot .sum_torque_adm .sout , robot .torque_ctrl .jointsTorquesDesired );
807-
808+
808809 admit_ctrl .init (dt , robot_name );
809810 return admit_ctrl ;
810811
@@ -825,7 +826,7 @@ def create_topic(rospub, entity, signalName, renameSignal, robot=None, data_type
825826 plug (entity .signal (signalName ), rospub .signal (rospub_signalName ))
826827 if robot is not None :
827828 robot .device .after .addSignal ('{0}.{1}' .format (entity .name , signalName ))
828-
829+
829830
830831def create_ros_topics (robot ):
831832 from dynamic_graph .ros import RosPublish
@@ -842,7 +843,7 @@ def create_ros_topics(robot):
842843 robot .device .after .addDownsampledSignal ('rosPublish.trigger' ,1 );
843844 except :
844845 pass ;
845-
846+
846847 try :
847848 create_topic (ros , robot .filters .estimator_kin .dx , 'jointsVelocities' );
848849 create_topic (ros , robot .estimator_ft .contactWrenchLeftSole , 'contactWrenchLeftSole' );
@@ -888,18 +889,18 @@ def create_ros_topics(robot):
888889 create_topic (ros , robot .floatingBase .soutPos , 'floatingBase_pos' );
889890 except :
890891 pass ;
891-
892+
892893 return ros ;
893-
894-
894+
895+
895896def addTrace (tracer , entity , signalName ):
896897 """
897898 Add a signal to a tracer
898899 """
899900 signal = '{0}.{1}' .format (entity .name , signalName );
900901 filename = '{0}-{1}' .format (entity .name , signalName );
901902 tracer .add (signal , filename );
902-
903+
903904def addSignalsToTracer (tracer , device ):
904905 addTrace (tracer ,device ,'robotState' );
905906 addTrace (tracer ,device ,'gyrometer' );
@@ -921,7 +922,7 @@ def create_tracer(device, traj_gen=None, estimator_kin=None,
921922 device .after .addSignal ('{0}.triger' .format (tracer .name ));
922923
923924 addSignalsToTracer (tracer , device );
924-
925+
925926 with open ('/tmp/dg_info.dat' , 'a' ) as f :
926927 if (estimator_kin != None ):
927928 f .write ('Estimator encoder delay: {0}\n ' .format (robot .filters .estimator_kin .getDelay ()));
0 commit comments