33//
44
55#include " DifferentialCPGClean.h"
6+ #include " ../util/SdfUtil.hpp"
67
78using namespace revolve ::gazebo;
89
910DifferentialCPGClean::DifferentialCPGClean (const sdf::ElementPtr brain_sdf,
1011 const std::vector<MotorPtr> &_motors)
11- : Brain()
12- , revolve::DifferentialCPG(load_params_from_sdf(brain_sdf), _motors)
13- { }
12+ : Brain(), revolve::DifferentialCPG(load_params_from_sdf(brain_sdf), _motors )
13+ {
14+ }
1415
1516DifferentialCPGClean::DifferentialCPGClean (const sdf::ElementPtr brain_sdf,
16- const std::vector<MotorPtr> &_motors,
17- const NEAT::Genome &genome)
18- : Brain()
19- , revolve::DifferentialCPG(load_params_from_sdf(brain_sdf), _motors, genome)
20- {}
21-
17+ const std::vector<MotorPtr> &_motors,
18+ const NEAT::Genome &genome)
19+ : Brain(), revolve::DifferentialCPG(load_params_from_sdf(brain_sdf), _motors, genome)
20+ {
21+ }
2222
2323void DifferentialCPGClean::Update (const std::vector<MotorPtr> &_motors,
2424 const std::vector<SensorPtr> &_sensors,
@@ -28,36 +28,45 @@ void DifferentialCPGClean::Update(const std::vector<MotorPtr> &_motors,
2828 this ->::revolve::DifferentialCPG::update (_motors, _sensors, _time, _step);
2929}
3030
31- revolve::DifferentialCPG::ControllerParams DifferentialCPGClean::load_params_from_sdf (sdf::ElementPtr brain_sdf) {
32- // Get all params from the sdf
33- // TODO: Add exception handling
34- sdf::ElementPtr controller_sdf = brain_sdf->GetElement (" rv:controller" );
35- revolve::DifferentialCPG::ControllerParams params;
36- params.reset_neuron_random = (controller_sdf->GetAttribute (" reset_neuron_random" )->GetAsString () == " true" );
37- params.use_frame_of_reference = (controller_sdf->GetAttribute (" use_frame_of_reference" )->GetAsString () == " true" );
38- params.init_neuron_state = stod (controller_sdf->GetAttribute (" init_neuron_state" )->GetAsString ());
39- params.range_ub = stod (controller_sdf->GetAttribute (" range_ub" )->GetAsString ());
40- params.signal_factor_all = stod (controller_sdf->GetAttribute (" signal_factor_all" )->GetAsString ());
41- params.signal_factor_mid = stod (controller_sdf->GetAttribute (" signal_factor_mid" )->GetAsString ());
42- params.signal_factor_left_right = stod (controller_sdf->GetAttribute (" signal_factor_left_right" )->GetAsString ());
43- params.abs_output_bound = stod (controller_sdf->GetAttribute (" abs_output_bound" )->GetAsString ());
44-
45- // Get the weights from the sdf:
46- // If loading with CPPN, the weights attribute does not exist
47- if (controller_sdf->HasAttribute (" weights" )) {
48- std::string sdf_weights = controller_sdf->GetAttribute (" weights" )->GetAsString ();
49- std::string delimiter = " ;" ;
50-
51- size_t pos = 0 ;
52- std::string token;
53- while ((pos = sdf_weights.find (delimiter)) != std::string::npos) {
54- token = sdf_weights.substr (0 , pos);
55- params.weights .push_back (stod (token));
56- sdf_weights.erase (0 , pos + delimiter.length ());
57- }
58- // push the last element that does not end with the delimiter
59- params.weights .push_back (stod (sdf_weights));
60- }
61-
62- return params;
31+ revolve::DifferentialCPG::ControllerParams DifferentialCPGClean::load_params_from_sdf (sdf::ElementPtr brain_sdf)
32+ {
33+ try
34+ {
35+ // Get all params from the sdf
36+ sdf::ElementPtr controller_sdf = brain_sdf->GetElement (" rv:controller" );
37+ revolve::DifferentialCPG::ControllerParams params;
38+ params.reset_neuron_random = getSdfAttrSafe<bool >(controller_sdf, " reset_neuron_random" );
39+ params.use_frame_of_reference = getSdfAttrSafe<bool >(controller_sdf, " use_frame_of_reference" );
40+ params.init_neuron_state = getSdfAttrSafe<double >(controller_sdf, " init_neuron_state" );
41+ params.range_ub = getSdfAttrSafe<double >(controller_sdf, " range_ub" );
42+ params.signal_factor_all = getSdfAttrSafe<double >(controller_sdf, " signal_factor_all" );
43+ params.signal_factor_mid = getSdfAttrSafe<double >(controller_sdf, " signal_factor_mid" );
44+ params.signal_factor_left_right = getSdfAttrSafe<double >(controller_sdf, " signal_factor_left_right" );
45+ params.abs_output_bound = getSdfAttrSafe<double >(controller_sdf, " abs_output_bound" );
46+
47+ // Get the weights from the sdf:
48+ // If loading with CPPN, the weights attribute does not exist
49+ if (controller_sdf->HasAttribute (" weights" ))
50+ {
51+ std::string sdf_weights = getSdfAttrSafe<std::string>(controller_sdf, " weights" );
52+ std::string delimiter = " ;" ;
53+
54+ size_t pos = 0 ;
55+ std::string token;
56+ while ((pos = sdf_weights.find (delimiter)) != std::string::npos)
57+ {
58+ token = sdf_weights.substr (0 , pos);
59+ params.weights .push_back (stod (token));
60+ sdf_weights.erase (0 , pos + delimiter.length ());
61+ }
62+ // push the last element that does not end with the delimiter
63+ params.weights .push_back (stod (sdf_weights));
64+ }
65+
66+ return params;
67+ }
68+ catch (std::runtime_error const &err)
69+ {
70+ throw std::runtime_error (std::string (" Could not load sdf. " ) + std::string (err.what ()));
71+ }
6372}
0 commit comments