当前位置: 首页 > article >正文

ros入门:参数服务器通信

参数服务器通信类似于两个进程通过共享内存进行通信

前期准备

根工作空间下创建功能包

catkin_create_pkg ros_param_server roscpp rospy std_msgs

在功能包目录下创建代码文件

新增参数

新增参数的方式有两种

  • 使用节点句柄
  • 使用ros::param::set
#include"ros/ros.h"

int main(int argc,char* argv[]){
    ros::init(argc,argv,"param_server_node");
    ros::NodeHandle param_node_handle;
    /*新增参数*/
    //方案一:使用节点handle
    param_node_handle.setParam("type","pcl");
    param_node_handle.setParam("radius",0.15);
    //方案二:使用ros::param
    ros::param::set("type_param","niao");
    ros::param::set("radius_param",0.2);

    return 0;
}

修改CMakeLists.txt文件

 

根空间下编译代码

catkin_make

测试

首先将参数写入共享内存

rosrun ros_param_server param_server_node

查看我们创建的参数

 rosparam list

查看参数值

 

修改参数

修改参数的方式与设置参数的方式是一样的,因为会覆盖掉原来的参数

#include"ros/ros.h"

int main(int argc,char* argv[]){
    ros::init(argc,argv,"param_server_node");
    ros::NodeHandle param_node_handle;
    /*新增参数*/
    //方案一:使用节点handle
    param_node_handle.setParam("type","pcl");
    param_node_handle.setParam("radius",0.15);
    //方案二:使用ros::param
    ros::param::set("type_param","niao");
    ros::param::set("radius_param",0.2);

    //修改参数
    param_node_handle.setParam ("radius",0.3);
    ros::param::set("radius_param",0.4);
    return 0;
}

重新编译设置写入参数

获取参数

#include"ros/ros.h"

int main(int argc,char* argv[]){
  setlocale(LC_ALL,"");
  ros::init(argc,argv,"param_get_node");
  ros::NodeHandle param_get_node_handle;
  
  //第一种获取参数方式,如果获取失败就设置rdius参数为10
  double radius=param_get_node_handle.param("radius",10);
  ROS_INFO("get radius: %.2f",radius);
  
  //第二种参数获取方式,返回值为bool,表示是否获取成功
  double radius2;
  bool res=param_get_node_handle.getParam("radis",radius2);
  if(res){
    ROS_INFO("get param successfully >>> %.2f",radius2);
  }else{
    ROS_INFO("get param error!");
  }

  //第三种获取方式,如果之前已经获取过该参数,则直接从cache中获取,而不是重新获取
  double radius_cached;
  res=param_get_node_handle.getParamCached("radius",radius_cached);
  if(res){
    ROS_INFO("get cached param >>> %.2f",radius_cached);
  }else{
    ROS_INFO("get cached param error!");
  }

  //遍历参数
  std::vector<std::string> names;
  param_get_node_handle.getParamNames(names);
  for(auto& name:names){
    ROS_INFO("get param name: %s ",name.c_str());
  }

  //判断键是否存在
  bool flag1=param_get_node_handle.hasParam("radius");
  bool flag2=param_get_node_handle.hasParam("radiusxxx");
  if(flag1){
    ROS_INFO("radius exist");
  }else{
    ROS_INFO("radius not exist");
  }
  if(flag2){
    ROS_INFO("radiusxxx exist");
  }else{
    ROS_INFO("radiusxxx not exist");
  }
   return 0;
}

 修改编译配置文件

add_executable(param_set_node src/param_set.cc)
add_executable(param_get_node src/param_get.cc)

## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")

## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## Specify libraries to link a library or executable target against

target_link_libraries(param_set_node
  ${catkin_LIBRARIES}
)

target_link_libraries(param_get_node
  ${catkin_LIBRARIES}
)

设置参数

rosrun ros_param_server param_set_node

 

获取参数

rosrun ros_param_server param_get_node

删除参数

#include "ros/ros.h"

int main(int argc,char* argv[]){
  setlocale(LC_ALL,"");
  ros::init(argc,argv,"param_del_node");
  ros::NodeHandle nh;
 
  //使用节点handler
  bool flag=nh.deleteParam("type");
  if(flag)
    ROS_INFO("delete param type successfully!");
  else {
    ROS_INFO("delete param type error!");
  }

  //使用ros::param::del
  flag=ros::param::del("radius");
  if(flag)
    ROS_INFO("delete param radius successfully!");
  else {
    ROS_INFO("delete param radius error!");
  }

  return 0;
}

 


http://www.kler.cn/a/385711.html

相关文章:

  • windows C#-异步编程概述(二)
  • 某某科技笔试题
  • AndroidStudio-Activity的生命周期
  • 跨域 总 结 CORS
  • Android加载pdf
  • Qt / Qt Quick程序打包的一些坑 (四)
  • pytorch torch.tile用法
  • 读取excel并且显示进度条
  • 367.有效地完全平方数
  • 出海企业如何借助云计算平台实现多区域部署?
  • linux---vi和vim快捷键
  • 「QT」几何数据类 之 QMatrix4x4 4x4矩阵类
  • window 利用Putty免密登录远程服务器
  • 【目标检测】目标检测中全连接层(Fully Connected Layer)
  • 听说你想要快速搭建 Web 应用?轻量应用服务器绝对适合你
  • 【Python有哪些优点和缺点】
  • 【工具类】JAVA开发从SFTP服务器下载文件
  • Python函数和对象
  • 【Rust.Crate之tracing 诊断系统】
  • 星空天文 2.0.1| 完全免费的观星软件,无注册登录,天文爱好者必备。
  • 如何让3dsMax渲染效果更逼真好看?
  • HarmonyOS 移
  • Unity网络通信(part7.分包和黏包)
  • 3.2cpu
  • 初级数据结构——顺序表
  • Pr 视频过渡:沉浸式视频 - VR 球形模糊