自主飞行之进阶¶
1.vfh避障demo¶
a.更新px4_command功能包¶
px4_command最新功能包在github上面。请点击链接 px4_command ,我们更新的不是master,而是分支 p200_200707 ,如下图:
现在进入到TX2里面,确保能够正常上网,本身有个px4_command功能包,现在我们删除掉原有的px4_command,重新 git clone 最新的功能包。使用 git clone https://github.com/amov-lab/px4_command.git , 进入到px4_command,切换 p200_200707 分支下面, 使用命令 git checkout p200_200707 .然后退回到 ~/amov_ws 目录之下,使用 catkin_make 编译px4_comman功能包。如下图所示,我们使用的就是p200_200707该分支
b.更新rplidar_ros功能包¶
我们通常使用的是思岚科技的A2,A3或者S1雷达,不管您是使用A2,A3还是S1雷达做避障,都建议更新一下激光雷达功能包。rplidar_ros的源码地址为 https://github.com/amov-lab/rplidar_ros.git
删除之前rplidar_ws里面的编译生成文件夹build和devel。删除掉src下面的所有文件及文件夹,在 ~/rplidar_ws/src 路径之下下载源码,使用 git clone https://github.com/amov-lab/rplidar_ros.git , 然后进入到上级目录 ~/rplidar_ws 下面,执行 catkin_make 进行编译,编译完成之后,如果之前没有删除 ~/.bashrc 下面的环境变量,你无需添加新的环境变量。 打开新的终端,使用 roslaunch rplidar_ros rplidar.launch 启动激光雷达,如下图:
默认的 rplidar.launch 的波特率是 256000 ,我这里使用的是A2的雷达,A2雷达有的是115200,有的是256000.每一款机关雷达底座下面有具体的型号。这里我所使用的是A2M8R4系列,对应波特率为256000.
c.实际避障前说明¶
第一点、激光雷达的的正方向是有连接线的一边,我们称之为激光雷达的尾巴,正确的在飞机机架上的安装方式为,激光雷达的尾巴朝向飞机的机尾。这个很重要,不要搞错了!!! 如果您拿到的飞机,激光雷达的尾巴是朝前的如果要使用室外激光雷达避障功能,请将激光雷达尾巴改为朝向飞机的机尾。一定注意!一定注意!!一定注意!!!
第二点、避障前可熟悉仿真环境中的避障,这个必须要配置一下仿真环境。也可以学习 无人机仿真课程开发 ,里面有降到vfh的无人机避障教程。这个是为了让你熟悉避障的整个流程和逻辑。
第三点、在避障过程中我们控制的是飞机的水平xy速度,高度z保持一定值不变。在室外使用地面站 QGroundControl 规划一条航线。正常情况下飞机按照这个规划航线飞行,现在如果中途有障碍物,飞机会自行绕开这个障碍物。我们可以实时打印出ros topic,rostopic echo /mavros/setpoint_raw/local 这个可以方便我们查看offboard模式下,tx2通过激光雷达给飞控发送了水平方向的速度是怎么变化的。
第四点、飞机整体性能都没问题,怎么判断呢?就是正常的自稳下飞行可控,position下面飞行的还挺稳定,GPS飘的不是太大。
第五点、在室内有接显示器的情况下将tx2所连接的WiFi为飞机上自带的WiFi数传或者图传模块,方便室外下直接使用nomachine远程连接到tx2。
第六点、GPS的位置不要遮挡住激光雷达扫描处,即便要遮住部分激光雷达数据,要把GPS位置放到飞机尾部。
d.避障过程¶
避障可视化过程可仔细查看我们提供的视频demo讲解。
室外飞机准备都正常情况下,现在地面站qgc上面规划一条航线,先让飞机正常飞行mission,注意高度不要太高,如果不熟悉飞机,建议使用绳子将飞机牵住。要是飞行mission航点没有问题,继续执行下面的避障脚本。 注意一下,每次飞完一次飞机,建议重启reboot一下,直接在qgc中输入reboot远程重启。遥控器飞行结束之后保持在自稳模式下。
启动避障脚本。在 ~/amov_ws/src/px4_command/sh/sh_for_p200/lidar 路径之下,执行 ./collision_avoidance_vfh.sh 脚本。
或者直接将该脚本拖动到终端中启动,如下:
等待初始化OK,可以看到飞机的头是指向正东 E 的。航向角为 93° , 基本满足指向正东。
然后遥控器切换position模式,就会初始化两个航点,然后可以看到 rostopic echo /mavros/setpoint_raw/local 也有给飞机发送期望的数据,速度有xy数值,高度z一直发送1.
此时就可以在position下进行起飞,先保持悬停,然后切换遥控器切换到offboard模式。遥控器保持在悬停的时候就不要动摇杆了,直接切换两段开关至offboard模式即可。飞机就会按照规划的路径飞行,飞行高度保持1米。 xy水平速度会实时变化,有障碍物了x速度减少,y速度负增大或者正增大,绕开障碍物继续前行。实际飞行过程中一定要注意安全!
结束时候,到达规划航点时候,如下图所示,避障节点打印了 task over ,说明避障节点运行结束,飞机此时也会退出offboard模式,从而进入到position模式,这个时候需要使用遥控器在position模式下面缓缓将飞机降落。
因为该平台开源,可变因素很多,所以实机飞行过程中一定要注意安全。飞行完成一次之后,要将飞控reboot重启,重新运行避障脚本。
2.激光雷达室内建图定位¶
在我们目前的P200飞机上搭载的默认激光雷达是可以实现定位并且可以建图。使用的激光SLAM算法为谷歌开源的cartographer。在p200真机中,为了节省板载计算机的cpu的使用率,我们做了一些设置,只是启动 了rartographer_ros,让这个算法跑了起来,没有为其配置rviz.下面描述一下如何使用rplidar,cartographer_ros实时建图并且显示rviz下的地图。
1.确保rplidar_ros能够正常启动激光雷达¶
首先在终端输入命令 roslaunch rplidar_ros rplidar
启动成功需要注意两点,查看rplidar.launch文件中的serial_port(串口设备)和serial_baudrate(串口波特率),如下图所示:
查看爨口设备可通过命令:ls /dev/ | grep ttyUSB
查看设备为ttyUSB0,所以上图的serial_port为 ttyUSB0。
其次是波特率的问题,激光雷达A2的波特率一般为115200,需要将激光雷达的中间转换模块的波特率和launch文件的波特率拨到一致,需要自行检查一下。
上面两个注意到了,一般会正常启动rplidar。
还有一点需要注意的是,frame_id,在这里将其设置为horizontal_laser_link,这个改动后续会在cartographer_ros中用到。
2.修改cartographer_ros¶
首先进入到如图所1标识的路径下,修改编辑my_lidar.launch,如下所示,添加如下图2标识的两段代码 ,保存。所添加的这两段的代码就是在启动cartographer_ros的时候启动一下 rviz,进行显示。
然后在3标识的路径下面,打开编辑my_lidar.lua文件,将4标识的第22行tracking_frame改为启动激光雷达launch文件中的frame_id,确保是一致的, 修改为horizontal_laser_link。
接着在5标识的路径下,编译cartographer_ros,使用如6标识的指令:catkin_make_isolated --install --use-ninja
3.建图演示¶
编译完成以后,启动激光雷达节点和cartographher_ros节点。打开两个终端terminal,一个如7标识启动激光雷达:roslaunch rplidar_ros rplidar.launch
。
另一个如8标识启动cartographer_ros: roslaunch cartorgapher_ros my_lidar.launch
。
启动完成以后会自动打开rviz,并有雷达扫点,这就是正常的。如下图所示:
打开建图map。1 点击add 2 点击topic 3 点击map 4 点击OK。
最后呈现的就是实时的地图数据了。
4.在脚本中直接启动定位+建图¶
进入到9路径之下,拷贝lidar_fly.sh ,并重命名为lidar_fly_rviz.sh
脚本内容为如下:
启动该脚本,就可以在飞行中进行建图并查看建图效果了。
启动就完成了。
如果存在疑问,欢迎在我们的论坛<https://bbs.amovlab.com/>提问
3.yolo通用目标检测¶
1、查看各个依赖环境是否正常¶
a、opencv¶
使用 opencv_version
或者 pkg-config --modversion opencv
,如下图所示,安装的为opencv3.3.1
b、cuda和cudnn¶
cuda和cudnn都已经安装成功,只是环境中没有把它使能。修改环境变量文件 .bashrc 。修改之前的环境变量,添加如下 export PATH="${PATH}:/usr/local/cuda-9.0/bin"
,因为cuda的路径就在 /usr/local/cuda-9.0 。
.bashrc基本上没有太多修改,和上图环境保持一直即可。
打开终端输入 nvcc -V
,如下图表示cuda是安装好的,并且可以使用。
使用 dpkg -l | grep -i cuda
可以查看cuda相关的安装情况,如下图可以看出,我们安装的是 cuda9.0+cudvnn7.1.5.14,说明cuda和cudnn都已经安装成功,并可以正常使用。
2、下载darknet源码¶
源码地址: github https://github.com/amov-lab/darknet.git
码云 https://gitee.com/amovlab/darknet.git
jetson tx2 Ubuntu16.04系统里面本身有个darknet包,请重新命名或者删除掉,然后下在上面的源码,建议使用码云,速度可能比较快一点。如果给出的码云地址无法克隆,可以将github的源码备份到自己的码云库里面,自行下载。
4、使用darknet¶
a、下载weights文件¶
- COCO data set (Yolo v2):
- VOC data set (Yolo v2):
- Yolo v3:
将下载好的weights文件放到darknet目录之下。
b、使用单目摄像头进行yolo检测¶
进入到 darknet 目录下,执行 ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights /dev/video0
其中 /dev/video0 就是单目摄像头的检测到的设备驱动。
yolov3的帧率只有4左右。如上图所示
yolov3-tiny的帧率基本在23左右,如下图
5、使用darknet_ros¶
a、下载darknet_ros源码¶
码云地址: https://gitee.com/eason_xinyi/darknet_ros.git
删除 TX2 中 vision_ws/src 下面的darkent_ros功能包。从码云上面地址下载darkent_ros源码并更新子模块。执行如下指令: git clone https://gitee.com/eason_xinyi/darknet_ros.git
如下图所示:
下载完源码并进行更新,执行指令: git submodule update --init
如下图所示:
b、修改配置文件并编译¶
darknet_ros文件配置¶
添加 weights 包到 darknet_ros/yolo_network_config/weights 。提前下载好相关的 weights 包存放到U盘之内,然后拷贝到该路径之下。如下图:
添加cfg文件到 darknet_ros/yolo_network_config/cfg 。从home下面的darknet/cfg路径下拷贝需要的cfg文件到该目录路径之下。
修改yolov3的launch文件,只要修改订阅相机图像的topic,修改为单目摄像头发布的topic。如下图:
添加 yolov3-tiny 。默认下载的只有yolov3,但实际上使用 yolov3 帧率很低,所以提前配置下 yolov3-tiny 。
修改config文件,添加yolov3-tiny.yaml文件。修改方式只是修改config文件和weights文件,如下图:
添加yolov3-tiny的launch文件,可直接拷贝yolov3的launch,需要修改他的参数加载的配置文件,将yolov3改为yolov3-tiny。如下图所示:
然后编译整个 vision_ws功能包,执行 catkin_make -DCMAKE_BUILD_TYPE=Release
等待编译完成,如下图所示:
c、单目darknet_ros使用¶
在vision_ws/src下面,有ros_web_cam功能包,它可以将图像转换为ros下面的topic形式。上面内容中我们已经修改好,yolov3和yolov3-tiny的launch文件中图像的topic,所以我们直接进行ros版的darknet。
yolov3¶
先启动yolov3的launch文件,执行 roslaunch darknet_ros yolo_v3.launch
然后启动相机,执行 rosrun web_cam web_cam
由此可见,帧率只有3.0左右。接下来使用yolov3-tiny看看。
yolov3-tiny¶
先运行 roslaunch darknet_ros yolo_v3_tiny.launch
接着运行 rosrun web_cam web_cam
帧率明显看出来是提高了很多,延迟还是会有点。
d、双目t265使用darknet_ros¶
t265功能包代码更新¶
更新vision_to_mavros功能包,该功能包的路径在 ~/realsense_ws/src ,可以使用git remote也可以直接删除该功能包,重新下载。
vision_to_mavros功能包地址,码云gitee: https://gitee.com/eason_xinyi/vision_to_mavros.git
删除之前的包,下载更新,如下 git clone https://gitee.com/eason_xinyi/vision_to_mavros.git
切换到 amov_200902 分支之下,使用如下命令: git checkout amov_200902
cd ../.. 进入到 ~/realsense_ws 路径之下,执行 catkin_make
进行编译,如有报错,请提交issue。
编译完成之后,代码更新完毕,代码增加了t265的畸变处理。
修改畸变处理的配置文件:
在路径 ~/realsense_ws/src/vision_to_mavros/cfg 之下的 t265.yaml 文件。
相机的内参矩阵K:
t265接在tx2 USB3.0的接口之上(下面的USB口),打开一个终端,输入: rs-enumerate-devices -c
将 t265.yaml 中的所有参数 根据 rs-enumerate-devices -c
所查到的参数进行一一对应进行填写。
运行t265畸变处理的效果:
先运行t265的驱动: roslaunch realsense2_camera rs_t265.launch
再运行畸变处理程序: roslaunch vision_to_mavros t265_fisheye_undistort.launch
如下图所示,为原始图像以及对应的畸变处理之后的图像。
yolov3¶
修改yolo_v3.launch文件,将 image 参数改为 双目的topic ,我们改为 /camera/fisheye2/rect/image 。
运行如下三个launch文件:
roslaunch realsense2_camera rs_t265.launch
roslaunch vision_to_mavros t265_fisheye_undistort.launch
roslaunch darknet_ros yolo_v3.launch
检测效果如下图:
yolov3-tiny¶
与yolov3一样的操作流程。
运行如下三个launch文件:
roslaunch realsense2_camera rs_t265.launch
roslaunch vision_to_mavros t265_fisheye_undistort.launch
roslaunch darknet_ros yolo_v3_tiny.launch
检测效果如下图: