ROS学习——rosparam

本文详细介绍了ROS中的参数管理,包括rosparam命令的使用,如设置、获取、删除参数,以及从文件加载和导出参数。同时,深入探讨了如何利用yaml-cpp库读写YAML文件,实现参数的持久化存储。最后,讲解了launch文件中rosparam元素的应用,展示了如何在ROS节点启动时加载或删除参数。

一、简介

rosparam命令

命令说明说明
rosparam setset parameter设置参数
rosparam getget parameter获得参数值
rosparam loadload parameters from file从文件中加载参数到参数服务器
rosparam dumpdump parameters to file将参数服务器中的参数写入到文件
rosparam deletedelete parameter删除参数
rosparam listlist parameter names列出参数服务器中的参数

支持数据类型

  • 32-bit integers

  • booleans

  • strings

  • doubles

  • iso8601 dates

  • lists

  • base64-encoded binary data

 

二、参数的读和写

2.1 读

(1)ros::NodeHandle::getParam()

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))
{
    ...
}

// Default value versionnh.param<std::string>("default_param", default_param, "default_value");

(2)ros::param::get()

std::string global_name, relative_name, default_param;

if (ros::param::get("/global_name", global_name))
{  
    ...
}

if (ros::param::get("relative_name", relative_name))
{
    ...
}

// Default value versionros::param::param<std::string>("default_param", default_param, "default_value");

2.2 写

此处的写为把参数写入参数管理器中,并不会修改参数文件,若需保存修改后参数需要修改参数文件,参考第三点

(1)ros::NodeHandle::setParam()

ros::NodeHandle nh;
nh.setParam("/global_param", 5);
nh.setParam("relative_param", "my_string");
nh.setParam("bool_param", false);

(2)ros::param::set()

ros::param::set("/global_param", 5);
ros::param::set("relative_param", "my_string");
ros::param::set("bool_param", false);

 

三、yaml文件的读写

3.1、yaml-cpp的配置

(1)安装

下载地址:https://github.com/jbeder/yaml-cpp

下载稳定版后,在本地编译安装,ros本身自带yaml-cpp,但因其版本过低,部分函数无法使用,因此需要安装最新稳定版。

cd yaml-cpp
mkdir build
cd build
cmake -DBUILD_SHARED_LIBS=ON ..
make
sudo make install

(2)调用

在个CMakeLists.txt文件中添加以下内容,使其调用安装的新版本而不是自带旧版本

link_directories(/usr/local/lib)
include_directories(/usr/local/include/yaml-cpp)

