因kitti2bag在ROS环境下编译失败,选择使用docker实现。
我的系统环境是ubuntu。
1、安装docker
2、下载kitti的raw data数据集和对应的标定文件
csdn上有网盘的下载连接
3、docker镜像
3.1 拉取官方的镜像
docker pull tomas789/kitti2bag
然后创建容器并制作bag。
docker run -v /home/myabc/2011_10_03_drive_0047_sync:/data -it tomas789/kitti2bag -t 2011_10_03 -r 0102 raw_synced
此时报错:
~$ docker run -v /home/myabc/2011_10_03_drive_0047_sync:/data -it tomas789/kitti2bag -t 2011_10_03 -r 0102 raw_synced
Traceback (most recent call last):
File "/usr/local/bin/kitti2bag", line 5, in <module>
from pkg_resources import load_entry_point
File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2927, in <module>
@_call_aside
File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2913, in _call_aside
f(*args, **kwargs)
File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 2940, in _initialize_master_working_set
working_set = WorkingSet._build_master()
File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 637, in _build_master
return cls._build_from_requirements(__requires__)
File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 650, in _build_from_requirements
dists = ws.resolve(reqs, Environment())
File "/usr/lib/python2.7/dist-packages/pkg_resources/__init__.py", line 834, in resolve
raise VersionConflict(dist, req).with_context(dependent_req)
pkg_resources.ContextualVersionConflict: (numpy 1.11.0 (/usr/lib/python2.7/dist-packages), Requirement.parse('numpy>=1.12.0'), set(['pandas']))
失败,查询解决方案未果,放弃该方案。
3.2 下载新镜像
docker pull tyoung96/kitti2bag:latest
创建容器并制作rosbag,
docker run -v /home/myabc/2011_10_03_drive_0047_sync:/data -it tyoung96/kitti2bag -t 2011_10_03 -r 0102 raw_synced
此时报错:
:~$ docker run -v /home/myabc/2011_10_03_drive_0047_sync:/data -it tyoung96/kitti2bag -t 2011_10_03 -r 0102 raw_synced
Traceback (most recent call last):
File "/usr/local/bin/kitti2bag", line 9, in <module>
load_entry_point('kitti2bag', 'console_scripts', 'kitti2bag')()
File "/kitti2bag/kitti2bag/__main__.py", line 5, in main
run_kitti2bag()
File "/kitti2bag/kitti2bag/kitti2bag.py", line 317, in run_kitti2bag
kitti = pykitti.raw(args.dir, args.date, args.drive)
File "/usr/local/lib/python2.7/dist-packages/pykitti/raw.py", line 34, in __init__
self._load_calib()
File "/usr/local/lib/python2.7/dist-packages/pykitti/raw.py", line 232, in _load_calib
data['T_velo_imu'] = self._load_calib_rigid('calib_imu_to_velo.txt')
File "/usr/local/lib/python2.7/dist-packages/pykitti/raw.py", line 147, in _load_calib_rigid
data = utils.read_calib_file(filepath)
File "/usr/local/lib/python2.7/dist-packages/pykitti/utils.py", line 72, in read_calib_file
with open(filepath, 'r') as f:
IOError: [Errno 2] No such file or directory: '/data/2011_10_03/calib_imu_to_velo.txt'
报错,最后一行提示,没有 '/data/2011_10_03/calib_imu_to_velo.txt',但是我下了,可能是文件放置目录不对,重新调整。
调整后再次尝试:
:~$ docker run -v /home/myabc/2011_10_03_drive_0047_sync:/data -it tyoung96/kitti2bag -t 2011_10_03 -r 0102 raw_synced
Traceback (most recent call last):
File "/usr/local/bin/kitti2bag", line 9, in <module>
load_entry_point('kitti2bag', 'console_scripts', 'kitti2bag')()
File "/kitti2bag/kitti2bag/__main__.py", line 5, in main
run_kitti2bag()
File "/kitti2bag/kitti2bag/kitti2bag.py", line 317, in run_kitti2bag
kitti = pykitti.raw(args.dir, args.date, args.drive)
File "/usr/local/lib/python2.7/dist-packages/pykitti/raw.py", line 35, in __init__
self._load_timestamps()
File "/usr/local/lib/python2.7/dist-packages/pykitti/raw.py", line 253, in _load_timestamps
with open(timestamp_file, 'r') as f:
IOError: [Errno 2] No such file or directory: '/data/2011_10_03/2011_10_03_drive_0102_sync/oxts/timestamps.txt'
还是报错,最后一行提示,没有'/data/2011_10_03/2011_10_03_drive_0102_sync/oxts/timestamps.txt',可能是文件放置目录不对,调整。
调整好后,再次尝试,成功,
制作完成。
文件的目录放置经验同网上其他教程。
我的目录:
其中, 一级目录“/home/myabc/2011_10_03_drive_0047_sync:/data”,冒号前“/home/myabc/2011_10_03_drive_0047_sync”是宿主机中的地址,文件名任意,存放数据集文件。
冒号后“/data”是容器中的地址,文件名由镜像决定,不用动。
二级目录“/2011_10_03”对应docker run命令中-t的参数。二级目录存放三个标定文件,和一个三级目录。
三级目录“/2011_10_03_drive_0102_sync”对应docker run命令中-t和-r的参数。三级目录存放下载好的数据集文件,包括“image_00”等。
由上图对应的docker run命令:
docker run -v /home/myabc/2011_10_03_drive_0047_sync:/data -it tyoung96/kitti2bag -t 2011_10_03 -r 0102 raw_synced
从中可以看出目录编排与docker run命令参数的对应关系。
4、rosbag play看一下效果
在有ROS的系统中,打开三个终端依次运行
roscore
rviz
rosbag play xxx.bag,或者rosbag play --pause xxx.bag
4.1 没有图像和画面
手动添加,在“Displays”界面的左下角“Add”,“By topic”
添加需要显示的image图像、激光点云的topic话题,选中然后点“OK”
4.2 有image图像,但是没有激光点云
没有显示激光点云,在“Displays”界面的上部分,“Fixed Frame”项目,rviz刚打开默认是“map”,手动更换为其他的,比如“world”"Velo_link"等,再次播放bag,就会出现激光点云的画面。
总结
1安装docker
2下载数据集
3拉取镜像
docker pull tyoung96/kitti2bag:latest
4创建容器同时制作rosbag
docker run -v /home/myabc/2011_10_03_drive_0047_sync:/data -it tyoung96/kitti2bag -t 2011_10_03 -r 0102 raw_synced
完成