C++
一、增与改(“覆盖”)
ros::NodeHandle
setParam(“键”,值)
ros::param
set(“键”,值)
修改:只需要继续调用 setParam 或 set 函数,保证键是已经存在的
#include "ros/ros.h"
/*
需要实现参数的新增与修改:
需求:首先设置机器人的共享参数,类型,半径
再修改半径(0.15->0.2m)
实现:
ros::NodeHandle
setParam("键",值)
ros::param
set("键",值)
修改:只需要继续调用 setParam 或 set 函数,保证键是已经存在的,
*/
int main(int argc, char *argv[])
{
//初始化ROS节点
ros::init(argc,argv,"set_param_c");
//创建ROS节点句柄
ros::NodeHandle nh;
//参数增---------------------------------------------
//方案1:nh
nh.setParam("type","xiaoHuang");
nh.setParam("radius",0.15);
//方案2:ros::param
ros::param::set("type_param","xiaoBai");
ros::param::set("radius_param",0.15);
//参数改---------------------------------------------
//参数覆盖,相当于修改
//方案1:nh
nh.setParam("radius",0.2);
//方案2:ros::param
ros::param::set("radius_param",0.25);
return 0;
}
修改前:
修改后:
二、查询:
注:2与3只需要用一个
2.1 ros::NodeHandle----代码
#include "ros/ros.h"
/*
演示参数的查询:
实现:
ros::NodeHandle----------------------------------------------
param(键,默认值)
存在,返回对应结果,否则返回默认值
getParam(键,存储结果的变量)
存在,返回 true,且将值赋值给参数2
若果键不存在,那么返回值为 false,且不为参数2赋值
getParamCached(键,存储结果的变量)--提高变量获取效率
存在,返回 true,且将值赋值给参数2
若果键不存在,那么返回值为 false,且不为参数2赋值
getParamNames(std::vector<std::string>)
获取所有的键,并存储在参数 vector 中
hasParam(键)
是否包含某个键,存在返回 true,否则返回 false
searchParam(参数1,参数2)
搜索键,参数1是被搜索的键,参数2存储搜索结果的变量
*/
int main(int argc, char *argv[])
{
//设置编码
setlocale(LC_ALL,"");
//初始化ROS节点
ros::init(argc,argv,"set_param_c");
//创建ROS节点句柄
ros::NodeHandle nh;
//ros::NodeHandle---------------------------------------------
//1. param
//正常获取为真实值,异常为0.5
double radius = nh.param("radius",0.5);
ROS_INFO("1 radius = %.2f",radius);
// 2. getParam (bool返回true或false,因返回浮点类型,故需声明double)
// double radius2 = 0.0;
// bool result = nh.getParam("radius",radius2);
// if (result)
// {
// ROS_INFO("获取的半径是: %.2f",radius2);
// } else{
// ROS_INFO("被查询的变量不存在。");
// }
//3. getParamCached(键,存储结果的变量)--提高变量获取效率
//getParamCached与getParam类似,只是性能上有提升,一般测试下看不出来
double radius2 = 0.0;
bool result = nh.getParamCached("radius",radius2);
if (result)
{
ROS_INFO("3 获取的半径是: %.2f",radius2);
} else{
ROS_INFO("3 被查询的变量不存在。");
}
//4. getParamNames(std::vector<std::string>) 获取所有的键,并存储在参数 vector 中
std::vector<std::string> names;
nh.getParamNames(names);
for (auto &&name : names)
{
ROS_INFO("4 遍历到的元素:%s",name.c_str());
}
//5. hasParam(键) 是否包含某个键,存在返回 true,否则返回 false
bool flag1 = nh.hasParam("radius");
bool flag2 = nh.hasParam("radiusxxx");
ROS_INFO("5 radius存在吗? %d",flag1);
ROS_INFO("5 radiusxxx存在吗? %d",flag2);
//6. searchParam(参数1,参数2) 搜索键,参数1是被搜索的键,参数2存储搜索结果的变量
std::string key;
nh.searchParam("radius",key);
ROS_INFO("6 搜索的结果: %s",key.c_str());
return 0;
}
2.1.2 输出:
2.2 ros::param---------------------------------------------------
2.2.1 上面的大框架下补充修改(2个例子,其余类似):
double radius_param = ros::param::param("radius",100.5); //否:输出100.5
ROS_INFO("2-1 radius_param = %.2f",radius_param);
std::vector<std::string> names_param;
ros::param::getParamNames(names_param);
for (auto &&name : names_param)
{
ROS_INFO("2-2 键: %s",name.c_str());
}
如:
2.2.2 输出:
2.3 删除
注:删除后再次执行会提示:删除失败
#include "ros/ros.h"
/*
演示参数的删除:
实现:
ros::NodeHandle
deleteParam("键")
根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
ros::param
del("键")
根据键删除参数,删除成功,返回 true,否则(参数不存在),返回 false
*/
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
ros::init(argc,argv,"set_param_c");
ros::NodeHandle nh;
//删除:ros::NodeHandle-----------------------------------------
bool flag1 = nh.deleteParam("radius");
if (flag1)
{
ROS_INFO("删除成功!");
} else {
ROS_INFO("删除失败!");
}
//删除:ros::param----------------------------------------------
bool flag2 = ros::param::del("radius_param");
if (flag2)
{
ROS_INFO("radius_param删除成功!");
} else {
ROS_INFO("radius_param删除失败!");
}
return 0;
}
输出:
*
Python:
一、增与改
#! usr/bin/env python
import rospy
"""
演示参数的新增与修改
需求:在参数服务器中设置机器人属性,型号,半径
实现:
rospy.set_param()
"""
if __name__ == "__main__":
#初始化ROS节点
rospy.init_node("param_set_p")
#新增参数
rospy.set_param("type_p","xiaoHuangChe")
rospy.set_param("radius_p",0.5)
#修改参数
rospy.set_param("radius_p",2)
pass
输出:
(修改后重新运行rosrun,再get,之前的值会被覆盖 [即修改] )
二、查
#! usr/bin/env python
import rospy
"""
演示参数的查询
get_param(键,默认值)
当键存在时,返回对应的值,如果不存在返回默认值
get_param_cached
和get_param 使用一致,只是效率更高
get_param_names
获取所有的参数的键的集合
has_param
判断是否包含某个键
search_param
查找某个参数的键,并返回完整的键名
"""
if __name__ == "__main__":
#初始化ROS节点
rospy.init_node("get_param_p")
#根据键获取参数的值:
#1.get_param
radius = rospy.get_param("radius_p",0.5) #不存在则返回0.5
rospy.loginfo("1.radius = %.2f",radius)
#2.get_param_cached 效率提高了
radius2 = rospy.get_param("radius_p",0.5) #不存在则返回0.5
rospy.loginfo("2.radius2 = %.2f",radius2)
#3.get_param_names 获取所有参数键的集合
names = rospy.get_param_names()
for name in names:
rospy.loginfo("3.name = %s",name)
#4.has_param
flag1 = rospy.has_param("radius_p")
if flag1:
rospy.loginfo("4.radius_p 存在")
else:
rospy.loginfo("4.radius_p 不存在")
flag2 = rospy.has_param("radius_p_xxx")
if flag2:
rospy.loginfo("4.radius_p_xxx 存在")
else:
rospy.loginfo("4.radius_p_xxx 不存在")
#5.search_param
key = rospy.search_param("radius_p")
rospy.loginfo("5.key = %s",key)
pass
输出:
三、删除
3.1 注:
只用指令时重复执行时抛异常,故改用try优化
#! usr/bin/env python
import rospy
"""
演示参数的删除
实现:
delete_param()
"""
if __name__ =="__main__":
rospy.init_node("get_param_p")
#删除参数
#rospy.delete_param("radius_p")
#优化(使二次删除不抛异常)
try:
rospy.delete_param("radius_p")
except Exception as e:
rospy.loginfo("被删除的参数不存在")