同时在编译节点后加上yaml-cpp(http://wiki.ros.org/yaml_cpp)

target_link_libraries(${PROJECT_NAME} yaml-cpp)

3.2、yaml-cpp的使用

#include <yaml-cpp/yaml.h>
#include <fstream>

//读取文件
std::string param_file = "../src/msgs_file/param/param.yaml";
YAML::Node yamlConfig = YAML::LoadFile(motion_file);

//读取父项和子项
YAML::Node parent_param = yamlConfig["parent_param"];
YAML::Node chile_param = parent_param["chile_param"];

//修改
chile_param["param_1"] = 0;
chile_param["param_2"] = 1;

//写
std::ofstream file;
file.open(param_file);
file.flush();
file << yamlConfig;

 

四、Launch文件应用

4.1 元素

  • command="load|dump|delete" (optional, default=load)

rosparam 命令参数

  • file="$(find pkg-name)/path/file.yaml" (load or dump commands)

读取参数文件路径

  • param="param-name"

参数名字

  • ns="namespace" (optional)

命名空间

  • subst_value=true|false (optional)

是否允许替换参数

4.2 例子

  • 读取参数
<rosparam command="load" file="$(find rosparam)/example.yaml" />
<rosparam ns="namespace" command="load" file="$(find rosparam)/example.yaml" />
  • 删除参数 
<rosparam command="delete" param="my/param" />
  •  设置参数
<rosparam param="a_list">[1, 2, 3, 4]</rosparam>

 

参考

http://wiki.ros.org/roslaunch/XML/rosparam

http://wiki.ros.org/roscpp/Overview/Parameter%20Server

https://blog.youkuaiyun.com/u014610460/article/details/79508869

https://answers.ros.org/question/12321/how-to-write-and-parse-yaml-file-for-ros/

<think>好的,我现在需要帮助用户解决在ROS中正确配置和发布camera_info消息的问题。首先,我要回顾一下用户提供的引用内容,特别是引用[2]、[3]和[5],因为这些部分提到了camera_info的相关信息。 用户的问题是如何在ROS中正确配置和发布camera_info消息。根据引用[2]和[3],camera_info消息包含相机的内参,比如焦距、光心坐标、畸变参数等。这些参数通常通过相机标定获得,所以首先需要确保用户已经进行了相机标定,并获得了相应的参数。 接下来,用户需要创建一个camera_info的YAML配置文件。引用[3]中提到,camera_info消息的结构包括header、高度、宽度、畸变模型、内参矩阵、畸变系数等。所以,在YAML文件中需要正确填写这些参数。例如,内参矩阵D通常是畸变系数,而K是3x3的内参矩阵,包含焦距和光心坐标。 然后,用户需要在ROS节点中加载这个YAML文件。引用[4]提到配置通常分散在.launch文件、package.xml和.yaml文件中。因此,可能需要使用rosparam来加载参数,或者直接在节点中读取YAML文件。例如,使用camera_info_manager包可以帮助管理这些参数,并发布到指定的主题上。 用户可能还需要编写一个发布节点。根据引用[5],ROS包通常使用C++或Python,所以用户可以选择其中一种语言。例如,在Python中,可以初始化节点,创建Publisher,并定时发布camera_info消息。同时,确保消息的frame_id与图像消息一致,以便其他节点正确同步数据。 另外,用户需要注意时间戳和frame_id的一致性,这在引用[2]和[3]中都有强调。如果时间戳或frame_id不匹配,可能会导致下游处理错误。此外,相机标定的准确性直接影响后续应用的效果,如三维重建或物体识别,所以标定步骤必须正确执行。 最后,用户可能遇到的常见问题包括参数配置错误、消息发布频率不一致或依赖包未安装。例如,camera_info_manager可能没有被正确安装或引用,需要检查package.xml和CMakeLists.txt中的依赖。此外,标定工具的安装和使用也是一个关键点,如使用ROS的camera_calibration包进行标定。 总结步骤:标定相机获取参数,创建YAML配置文件,使用camera_info_manager加载参数,编写发布节点,确保时间戳和frame_id一致,处理可能的问题如依赖或配置错误。需要将这些步骤清晰地传达给用户,并提供示例代码和配置文件参考。</think>在 ROS 中配置和发布 `camera_info` 消息需要以下步骤: --- ### 1. **相机标定** - 使用 ROS 的标定工具(如 `camera_calibration` 包)获取相机内参和畸变系数。 ```bash rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.024 image:=/usb_cam/image_raw camera:=/usb_cam ``` 完成后会生成标定参数文件(如 `ost.yaml`)[^2][^3]。 --- ### 2. **创建 camera_info 配置文件** 将标定结果保存为 YAML 文件,例如 `camera_info.yaml`: ```yaml image_width: 640 image_height: 480 camera_name: usb_cam distortion_model: plumb_bob D: [0.12, -0.23, 0.001, 0.002, 0.0] # 畸变系数 (k1, k2, t1, t2, k3) K: [700.0, 0.0, 320.0, 0.0, 700.0, 240.0, 0.0, 0.0, 1.0] # 内参矩阵 (fx, 0, cx; 0, fy, cy; 0, 0, 1) R: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0] # 旋转矩阵(通常为单位矩阵) P: [700.0, 0.0, 320.0, 0.0, 0.0, 700.0, 240.0, 0.0, 0.0, 0.0, 1.0, 0.0] # 投影矩阵 ``` --- ### 3. **在节点中加载并发布 camera_info** #### 方法 1:使用 `camera_info_manager` ```python import rospy from sensor_msgs.msg import CameraInfo from camera_info_manager import CameraInfoManager rospy.init_node('camera_info_publisher') camera_info_url = 'file:///path/to/camera_info.yaml' # YAML 文件路径 camera_info_manager = CameraInfoManager(cname='usb_cam', url=camera_info_url) camera_info_manager.loadCameraInfo() pub = rospy.Publisher('/usb_cam/camera_info', CameraInfo, queue_size=10) while not rospy.is_shutdown(): camera_info = camera_info_manager.getCameraInfo() camera_info.header.stamp = rospy.Time.now() # 时间戳需与图像同步 camera_info.header.frame_id = 'camera_optical_frame' # 坐标系需与图像一致 pub.publish(camera_info) rospy.sleep(0.1) ``` #### 方法 2:手动加载参数 ```python camera_info = CameraInfo() camera_info.height = 480 camera_info.width = 640 camera_info.distortion_model = "plumb_bob" camera_info.D = [0.12, -0.23, 0.001, 0.002, 0.0] camera_info.K = [700.0, 0.0, 320.0, 0.0, 700.0, 240.0, 0.0, 0.0, 1.0] camera_info.P = [700.0, 0.0, 320.0, 0.0, 0.0, 700.0, 240.0, 0.0, 0.0, 0.0, 1.0, 0.0] ``` --- ### 4. **与图像数据同步** - 确保 `camera_info` 的 `header.stamp` 和 `header.frame_id` 与图像消息的 `header` 完全一致[^3]。 - 在启动摄像头节点时,同时启动 `camera_info` 发布节点: ```xml <launch> <node pkg="usb_cam" type="usb_cam_node" name="usb_cam"> <param name="camera_info_url" value="file://$(find your_package)/config/camera_info.yaml"/> </node> </launch> ``` --- ### 常见问题与解决 1. **参数不匹配**:检查 YAML 文件中的 `image_width` 和 `image_height` 是否与实际分辨率一致。 2. **时间戳不同步**:使用 `message_filters` 包对图像和 `camera_info` 进行时间同步[^4]。 3. **依赖缺失**:确保安装 `camera_info_manager` 包: ```bash sudo apt-get install ros-<distro>-camera-info-manager ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值