这篇是最近的实验记录:在Ubuntu系统下读取点云数据并在rviz中显示,录制自己的rosbag数据包并离线播放,将rosbag文件转化为pcd格式导入MATLAB中,和双目相机进行外参标定。
Robosense 16线激光雷达
按照官网用户手册进行电气连接即可
笔记本电脑安装Linux系统,我的是Ubuntu 18.04,ROS Melodic。
参考:CSDN、ROS官网、Robosense-Github
按照官方提示,首先下载rslidar_sdk项目,这里我用的2.1的方法,网络不好的朋友用2.2的方法手动下载一下应该也可以。之后按照3.3和3.4的指令,安装两个必需的库yaml和libpcap
此外,还需要修改电脑的IP地址来和激光雷达适配。将电脑和雷达连接后,对电脑IP地址进行修改,进入设置-网络-有线连接-设置-IPV4-地址,在 地址栏填入192.168.1.102,子网掩码255.255.255.0,网关(gateway)192.168.1.1,(激光雷达默认的IP地址是192.168.1.200)DNS我没有设置,自动配置,没有出现什么问题(有其他博主配置了才能运行,这里大家按自己情况参考),其他是要检查portal是否为6699和7788.
环境配置完毕后编译运行rslidar_sdk,依旧按官方提示
我试过4.1或4.2的方法都可以。
我的备忘:重新读取激光雷达数据时先从终端进入我的工作空间cd robosense_ws
,编译运行catkin_make
,配置环境source devel/setup.bash
,输入roslaunch rslidar_pointcloud rs_lidar_16.launch
即可弹出Rviz窗口,能看到激光雷达实时采集到的点云数据。(如果看不到的话,在Rviz中左侧栏下方的Add按钮中添加pointcloud话题即可) 使用roslaunch指令可以自动启动节点管理器,不需要roscore。
进入工作空间,输入指令rosbag record -O [bagname] [topic1] [topic2] [...]
开始录制点云数据的rosbag,不加中括号,bagname是可选项。按ctrl+c终止record指令即可结束录制。
我的备忘rosbag record -O lidar1.bag rslidar_points
这里bagname.bag是可以自己指定的录制出的ros包名称,如果不指定则默认按照录制结束时间命名,topic1是激光雷达读取的点云数据流的话题名称,也可以列出多个话题名称。在rviz中可以查看pointcloud对应的topic名称。
这里要记住之前实时显示点云时的话题名称,在rviz中修改好配置才能播放rosbag包。
打开终端进入存放自己录制好的rosbag的工作空间,输入指令rosbag play -l lidar1.bag
这里 -l 是loop,循环播放的含义,因为我录制的rosbag时长较短所以循环播放,还有很多播放指令可以参考其他博客
我的备忘:弹出rviz窗口后在左侧栏中Global Option 选项中修改Fixed Frame为 rslidar
,Add添加PointCloud2话题,并将话题Topic修改为/rslidar_points
为了在MATLAB中使用点云数据,需要将点云数据转化为MATLAB支持的pcd或ply格式。之前在Windows系统下使用速腾自带的RSView软件采集并可视化点云数据,但录制的数据包只能存储为pcap或csv格式,都是MATLAB不支持的格式,所以才有了这篇博客,在Ubuntu下尝试完成激光雷达和双目相机的外参标定的工作。
新建终端roscore
进入工作空间cd robosense_ws
将ros包转化成pcd文件rosrun pcl_ros bag_to_pcd
输入你的rosbag名也可加上路径,话题名称,转化后的pcd文件的存储位置,这样就把ros包转化成pcd格式文件了,注意pcd文件是按帧存储的,因此一个bag文件获取的pcd文件是很多个,每个pcd是一帧数据,可以通过pcl_viewer命令pcl_viewer
来查看,还可以用指令-bc -fc 加上r,g,b数值来改变背景或点云的颜色。
我的备忘rosrun pcl_ros bag_to_pcd pointcloud1/lidar1.bag rslidar_points ~/pcd_file1 pcl_viewer 1_1.pcd -fc (255,255,0)
想将之前在Windows系统下采集的pcap格式点云数据拷贝到ubuntu系统下读取。这里要进入工作空间下的src文件夹—ros_rslidar—rslidar_pointcloud—launch—rs_lidar_16.launch,修改,这里可以添加多行同时读取多个pcap数据包。
之后在终端进入工作空间cd robosense_ws
输入roslaunch rslidar_pointcloud rs_lidar_16.launch
即可显示pcap文件。
在官方Github这里可以看到使用ZED相机的prerequisition,我的系统是Ubuntu18.04,安装了CUDA11.7,ROS Melodic。在这里下载安装了SDK8.2,注意看好自己的系统和CUDA的版本,下载对应的ZED SDK。下载安装好之后会在/usr/local/zed/tools下看到一系列工具用来可视化相机采集到的图像。
我的备忘:ZED可视化工具位置:/usr/local/zed/tools/zed_explorer
ZED读取的图像保存位置:/home/amber/Documents/ZED
在Ubuntu系统下安装MATLAB,这里和window下略有不同,首先从官网上下载了.iso文件,之后在终端运行相应命令来进行安装,有很多博客讲的很仔细就不再展开。安装好后进入安装文件夹,我是安在/home下新建的的/matlab2022a文件夹中,进入文件夹打开终端运行bin/matlab
即可启动MATLAB。这里可以参考网上教程创建MATLAB桌面图标,这样就不需要每次都进入终端输入指令来运行了。
刚装好的MATLAB工具栏部分字体太小,可以在编辑器中输入如下指令来调整:
s = settings;
s.matlab.desktop.DisplayScaleFactor;
s.matlab.desktop.DisplayScaleFactor.PersonalValue = 1.4;
1.4是放大的倍数,根据自己需要更改。(这里发现一个问题,调整工具栏字体大小之后有些App使用的时候显示不完全就很心累,遇到这种情况可以先把PersonalValue改成1运行一下再重新运行一遍,然后重启MATLAB)
在Apps中找到Stereo Camera Calibrator,就可以开始双目相机标定啦。只要将双目相机读取的左右图像分别Import即可。在这里附上双目相机采集图像并分割左右图像保存到两个文件夹下的MATLAB程序:
(电脑连接上双目相机,运行程序后,按下空格键即可采集当前时刻的图像帧,并自动分割为左右图像保存在你指定的文件夹下,名称自定。)
clc;
% Open the ZED
zed = webcam('/dev/video2')
preview(zed)
%-----------------------------------------
% Set video resolution=720P
zed.Resolution = zed.AvailableResolutions{1};
% Get image size
[height,width,channels] = size(snapshot(zed))
ok = 1;
i = 1;
% Start loop
while ok
% get key value
w = waitforbuttonpress;
if w
% Capture the current image
img = snapshot(zed);
% Split the side by side image into two images
image_left = img(:, 1 : width/2, :);
image_right = img(:, width/2 +1: width, :);
% save images
imwrite(image_left, ['/home/amber/matlab2022a/gyz/left1/',num2str(i),'L.jpg']);
imwrite(image_right, ['/home/amber/matlab2022a/gyz/right1/',num2str(i),'R.jpg']);
% Display the left and right images
subplot(1,2,1);
imshow(image_left);
title('Image Left');
subplot(1,2,2);
imshow(image_right);
title('Image Right');
drawnow;
i = i+1;
end
end
% close the camera instance
% clear zed
%----------------------------------------
在工具栏中勾选
进行calibrate,保存Export Camera Parameters中的Export Parameters to Workspace, 还可以保存生成的session
之后在实时编辑器中输入如下代码可以将刚才生成的重投影误差等数据可视化
showReprojectionErrors(stereoParams,'BarGraph'); %显示重投影误差
showExtrinsics(stereoParams,"PatternCentric") %显示外参数据
showExtrinsics(stereoParams,"CameraCentric")
采集原始图像时可以多保存一些,因为有些图像重投影误差较大,需要手动剔除。我采集了20组,最后保留了15组图像,最后的Error是0.12。看其他博客说误差在0.3以下就差不多了,大家可以根据自己实际情况作调整。
MATLAB自带的LiDAR Toolbox
可以用来处理点云数据,包括进行滤波降噪、剔除离群点等功能,非常方便。用LiDAR Camera Calibrator
工具箱来进行激光雷达和双目相机的外参标定,目的是获取两个坐标系之间的转换关系。
首先试着运行了外参标定的官方demo,注意到需要传入的文件格式是:pcd
或ply
格式的点云数据 和png
或jpg
格式的图像数据。
因此计划在ROS下读取rosbag数据再转化成pcd格式,同时采集双目相机图像,传入工具箱中。这里要注意时空同步的问题,由于我只是采集标定板在不同位置的静态场景数据,因此只需要改变标定板位置,保持相机和雷达相对位置固定,分别记录在特定位置下的图像和点云数据即可。
本篇主要是记录自己最近标定实验的流程,年纪大了,没有好记性只有烂笔头啦。如有错误还请大家指正,有疑问的朋友们也可以一起交流讨论,相互学习共同进步~