diff --git a/RosAria.cpp b/RosAria.cpp index d6a5d0011e22def73aaacc97cb3bbeb7a7d9318f..ab5fb9ee838b634af8bc079d513f7a08129333dd 100644 --- a/RosAria.cpp +++ b/RosAria.cpp @@ -113,8 +113,8 @@ class RosAriaNode bool debug_aria; std::string aria_log_filename; - // Robot Parameters - int TicksMM, DriftFactor, RevCount; // Odometry Calibration Settings + // Robot Calibration Parameters + int TicksMM, DriftFactor, RevCount; //If TicksMM or RevCount are <0, don't use. If DriftFactor is -99999, don't use (DriftFactor could be 0 or negative). // dynamic_reconfigure dynamic_reconfigure::Server<rosaria::RosAriaConfig> *dynamic_reconfigure_server; @@ -125,46 +125,50 @@ class RosAriaNode void RosAriaNode::readParameters() { - // Robot Parameters + // Robot Parameters. If a parameter was given and is nonzero, set it now. + // Otherwise, get default value for this robot (from getOrigRobotConfig()), + // reset it on the robot (in case a previous call to readParameters() changed + // it?), and set that parameter value. + // Parameter values are stored in member variables for possible later use by the user with dynamic reconfigure. robot->lock(); ros::NodeHandle n_("~"); - if (n_.hasParam("TicksMM")) + if (n_.getParam("TicksMM", TicksMM) && TicksMM > 0) { - n_.getParam( "TicksMM", TicksMM); - ROS_INFO("Setting TicksMM from ROS Parameter: %d", TicksMM); + ROS_INFO("Setting robot TicksMM from ROS Parameter: %d", TicksMM); robot->comInt(93, TicksMM); } else { TicksMM = robot->getOrigRobotConfig()->getTicksMM(); + ROS_INFO("Setting TicksMM parameter from this robot controller's stored configuration: %d", TicksMM); n_.setParam( "TicksMM", TicksMM); - ROS_INFO("Setting TicksMM from robot controller stored configuration: %d", TicksMM); + robot->comInt(93, TicksMM); // not neccesary? } - if (n_.hasParam("DriftFactor")) + if (n_.getParam("DriftFactor", DriftFactor) && DriftFactor != -99999) { - n_.getParam( "DriftFactor", DriftFactor); - ROS_INFO("Setting DriftFactor from ROS Parameter: %d", DriftFactor); + ROS_INFO("Setting robot DriftFactor from ROS Parameter: %d", DriftFactor); robot->comInt(89, DriftFactor); } else { DriftFactor = robot->getOrigRobotConfig()->getDriftFactor(); + ROS_INFO("Setting DriftFactor parameter from this robot controller's stored configuration: %d", DriftFactor); n_.setParam( "DriftFactor", DriftFactor); - ROS_INFO("Setting DriftFactor from robot controller stored configuration: %d", DriftFactor); + robot->comInt(89, DriftFactor); // not neccesary? } - if (n_.hasParam("RevCount")) + if (n_.getParam("RevCount", RevCount) && RevCount > 0) { - n_.getParam( "RevCount", RevCount); - ROS_INFO("Setting RevCount from ROS Parameter: %d", RevCount); + ROS_INFO("Setting robot RevCount from ROS Parameter: %d", RevCount); robot->comInt(88, RevCount); } else { RevCount = robot->getOrigRobotConfig()->getRevCount(); + ROS_INFO("Setting RevCount parameter from this robot controller's stored configuration: %d", RevCount); n_.setParam( "RevCount", RevCount); - ROS_INFO("Setting RevCount from robot controller stored configuration: %d", RevCount); + robot->comInt(88, RevCount); // not neccesary? } robot->unlock(); } @@ -175,21 +179,21 @@ void RosAriaNode::dynamic_reconfigureCB(rosaria::RosAriaConfig &config, uint32_t // Odometry Settings // robot->lock(); - if(TicksMM != config.TicksMM and config.TicksMM > 0) + if(TicksMM != config.TicksMM && config.TicksMM > 0) { ROS_INFO("Setting TicksMM from Dynamic Reconfigure: %d -> %d ", TicksMM, config.TicksMM); TicksMM = config.TicksMM; robot->comInt(93, TicksMM); } - if(DriftFactor != config.DriftFactor) + if(DriftFactor != config.DriftFactor && config.DriftFactor != -99999) { ROS_INFO("Setting DriftFactor from Dynamic Reconfigure: %d -> %d ", DriftFactor, config.DriftFactor); DriftFactor = config.DriftFactor; robot->comInt(89, DriftFactor); } - if(RevCount != config.RevCount and config.RevCount > 0) + if(RevCount != config.RevCount && config.RevCount > 0) { ROS_INFO("Setting RevCount from Dynamic Reconfigure: %d -> %d ", RevCount, config.RevCount); RevCount = config.RevCount; @@ -201,21 +205,21 @@ void RosAriaNode::dynamic_reconfigureCB(rosaria::RosAriaConfig &config, uint32_t // int value; value = config.trans_accel * 1000; - if(value != robot->getTransAccel() and value > 0) + if(value != robot->getTransAccel() && value > 0) { ROS_INFO("Setting TransAccel from Dynamic Reconfigure: %d", value); robot->setTransAccel(value); } value = config.trans_decel * 1000; - if(value != robot->getTransDecel() and value > 0) + if(value != robot->getTransDecel() && value > 0) { ROS_INFO("Setting TransDecel from Dynamic Reconfigure: %d", value); robot->setTransDecel(value); } value = config.lat_accel * 1000; - if(value != robot->getLatAccel() and value > 0) + if(value != robot->getLatAccel() && value > 0) { ROS_INFO("Setting LatAccel from Dynamic Reconfigure: %d", value); if (robot->getAbsoluteMaxLatAccel() > 0 ) @@ -223,7 +227,7 @@ void RosAriaNode::dynamic_reconfigureCB(rosaria::RosAriaConfig &config, uint32_t } value = config.lat_decel * 1000; - if(value != robot->getLatDecel() and value > 0) + if(value != robot->getLatDecel() && value > 0) { ROS_INFO("Setting LatDecel from Dynamic Reconfigure: %d", value); if (robot->getAbsoluteMaxLatDecel() > 0 ) @@ -231,14 +235,14 @@ void RosAriaNode::dynamic_reconfigureCB(rosaria::RosAriaConfig &config, uint32_t } value = config.rot_accel * 180/M_PI; - if(value != robot->getRotAccel() and value > 0) + if(value != robot->getRotAccel() && value > 0) { ROS_INFO("Setting RotAccel from Dynamic Reconfigure: %d", value); robot->setRotAccel(value); } value = config.rot_decel * 180/M_PI; - if(value != robot->getRotDecel() and value > 0) + if(value != robot->getRotDecel() && value > 0) { ROS_INFO("Setting RotDecel from Dynamic Reconfigure: %d", value); robot->setRotDecel(value); @@ -271,7 +275,7 @@ RosAriaNode::RosAriaNode(ros::NodeHandle nh) : myPublishCB(this, &RosAriaNode::publish), sonar_enabled(false), publish_sonar(false), publish_sonar_pointcloud2(false), debug_aria(false), - TicksMM(-1), DriftFactor(-1), RevCount(-1), + TicksMM(-1), DriftFactor(-99999), RevCount(-1), publish_aria_lasers(false) { // read in runtime parameters @@ -282,7 +286,7 @@ RosAriaNode::RosAriaNode(ros::NodeHandle nh) : n.param("baud", serial_baud, 0); if(serial_baud != 0) - ROS_INFO("RosAria: using serial port baud rate %d", serial_baud); + ROS_INFO("RosAria: using serial port baud rate %d", serial_baud); // handle debugging more elegantly n.param( "debug_aria", debug_aria, false ); // default not to debug @@ -409,26 +413,10 @@ int RosAriaNode::Setup() // Start dynamic_reconfigure server dynamic_reconfigure_server = new dynamic_reconfigure::Server<rosaria::RosAriaConfig>; - // Setup Parameter Minimums + // Setup Parameter Minimums and maximums rosaria::RosAriaConfig dynConf_min; - dynConf_min.trans_accel = robot->getAbsoluteMaxTransAccel() / 1000; - dynConf_min.trans_decel = robot->getAbsoluteMaxTransDecel() / 1000; - // TODO: Fix rqt dynamic_reconfigure gui to handle empty intervals - // Until then, set unit length interval. - dynConf_min.lat_accel = ((robot->getAbsoluteMaxLatAccel() > 0.0) ? robot->getAbsoluteMaxLatAccel() : 0.1) / 1000; - dynConf_min.lat_decel = ((robot->getAbsoluteMaxLatDecel() > 0.0) ? robot->getAbsoluteMaxLatDecel() : 0.1) / 1000; - dynConf_min.rot_accel = robot->getAbsoluteMaxRotAccel() * M_PI/180; - dynConf_min.rot_decel = robot->getAbsoluteMaxRotDecel() * M_PI/180; - - // I'm setting these upper bounds relitivly arbitrarily, feel free to increase them. - dynConf_min.TicksMM = 10; - dynConf_min.DriftFactor = -200; - dynConf_min.RevCount = -32760; - - dynamic_reconfigure_server->setConfigMin(dynConf_min); - - rosaria::RosAriaConfig dynConf_max; + dynConf_max.trans_accel = robot->getAbsoluteMaxTransAccel() / 1000; dynConf_max.trans_decel = robot->getAbsoluteMaxTransDecel() / 1000; // TODO: Fix rqt dynamic_reconfigure gui to handle empty intervals @@ -437,13 +425,23 @@ int RosAriaNode::Setup() dynConf_max.lat_decel = ((robot->getAbsoluteMaxLatDecel() > 0.0) ? robot->getAbsoluteMaxLatDecel() : 0.1) / 1000; dynConf_max.rot_accel = robot->getAbsoluteMaxRotAccel() * M_PI/180; dynConf_max.rot_decel = robot->getAbsoluteMaxRotDecel() * M_PI/180; + + dynConf_min.trans_accel = 0; + dynConf_min.trans_decel = 0; + dynConf_min.lat_accel = 0; + dynConf_min.lat_decel = 0; + dynConf_min.rot_accel = 0; + dynConf_min.rot_decel = 0; - // I'm setting these upper bounds relitivly arbitrarily, feel free to increase them. + dynConf_min.TicksMM = 0; dynConf_max.TicksMM = 200; - dynConf_max.DriftFactor = 200; - dynConf_max.RevCount = 32760; - + dynConf_min.DriftFactor = -99999; + dynConf_max.DriftFactor = 32767; + dynConf_min.RevCount = 0; + dynConf_max.RevCount = 65535; + dynamic_reconfigure_server->setConfigMax(dynConf_max); + dynamic_reconfigure_server->setConfigMin(dynConf_min); rosaria::RosAriaConfig dynConf_default; @@ -454,11 +452,11 @@ int RosAriaNode::Setup() dynConf_default.rot_accel = robot->getRotAccel() * M_PI/180; dynConf_default.rot_decel = robot->getRotDecel() * M_PI/180; - dynConf_default.TicksMM = TicksMM; - dynConf_default.DriftFactor = DriftFactor; - dynConf_default.RevCount = RevCount; + dynConf_default.TicksMM = 0; + dynConf_default.DriftFactor = -99999; + dynConf_default.RevCount = 0; - dynamic_reconfigure_server->setConfigDefault(dynConf_max); + dynamic_reconfigure_server->setConfigDefault(dynConf_default); dynamic_reconfigure_server->setCallback(boost::bind(&RosAriaNode::dynamic_reconfigureCB, this, _1, _2)); diff --git a/cfg/RosAria.cfg b/cfg/RosAria.cfg index 309e3322cfd634b81ffe51f6927506614877a6de..1a446dd1e23a721e33ff057607d72d5cdbae2a04 100755 --- a/cfg/RosAria.cfg +++ b/cfg/RosAria.cfg @@ -6,21 +6,21 @@ from dynamic_reconfigure.parameter_generator_catkin import * gen = ParameterGenerator() -gen.add("trans_accel", double_t, 0, "Translational acceleration (m/s^2)") -gen.add("trans_decel", double_t, 0, "Translational deceleration (m/s^2)" ) -gen.add("lat_accel" , double_t, 0, "Lateral acceleration (m/s^2)" ) -gen.add("lat_decel" , double_t, 0, "Lateral deceleration (m/s^2)" ) -gen.add("rot_accel" , double_t, 0, "Rotational acceleration (rad/s^2)" ) -gen.add("rot_decel" , double_t, 0, "Rotational deceleration (rad/s^2)" ) - - -# Default values are from the Pioneer Manual p.53 - -gen.add("TicksMM" , int_t, 0, "Encoder ticks/mm" ) +# Accelerationd and deceleration parameters +gen.add("trans_accel", double_t, 0, "Translational acceleration (m/s^2)", 0, 0) +gen.add("trans_decel", double_t, 0, "Translational deceleration (m/s^2)", 0, 0) +gen.add("lat_accel" , double_t, 0, "Lateral acceleration (m/s^2)" , 0, 0) +gen.add("lat_decel" , double_t, 0, "Lateral deceleration (m/s^2)" , 0, 0) +gen.add("rot_accel" , double_t, 0, "Rotational acceleration (rad/s^2)" , 0, 0) +gen.add("rot_decel" , double_t, 0, "Rotational deceleration (rad/s^2)" , 0, 0) + +# Robot calibration. +# Default values of 0 mean to not set, but to let robot controller use its internally stored calibration value. +gen.add("TicksMM" , int_t, 0, "Encoder ticks/mm" , 0) gen.add("DriftFactor", int_t, 0, "Value in 1/8192 increments to be added or " + "subtracted from the left encoder ticks in " + - "order to compensate for tire differences." ) + "order to compensate for tire differences." , -99999) gen.add("RevCount" , int_t, 0, "The number of differential encoder ticks " + - "for a 180-degree revolution of the robot." ) + "for a 180-degree revolution of the robot." , 0) exit(gen.generate(PACKAGE, "RosAria", "RosAria"))