如果使用的相机不同,请根据具体相机的SDK不同编写代码录制,这里我使用的ZED_2i相机。本身相机录制文件会保存成SVO格式,这里我使用opencv的imwrite函数保存图像。
主要部分如下所示:
while (key != 'q') {
im_count++;
if (zed_2i.grab(runtime_parameters) == ERROR_CODE::SUCCESS) {
// Retrieve the left image, depth image in half-resolution
zed_2i.retrieveImage(image_zed, VIEW::LEFT_GRAY, MEM::CPU, new_image_size);
zed_2i.retrieveImage(image_zed_right, VIEW::RIGHT_GRAY, MEM::CPU, new_image_size);
std::stringstream ss_l,ss_r;
ss_l << "C:\\your_image_path \\"<<"left_" << im_count << ".png";
ss_r << "C:\\ your_image_path \\ "<<"right_" << im_count << ".png";
if (im_count ) {
cv::imwrite(ss_l.str(), image_ocv);
cv::imwrite(ss_r.str(), image_ocv_right);
}
Zed_2i.retrieveImage()是从zed2i相机类中读取zed2i实时看到的图像并保存成zed相机所用的sl::Mat格式。
cv::Mat slMat2cvMat(Mat & input) {
return cv::Mat(input.getHeight(), input.getWidth(), getOCVtype(input.getDataType()), input.getPtr(MEM::CPU), input.getStepBytes(sl::MEM::CPU));
}
这里是官方教程中的代码,负责将slMat转换成cv::Mat类以方便处理。如果以上代码都没有问题的话,直接F5运行就可以进行录制。Windows下在保存的image_path中能找到很多相机录制的图像。
图1.1 录制的左目图像
2.1 制作rosbag文件
在ESIM官方教程中是使用视频转化成图像再开启esim_node将图像打包成事件,我这里直接是使用输入的图像了,通过下面这条命令产生记录图像和时间戳的文件
`$ python scripts/generate_stamps_file.py -i ~/your_imge_dir_path -r 300`
这里最后的300是每一帧的时间戳(1/300s),但是在使用上面一条命令时需要注意保存出的image.csv文件中对应图像的时间戳问题,如果没有预留足够的位数的话会出现如下时间戳不依序递增的问题。
图2.1 图像时间戳
如果出现这个问题请自行编写脚本将图像重命名并预留足够的位数,这里我使用的是8位,即left_0000000123.png。
图2.2 更正后的图像名
完成以上部分之后使用如下命令生成一个rosbag文件,其中包含image_raw、cam0/events、cam0/camera_info消息:
`$ rosrun esim_ros esim_node \
--data_source=2 \
--path_to_output_bag=/bagName \
--path_to_data_folder=/image_dir /image_folder \
--ros_publisher_frame_rate=60 \
--exposure_time_ms=10.0 \
--use_log_image=1 \
--log_eps=0.1 \
--contrast_threshold_pos=0.15 \
--contrast_threshold_neg=0.15 `
在terminal中输入如下命令以使用dvs_renderer
`$ rosrun dvs_renderer dvs_renderer events:=/cam0/events`
Rosbag play 使用rqt可以从dvs_renderer看到如下的信息,证明这个事件包制作成功,另一文件夹和之前的步骤都相同,依葫芦画瓢即可。
图2.3 事件
但我们的目的是制作双目事件数据,所以还要从每个bag中提取单独的events消息并融合到一个新的包中。
2.2 rosbag 编辑
下载ros官方提供的srv_tools (GitHub - srv/srv_tools: ROS-Stack with some tools),这个包好像有些脚本不编译也行但是我这里编译了。
使用如下命令将两个包的events消息提取出来
`$ cd path_to_/srv_tools/bag_tools/scripts`
`$ python extract_topics.py source_bag_name output_bag_name [topic names]`
使用scripts/change_topics.py将cam0/events改成left/right两个topic名称
`$ python change_topics.py inbag.bag outbag.bag /cam0/events=/davis/left/events
使用如下命令将两个事件包合并
`$ python merge.py output.bag.events output.bag.extracted --output output_bag_name`
根据ESVO的要求将events streaming改成1000 hz。
`$ roslaunch events_repacking_helper repacking.launch`
如此事件双目数据集(仅含事件消息)就制作完成了,这里我使用的camera_info是直接使用其他人的camera_info,如果想自己写的话可以使用srv_tools中的change_camera_info.py改一下。将数据集放到ESVO中跑一下,所输出的TS如下。具体投出的深度图惨不忍睹,这里就不展开了。
图2.4 TimeSurface图像