是什么在影响我的工作效率
7分精力浪费在工具、环境、内容整理、倒腾数据,3分精力真正创造价值。目标是要造飞机,结果造了一堆轮子,或者学了一堆别人的轮子,每天的工作就是面向Google的编程不知道别人工作时是怎样的状态,但这确实是我这段时间的状态,充满了对未知的恐惧。先总结一下遇到的问题docker 使用不熟悉,没有理解明林,IDE远程环境没配好。旋转矩阵公式忘完了Numpy不熟悉,矩阵乘法写成了点乘提取点云和图片,Pyth
7分精力浪费在工具、环境、内容整理、倒腾数据,3分精力真正创造价值。
目标是要造飞机,结果造了一堆轮子,或者学了一堆别人的轮子,每天的工作就是面向Google的编程
不知道别人工作时是怎样的状态,但这确实是我这段时间的状态,充满了对未知的恐惧。
先总结一下遇到的问题
- docker 使用不熟悉,没有理解明林,IDE远程环境没配好。
- 旋转矩阵公式忘完了
- Numpy不熟悉,矩阵乘法写成了点乘
- 提取点云和图片,Python2 Python3环境不一致。
- 一次性读bag,多Topic时间戳同步,不知如何解决。采用最笨的方法,提取所有的图片存储下来,以后读取点云时同时读取图片。
事情是这样的,最近两周开始抽时间准备前融合的事情。
第一步是看看已经标注的Lidar数据和Camera数据对齐情况,评估一下现在的数据是否能用。
上周末两天,想在家把这件事搞定,给出个能不能用的结论。
先是配环境,数据在服务器上。
整体流程如下:
-
根据标注的label从bag里面解析Lidar点云,并在BEV下可视化看标注情况;
想到了不能从头造轮子,于是看了一个新来做激光同事的branch,找到了他的提取脚本。
在服务器上Conda克隆了他的环境,然后Pycharm远程调试,看他的脚本看懂了,通过他的整理也了解了了目前的本地数据集情况。
这一步挺顺利,还为自己没有重复造轮子的机智沾沾自喜。
-
找出lidar对应的Camera,看时间戳差多少,投影关系是否正常。
-
解压图片
bag里图片是经过压缩的,需要使用cv_bridge解析Camera,而cv_bridge只能使用python2.7,而提取ldiar点云的脚本是py3.6的,不能同时跑。
我一开始查了一下python3使用cv_bridge的使用方法,需要本地编译,简单尝试了下放弃了。
我选择在我们的docker里运行,因为数据在服务器上,需要在服务器上启动docker。
接下来主要问题变成了在服务器上启动docker和远程调试环境配置。
我们的一键式docker启动命令不能用,因为需要它sudo权限,而服务器上的我不是sudo用户。但是我又能看到别人的docker在服务器上运行,不知道他们是开了sudo权限还是自己运行docker的。
于是我尝试自己起docker。可我对于docker实在是太不熟悉了,虽然会用,但是没有理解每条命令的原理,被坑惨了。搞了一晚上,又把docker指令重新学习了一下,docker环境最终才配好。
docker环境配好了,但是不能用IDE调试,且要在各个目录cd过来cd过去,特别心烦,编辑代码只能用vim,用的又不熟练;看图片只能本地挂载看,本地挂载速度又很慢。
晚上睡不着,又在网上看Pycham远程调试和VSCode远程调试,半夜起来跟着配置到凌晨3点半,还没有配成功。
第二天睡醒已经11点了。吃完午饭接着配环境,到最后终于配好了。
最终的远程操作方案是,Pycharm在线打断点调试代码,VScode远程docke作为编辑器和文件浏览器。
-
将Lidar点云投影到Camera上,看看是否能够对齐
手动找了一组最近时间戳的PointCloud和Image。
加载Camera标定矩阵。找了一下别人对Camera标定文件的使用方法,照猫画虎写了一下。
计算从世界坐标系到像素坐标系的变换矩阵。
我一直对坐标变换投有深深的恐惧,围绕哪个轴旋转,roll pitch yaw顺序,左乘还是右乘,齐次还是非齐次,往图像上画点的时候u是x还是v是x。。。
这些以前都手动推过好几次,但每次都是搞懂了理解了当时用用,过一段时间就忘了。
所以我没有自己推公式,而是在已有代码里找对应矩阵的计算方法,找了半天才找到,就是相机的内参K * world2cam。。。
但画出来的投影结果不对,此时开始怀疑,是标定文件有问题,还是读标定文件时旋转矩阵读错了,还是投影代码有bug?
这时的我慌得一笔,因为这里哪个过程我都不确定出错了没。
想用我们的可视化调试工具看一下这个bag,结果一播包就挂…
然后又开始拿出《SLAM十四讲》开始看投影关系,看了看感觉也是对的。
带着失望睡觉。
周一早上早早起来,看看了Python书里讲Numpy的那一章。因为昨天在写投影的过程中发现自己对Numpy也一点都不熟悉。
只看了几分钟,忽然就知道了自己投影程序的bug。
numpy的矩阵乘是np.dot,而我用的是!!!改了一下,果然就对了。*
-
-
自动对齐Lidar Image时间戳
两种方案,最终选择方案一。
-
把图片全都存下来,存到一个地方,一次性读入内存。每解析一个Lidar,就去找最近的时间戳。过程复杂点,但是实现很简单。
-
最好是在读bag提取lidar的时候,能有一组group的概念,把image也解码出来,这是最优雅的。可是怎么确定一组message呢,时间同步怎么做呢?这都是问题。
就点云投影图片这一件小事,整整搞了两天才搞定。我原本以为两天的时间,我能够把数据集给生成好。
Docker run命令理解
docker run -it --name container_name ubuntu:18.04 /bin/bash (ubuntu:18.04也可以为Image ID)
-
后面一定要加/bin/bash,不然这个容器会直接退出。原因
Docker容器后台运行,必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如运行ping,sleep),就是会自动退出的。
而上面的代码中bash就是需要执行的指定的命令。命令如果执行完毕了,或者叫指定的应用终结时,容器会自动停止。
-
**image ID要在-it --name之前,不然会报错 ** “”/opt/plusai/drive_entrypoint.sh: line 10: exec: --: invalid option"
help对指令格式说的太明显了
$ docker run --help Usage: **docker run [OPTIONS] IMAGE [COMMAND] [ARG...]** Run a command in a new container
-
docker 容器启动后后台运行
为什么加了-d参数后容器启动后会直接退出?
docker run -d --name my-redis redis bash 指定命令是bash,但显然bash在容器起来后,很快就会结束,导致没有前台进程,故容器处于退出状态
-
docker 容器启动后后台运行
docker run -itd --name container_name Image_ID /bin/bash
i不是必需,加了容器起来后终端返回容器ID
-d运行容器时,需要有前台进程,-t提供一个伪终端,类似前台进程,查看容器运行状态,也可以看到,容器处于up状态
远程环境配置
最终的远程操作方案是,Pycharm在线打断点调试代码,VScode远程docke作为编辑器和文件浏览器。
PyCharm断点调试比较方便,但它是把本地代码拷贝到远程,同步比较麻烦。
vscode远程服务器,可以查看图片、文件和代码,避免cd过来cd过去,且不必查看/编辑文件都用vim。
用了这两个方法:
https://zhuanlan.zhihu.com/p/80099904
https://zhuanlan.zhihu.com/p/52827335
docker ssh连接不上的问题:
vim /etc/ssh/sshd_config
PermitRootLogin yes # 这句话默认被注释掉了,取消注释
service ssh restart
Numpy书籍:《利用Python进行数据分析》
更多推荐
所有评论(0)