參考 roscpp/Overview/Parameter Server
0. 概述
ROS參數服務器能夠保存 string, int, float, double, bool, list, dictionaries, base64 encoded類型的數據,如果需要保存其他類型可以使用 XmlRpc::XmlRpcValue class
roscpp 有兩種不同的參數API
1. bare 版本 ros::param 接口
2. handle 版本 ros::NodeHandle 接口
1. 在參數服務器獲取參數
ros::NodeHandle::getParam()
獲得的參數相對節點句柄(NodeHandle)名稱空間解析
ros::NodeHandle nh; std::string global_name, relative_name, default_param; if (nh.getParam("/global_name", global_name)) { ... } if (nh.getParam("relative_name", relative_name)) { ... } // 默認值 nh.param<std::string>("default_param", default_param, "default_value");
1.2 ros::param::get()
獲得的參數相對node名稱空間進行解析
std::string global_name, relative_name, default_param; if (ros::param::get("/global_name", global_name)) { ... } if (ros::param::get("relative_name", relative_name)) { ... } // 默認值 ros::param::param<std::string>("default_param", default_param, "default_value");
1.3 緩存參數
ros::NodeHandle::getParamCached()
ros::param::getCached()
這兩個函數可以完成本地參數的緩存,命令參數服務器一旦參數變化就立即通知這個節點。可以大大提高速度(首次調用之后),但是為了防止重載,應該謹慎使用。
2. 設置參數
ros::NodeHandle::setParam()
通過NodeHandle版本檢索的參數相對於NodeHandle的名稱空間來解析。
ros::NodeHandle nh; nh.setParam("/global_param", 5); nh.setParam("relative_param", "my_string"); nh.setParam("bool_param", false);
ros::param::set()
通過“bare”版本檢索的參數將相對於節點的名稱空間解析。
ros::param::set("/global_param", 5); ros::param::set("relative_param", "my_string"); ros::param::set("bool_param", false);
3. 檢查參數是否存在
ros::NodeHandle::hasParam()
ros::NodeHandle nh; if (nh.hasParam("my_param")) { ... }
ros::param::has()
if (ros::param::has("my_param")) { ... }
4. 刪除參數
ros::NodeHandle::deleteParam()
ros::NodeHandle nh; nh.deleteParam("my_param");
ros::param::del()
ros::param::del("my_param");
5. 訪問私有參數
handle 接口必須創建一個新的 ros::NodeHandle 以一個私有名稱空間作為其名稱空間。
ros::NodeHandle nh("~"); std::string param; nh.getParam("private_name", param);
ros::param 版本
std::string param; ros::param::get("~private_name", param);
6.
有時候你需要從最近的工作空間獲取參數。比如,如果你有一個名為 “robot_name” 的參數,你只想從自己的私有名稱空間開始向上搜索知道找到匹配參數。
類似的,如果你有一組攝像機節點,你可能希望在一個公共的名稱空間里共同設置一些參數但是在私有名稱空間里重寫其他參數。
注意: 為了使搜索更加高效, you should use it with relative names instead of /global and ~private names.
ros::NodeHandle::searchParam()
std::string key; if (nh.searchParam("bar", key)) { std::string val; nh.getParam(key, val); }
ros::param::search()
std::string key; if (ros::param::search("bar", key)) { std::string val; ros::param::get(key, val); }