是什么在影响我的工作效率

7分精力浪费在工具、环境、内容整理、倒腾数据,3分精力真正创造价值。

目标是要造飞机,结果造了一堆轮子,或者学了一堆别人的轮子,每天的工作就是面向Google的编程

不知道别人工作时是怎样的状态,但这确实是我这段时间的状态,充满了对未知的恐惧。

先总结一下遇到的问题

  1. docker 使用不熟悉,没有理解明林,IDE远程环境没配好。
  2. 旋转矩阵公式忘完了
  3. Numpy不熟悉,矩阵乘法写成了点乘
  4. 提取点云和图片,Python2 Python3环境不一致。
  5. 一次性读bag,多Topic时间戳同步,不知如何解决。采用最笨的方法,提取所有的图片存储下来,以后读取点云时同时读取图片。

事情是这样的,最近两周开始抽时间准备前融合的事情。

第一步是看看已经标注的Lidar数据和Camera数据对齐情况,评估一下现在的数据是否能用。

上周末两天,想在家把这件事搞定,给出个能不能用的结论。

先是配环境,数据在服务器上。

整体流程如下:

  1. 根据标注的label从bag里面解析Lidar点云,并在BEV下可视化看标注情况;

    想到了不能从头造轮子,于是看了一个新来做激光同事的branch,找到了他的提取脚本。

    在服务器上Conda克隆了他的环境,然后Pycharm远程调试,看他的脚本看懂了,通过他的整理也了解了了目前的本地数据集情况。

    这一步挺顺利,还为自己没有重复造轮子的机智沾沾自喜。

  2. 找出lidar对应的Camera,看时间戳差多少,投影关系是否正常。

    1. 解压图片

      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作为编辑器和文件浏览器。

    2. 将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,而我用的是!!!改了一下,果然就对了。*

  3. 自动对齐Lidar Image时间戳

​ 两种方案,最终选择方案一。

  1. 把图片全都存下来,存到一个地方,一次性读入内存。每解析一个Lidar,就去找最近的时间戳。过程复杂点,但是实现很简单。

  2. 最好是在读bag提取lidar的时候,能有一组group的概念,把image也解码出来,这是最优雅的。可是怎么确定一组message呢,时间同步怎么做呢?这都是问题。

就点云投影图片这一件小事,整整搞了两天才搞定。我原本以为两天的时间,我能够把数据集给生成好。

Docker run命令理解

docker run -it --name container_name ubuntu:18.04 /bin/bash (ubuntu:18.04也可以为Image ID)

  1. 后面一定要加/bin/bash,不然这个容器会直接退出原因

    Docker容器后台运行,必须有一个前台进程。容器运行的命令如果不是那些一直挂起的命令(比如运行ping,sleep),就是会自动退出的。
    而上面的代码中bash就是需要执行的指定的命令。

    命令如果执行完毕了,或者叫指定的应用终结时,容器会自动停止。

  2. **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
    
  3. docker 容器启动后后台运行

    为什么加了-d参数后容器启动后会直接退出?

    docker run -d --name my-redis redis bash 
    指定命令是bash,但显然bash在容器起来后,很快就会结束,导致没有前台进程,故容器处于退出状态
    
  4. 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进行数据分析》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值