Welcome to BC.Wang's blog
-
- python需要使用roslibpy而不是ros系统中的rospy,前者可以直接下载源码setup.py安装,无需ros系统支持,通过ip连接ros系统,使用类似字典的方法来收发信息(和roslibjs相似)
- python调用AirSim或者Carla等仿真引擎的API,将API调用设置为ROS订阅的回调函数,即可实现ROS和仿真系统的连接,之后可以用相应的接口传递视觉,激光等数据给ROS,形成一个全面的闭环仿真系统
-
Why Carla
- 自动驾驶的仿真平台有很多,UE(Unreal Engine)上有AirSim和Carla,前者主要还是四轴飞行器的仿真,后者是比较强大的自动驾驶仿真
- 为什么采用UE?UE最大的好处是渲染环境足够真实,可以提供视觉的仿真,车辆动力学的仿真可以采用其他很多专业软件,但是如果希望做到全套的仿真,视觉、感知、规划等全套,就需要一个足够环境真实的引擎了。Unity也可以在经过调教之后达到UE的低级别渲染效果,但是Carla并不支持Unity
在Windows下编译Carla
- 编译时多看错误提示。uproject rebuild失败时不会提示错误信息,需要vs打开sln然后build才能显示。编译时遇到依赖问题分析一下makefile
- 这一部分可以按照教程走,但是会有相当多难以解决的问题,可以按照这个流程::
- 首先注意版本一致
- 下载的Content文件夹需要放在clone下来的Unreal文件夹中指定地方,不要任意更改。
- 运行make launch过后,大概率会boost库安装失败,首先,去boost官网上下载对应版本的exe安装文件,运行安装,然后找到安装过后的boost目录。
- 因为我们尝试手动安装,所以先要去掉原来的安装boost的脚本,从makefile开始找,找到install_boost.bat,然后修改里面的东西使其不执行,或者修改前一个文件使其不安装boost
- 在没有安装boost下进行make,会提示没有办法引用相应的库,那么此时,多半是库配置了boost的路径,找CMakeFile,最终找到了在Build中下面的CMakeList.txt.in中有:set(BOOST_INCLUDE_PATH “XXX/carla-master/Build/boost-1.69.0-install/include”)
set(BOOST_LIB_PATH “XXX/carla-master/Build/boost-1.69.0-install/lib”),于是我们只需要把boost放到这个路径就OK了
- 将安装的boost_1.69.0(通常在C:/local下面)复制到指定位置并重命名为XXX-install,然后创建一个include文件夹,把除了lib64xxxx(注意不是libs文件夹)的其他文件夹全部复制到include里面(也许只需要复制boost文件夹就够了),然后把lib64xxxx文件名改为lib,这样就和前面的set(BOOST_INCLUDE_PATH以及set(BOOST_LIB_PATH的路径对应了。
- 之后应该能够成功编译,编译完了之后,找到编译过后的文件夹,发现是在Unreal/CarlaUE4下面,这个路径是不对的,将它里面的Plugins复制到Unreal/Plugins,让这两个Plugins合并即可,然后点击uproject用UE打开,会进行rebuild。(注意遇到任何build失败,都需要用visual studio打开sln项目来build,因为会提示错误信息)
-
实习信息
- 纽劢科技,这段经历从2019-03-25到2019-04-05
- 这里的实习总结时基于上面时间段的,是从自己的Storage/实习经历的相关文件中抽取出来的主要信息,具体实习内容需要查看里面的文件了解
经验
关于ROS
- 过一遍官方的ROS教程就可以对ROS有初步的了解,熟悉一下publish和subscribe设计模式,service和client设计模式。
- 创建一个topic用于发送固定类型的msg,使用publish,publish发布消息过后,所有的Subscriber都能够受到消息,并调用回调函数,将msg作为参数,因此msg的类型需要统一
- ROS中创建一个srv文件(和msg文件类似),之后都会在编译时生成相应的XXX.h,引用这个srv生成的文件,用于创建server,server只有request和response两个参数,都是指针,response只需要修改指针里面的变量即可,会自动返回这个指针。client调用这个service,在调用时就写上回调函数。
关于ROS c++开发
- 所实习公司对于每一个cpp文件都继承一个基类,有InitPublisher,InitSubsriber等方法,这些方法便于去寻找接口,如果使用ROSpy,ROSjs,ROS#等其他语言的接口时,可以去cpp代码中找这些通信规则(调用时注意使用rosbridge连接)
ROS服务启动
- 推荐gnome-terminal –tab一次开启多个窗口
- 打开ros项目查看所有的launch,使用roslaunch -package名称 -launch文件来启动
- 使用rostopic来发送一个topic,使用rosbag play来启动一个包,启动之后会持续发送topic
关于C++开发
- 下载源码,使用./script里面的脚本进行编译
- 编译之后在src目录下打开clion,然后使用import Project from Sources
- 于是就有了代码补全、跳转等功能,修改一些cpp文件,之后执行./script/tomake进行增量编译,然后launch进行测试
关于全栈开发
- 工具栈:WebStorm写代码-HBuilderX运行-Android Studio/iOS进行模拟测试,webstorm更新了代码之后,HBuilerX能够直接读取改动,从而直接在app运行时修改,直接测试,极其方便!
- 开发需要ROSjs和ROS系统通信,相应的规则需要在cpp文件中查看,找topic名称,找msg数据类型,然后就可以publish或者subscribe或者request了
关于git
- win下可以安装git bash,可以运行linux命令
- 使用ssh-keygen生成key,然后查看~/.ssh里面的key,复制到github或者gitlab setting里面,然后就可以git clone了!
- 创建一个branch
- git status查看状态,使用git GUI查看文件改动
- git add 添加文件,git add .添加所有
- git commit用来初次提交,git commit –amend来追加提交到上一次(不像github desktop一样不能追加而只能算新的commit)
- git push …push上去,加上-f强制push
- git pull …
- git fetch等
- 当需要放弃本地改动时,可以git add . 然后git stash
- 对于有submodule的仓库,需要git submodule init 然后git submodule update,之后可以 git submodule foreach XXX(在每个仓库下都执行命令,比如 git submodule foreach git pull XXX)
-
-
- 由于Python存在GIL(全局解释器锁),限制多线程同时执行,保证同一时间内只有一个线程在执行,因此使用多线程并不会得到加速(比如使用threading)
- 解决方法:使用多进程,比如multiprocessing或者parallelpython(pp),这样每个Python脚本运行在多个进程中,有多少核就能够开多少进程
- 如果遇到了多个请求需要并行处理的问题,核的数目不够使用,可以选择多线程或者协程(查阅Python中协程专用的模块),协程也是通过上下文切换实现看上去的多个任务同时处理
- 当有并行处理需求时,还需要仔细研究和调试Python上的多线程、多进程和协程的使用。记住这三个概念是必要的!
-
- umap-learn看上去像是一个很好用的模块https://umap-learn.readthedocs.io/en/latest/basic_usage.html#digits-data,可以将高维度的数据压缩为2维然后可视化,从对手写数字的处理上来看效果很好,并且它本身可以作为一种机器学习算法。
- umap进行label预测:可以使用umap训练一个投影器,将高维数据投影成2维。如果投影过后这些label能够分开,则训练了一个很好的分类器,对于新的数据进行预测,可以将新的高维数据使用这个训练的投影器降维成2维,然后使用KNN通过与其他分类点的欧式距离来求得label。但KNN毕竟还是计算量太大,倒不如使用一个以划分了格点的X和Y作为key,然后格子里面的点作为value进行索引,比如把浮点数划为0~9的10个点,用作字典的第一个key,然后另一个维度的Y也是10个点,这样所有数据点分成100分,给一个坐标比如1.1,4.2,首先取整数得到1,4然后找1,4所对应的样本点(也就是所有在0.5~1.5, 3.5~4.5的点),然后做KNN或者直接把这个区域的label拿出来,这样就把>O(n)的算法变成了几乎O(1)的算法,只需要每次更新每个区域的label状态,更新字典即可
0