前言
这两天在跑标定代码时遇到了点问题,所以在调试的过程中了解到了一些ROS的小知识点,相当于学习了,下面来总结一下。
一、在launch文件中使用GDB调试
在launch文件中的节点内添加launch-prefix="gdb -ex run --args"
即可启动GDB调试,其表示在运行launch的对话框内,显示bug信息。launch文件修改如下所示
<launch>
<rosparam command="load" file="$(find livox_camera_calib)/config/calib.yaml" />
<node
pkg="livox_camera_calib"
type="lidar_camera_calib"
name="lidar_camera_calib"
output="screen"
launch-prefix="gdb -ex run --args" <!--此处添加代码-->
/>
<node
pkg="rviz"
type="rviz"
name="rviz"
args="-d $(find livox_camera_calib)/rviz_cfg/calib.rviz"
/>
</launch>
bug信息显示如下
二、ROS中利用yaml将参数传入
1.通过rosparam将参数导入
代码如下
<rosparam command="load" file="$(find 功能包名字)/参数文件.yaml" />
yaml文件内容如下所示
# Data path. adjust them!
common:
image_file: "/home/ycj/data/calib/image/3.png"
pcd_file: "/home/ycj/data/calib/pcd/3.pcd"
result_file: "/home/ycj/data/calib/extrinsic.txt"
# Camera Parameters. Adjust them!
camera:
camera_matrix: [1364.45, 0.0, 958.327,
0.0, 1366.46, 535.074,
0.0, 0.0, 1.0 ]
dist_coeffs: [0.0958277, -0.198233, -0.000147133, -0.000430056, 0.000000]
# Calibration Parameters.!
calib:
calib_config_file: "/home/ycj/catkin_ws/src/livox_camera_calib/config/config_indoor.yaml"
use_rough_calib: false # set true if your initial_extrinsic is bad
文件分为三大块,分别是common、camera、calib这三个大块,块下面保存的是相应的参数及其参数名。
2.获取数据
利用NodeHandle来进行launch文件中的数据获取,代码如下所示
nh.param<string>("common/image_file", image_file, "");
nh.param<string>("common/pcd_file", pcd_file, "");
nh.param<string>("common/result_file", result_file, "");
std::cout << "pcd_file path:" << pcd_file << std::endl;
nh.param<vector<double>>("camera/camera_matrix", camera_matrix,
vector<double>());
nh.param<vector<double>>("camera/dist_coeffs", dist_coeffs, vector<double>());
nh.param<bool>("calib/use_rough_calib", use_rough_calib, false);
nh.param<string>("calib/calib_config_file", calib_config_file, "");
其中,nh.param
函数各部分的意思是
nh.param<传入的参数类型>(launch文件中的参数名称, 程序中接受该参数的变量名称,该参数默认值)
即launch文件里面存在函数参数的名称及参数值,则赋值程序中接受参数值的变量(后面这个),后面的参数默认值就会忽略。
假如launch文件里面没有这个参数名称的定义,则将参数默认值赋给程序中接收参数的变量。
这样,就可以将yaml文件中的参数传入程序中,其过程相当于将yam文件中的内容读入launch中,再进行参数获取。