ROS下基于YOLO的px4无人机目标检测

1777
28
2020年5月27日 14时59分

1 搭建无人机仿真环境

首先需要安装mavros,这是一个飞机固件与ros通信的包:

sudo apt install ros-kinetic-mavros ros-kinetic-mavros-extras
wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh
sudo chmod a+x ./install_geographiclib_datasets.sh
./install_geographiclib_datasets.sh ##此时执行速度很慢,耐心等待完成

 

接下来,下载固件:

git clone https://github.com/PX4/Firmware.git ##我一般将固件放在主目录下而不是ros的工作空间中
cd Firmware
git checkout v1.9.2
make posix_sitl_default gazebo

 

一般来说,第一次安装飞控固件,编译时会报错,因为缺少了必要的python依赖,因此在下载玩Firmware后,在编译之前,首先:

 cd Firmware
 bash
 bash ./Tools/setup/ubuntu.sh --no-nuttx --no-sim-tools ##此处跳过了仿真器的安装,因为已经在ros已经配置好了

 

这之后,再执行下面指令,一般就不会出错,如果继续报错,一般为个人电脑环境配置的问题,请根据终端中的错误提示自行安装依赖。

make posix_sitl_default gazebo

 

现在,px4无人机的基本环境就配置好了,应该可以看到gazebo界面中已经有了一个叫做iris的无人机。
为了方便,将Firmware的环境变量加入bashrc中:

source ~/Firmware/Tools/setup_gazebo.bash ~/Firmware/ ~/Firmware/build/px4_sitl_default
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/Firmware
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:~/Firmware/Tools/sitl_gazebo

 

在这之后,就可以通过launch文件启动仿真了:

roslaunch px4 mavros_posix_sitl.launch  ##此命令同时启动了mavros

 

启动界面

 

接下来,安装无人机的地面站控制软件QGC:

sudo usermod -a -G dialout $USER
sudo apt-get remove modemmanager -y
sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-libav -y
Download [QGroundControl.AppImage](https://s3-us-west-2.amazonaws.com/qgroundcontrol/latest/QGroundControl.AppImage)
chmod +x ./QGroundControl.AppImage
./QGroundControl.AppImage  (or double click)

 

打开地面站后,可以看见已经自动连接上了仿真中的无人机。

地面站界面

 

在这里,无人机环境搭建已经全部完成了。

2 切换无人机模型

上面启动的无人机,并没有携带相机,我们进行目标检测,需要携带一个摄像头,Firmware中已经提供了模型,因此,我们只需要更换一个带有相机的飞机模型。
我提供了一个模型下载:

 

链接:https://pan.baidu.com/s/1D_3pG3bqmBsSxLOCZVhl3w
提取码:fnam

 

将下载的模型放到Firmware/tools/sitl_gazebo/models下,替换原来的模型文件。
然后修改Fimeware/launch/mavros_posix_sitl.launch的第16行:

<arg name=”sdf” default=”$(find mavlink_sitl_gazebo)/models/iris_stereo_camera/iris_stereo_camera.sdf”/>

 

此时,iris模型已经携带了一台双目相机,有用的话题为:

/stereo/camera/left/camera_info
/stereo/camera/left/image_raw
/stereo/camera/right/camera_info
/stereo/camera/right/image_raw

 

相机话题

3 配置YOLO环境

该过程参开官方配置文档即可,基本没什么坑,yolo并不完全依赖gpu,但是没有gpu速度会非常慢。
官网提供的环境配置为:darkned_ros安装配置方法
按照官方文档安装必要的依赖和包是非常有必要的。

 

安装完成后,需要修改两处:

首先,在darknet_ros/launch/darknet_ros.launch中修改:

  <arg name="image" default="/stereo/camera/left/image_raw" />

 

接着修改darknet_ros/config/ros.yaml:

camera_reading:
    topic: /stereo/camera/left/image_raw

 

然后运行:

roslaunch darknet_ros darknet_ros.launch

 

此时在终端中可以看到:

darknet运行示意图

 

说明yolo已经正常运行并且开始检测目标了。

 

接着,可以在gazebo中添加各种模型,然后使用yolo进行检测。

 

本文在这里提供一个gazebo的world文件,下载地址为:
XTDrone

 

下载后,复制 XTDrone /sitl_config /worlds/outdoor1.world到Firmware/tools/sitl_gazebo/worlds下。
接着修改Fimeware/launch/mavros_posix_sitl.launch的第15行为:

<arg name="world" default="$(find mavlink_sitl_gazebo)/worlds/outdoor1.world"/>

 

此时再次启动,应该看到是这样的:

gazebo outdoor1 sim

 

这样,就完成了所有的配置。

4 运行效果展示

关闭之前所有的命令,按照这个顺序重新启动仿真:

roslaunch px4 mavros_posix_sitl.launch
启动地面站 ##此处建议使用游戏手柄控制无人机,或更简单直接开启QGC自带的虚拟摇杆功能对飞机控制
roslaunch darknet_ros darknet_ros.launch

 

演示效果请看视频:

 

 

最后,如果你对无人机的仿真和应用感兴趣,推荐一个非常优秀的开源的无人机项目XTDrone,在里面可以学习到更多的无人机知识。

发表评论

后才能评论

评论列表(28条)

  • 2rhu4_7662 2020年9月11日 下午4:58

    您好,MAVROS与SITL通信为什么一直是false啊?

  • 2rhu4_7662 2020年9月11日 下午3:41

    您好,想问一下,地面站怎么自动连接仿真中无人机啊?我的一直显示连接失败

  • 2rhu4_7662 2020年9月11日 下午2:44

    您好,我的系统是18.04的,安装步骤操作这条命令后:roslaunch px4 mavros_posix_sitl.launch
    总出现下面这个错,并且也打不开gazebo:
    [Err] [REST.cc:205] Error in REST request
    libcurl: (51) SSL: no alternative certificate subject name matches target host name ‘api.ignitionfuel.org’
    VMware: vmw_ioctl_command error 无效的参数.
    Aborted (core dumped)
    [gazebo_gui-4] process has died [pid 2534, exit code 134, cmd /opt/ros/melodic/lib/gazebo_ros/gzclient __name:=gazebo_gui __log:=/home/ws/.ros/log/76b37004-f3f9-11ea-9b48-000c29df3869/gazebo_gui-4.log].
    log file: /home/ws/.ros/log/76b37004-f3f9-11ea-9b48-000c29df3869/gazebo_gui-4*.log

    请问这是怎么回事啊?

  • 丢了薛定谔的猫 2020年9月2日 下午10:44

    对了 请问我用make posix_sitl_default gazebo打开gazebo,QGC会自动连接飞机,但是我用roslaunch px4 mavros_posix_sitl.launch打开gazebo(能正常打开,也有飞机),但是QGC无反应。这是什么原因??

    • 神秘老铁 回复 丢了薛定谔的猫 2020年9月3日 下午3:48

      一般为环境配置不完整,你需要查看mavros是否安装完成,同时需要配置一下px4的python环境(官网中https://dev.px4.cc/master/zh/setup/dev_env_linux_ubuntu.html 运行.sh自动配置)

    • 2rhu4_7662 回复 丢了薛定谔的猫 2020年9月11日 下午5:21

      您好,MAVROS与SITL通信为什么一直是false啊?请问您知道怎么解决嘛?

  • 丢了薛定谔的猫 2020年9月2日 下午10:09

    替换了outdoor1.world世界模型之后导致gazebo打不开。使用原本的空场景,gazebo一切正常。这是什么原因??
    还有百度云链接失效了,大佬能补一下吗

  • 楽ˇˇ 2020年6月30日 下午3:57

    我下载的是这个https://github.com/osrf/gazebo_models,然后解压至.gazebo/models,文件大小为1.9G,然后重新打开还是不行,卡在

  • 楽ˇˇ 2020年6月30日 下午2:13

    您好,在第二点“切换无人机模型”中,将下载的模型放到Firmware/tools/sitl_gazebo/models下,替换原来的模型文件。这里的替换原来的模型指的是哪一个?我的Firmware/tools/sitl_gazebo/models文件夹中没有“iris_stereo_camera”这个文件夹,复制进来后,按照您给的方案,启动roslaunch, 没有无人机,也没有双目的话题

  • 楽ˇˇ 2020年6月29日 下午8:52

    按照您的方式下载模型和修改,但是打不开,卡在了GAZEBO-Preparing your world。。。界面,请问是不是有什么文件没有复制?

    下载后,复制 XTDrone /sitl_config /worlds/outdoor1.world到Firmware/tools/sitl_gazebo/worlds下。
    接着修改Fimeware/launch/mavros_posix_sitl.launch的第15行为:

    • 神秘老铁 回复 楽ˇˇ 2020年6月29日 下午9:10

      是否是第一次使用gazebo 有可能因为gazebo默认的模型需要下载 往往需要很久时间才能启动 一般来说都是先去官网把模型自己下载下来然后放到对应的位置 这样就能正常启动gazebo了

    • 丢了薛定谔的猫 回复 楽ˇˇ 2020年9月3日 上午10:42

      你好,请问飞机的模型你下载了吗???如果下载了可否发我一份。

  • ‭木顶思上 2020年6月13日 下午5:59

    您好,我开发的环境是Ubuntu16.04,按照您文章的步骤,打开QGC后,提示Waiting For Vehicle Connection。我QGC版本是3.5.6

  • 2020年5月30日 下午11:02

    执行到 bash ./Tools/setup/ubuntu.sh –no-nuttx –no-sim-tools 的时候报错显示:
    Collecting pip
    Downloading pip-20.1.1-py2.py3-none-any.whl (1.5 MB)
    |█████████ | 419 kB 2.4 kB/s eta 0:07:20ERROR: Exception:
    Traceback (most recent call last):
    File “/home/yy/.local/lib/python2.7/site-packages/pip/_internal/cli/base_command.py”, line 188, in _main
    status = self.run(options, args)
    File “/home/yy/.local/lib/python2.7/site-packages/pip/_internal/cli/req_command.py”, line 185, in wrapper
    return func(self, options, args)
    File “/home/yy/.local/lib/python2.7/site-packages/pip/_internal/commands/install.py”, line 333, in run
    reqs, check_supported_wheels=not options.target_dir
    File “/home/yy/.local/lib/python2.7/site-packages/pip/_internal/resolution/legacy/resolver.py”, line 179, in resolve
    discovered_reqs.extend(self._resolve_one(requirement_set, req))
    File “/home/yy/.local/lib/python2.7/site-packages/pip/_internal/resolution/legacy/resolver.py”, line 362, in _resolve_one
    abstract_dist = self._get_abstract_dist_for(req_to_install)
    File “/home/yy/.local/lib/python2.7/site-packages/pip/_internal/resolution/legacy/resolver.py”, line 314, in _get_abstract_dist_for
    abstract_dist = self.preparer.prepare_linked_requirement(req)
    File “/home/yy/.local/lib/python2.7/site-packages/pip/_internal/operations/prepare.py”, line 412, in prepare_linked_requirement
    hashes=hashes,
    File “/home/yy/.local/lib/python2.7/site-packages/pip/_internal/operations/prepare.py”, line 198, in unpack_url
    hashes=hashes,
    File “/home/yy/.local/lib/python2.7/site-packages/pip/_internal/operations/prepare.py”, line 124, in get_http_url
    link, downloader, temp_dir.path, hashes
    File “/home/yy/.local/lib/python2.7/site-packages/pip/_internal/operations/prepare.py”, line 220, in _download_http_url
    for chunk in download.chunks:
    File “/home/yy/.local/lib/python2.7/site-packages/pip/_internal/cli/progress_bars.py”, line 166, in iter
    for x in it:
    File “/home/yy/.local/lib/python2.7/site-packages/pip/_internal/network/utils.py”, line 39, in response_chunks
    decode_content=False,
    File “/home/yy/.local/lib/python2.7/site-packages/pip/_vendor/urllib3/response.py”, line 564, in stream
    data = self.read(amt=amt, decode_content=decode_content)
    File “/home/yy/.local/lib/python2.7/site-packages/pip/_vendor/urllib3/response.py”, line 529, in read
    raise IncompleteRead(self._fp_bytes_read, self.length_remaining)
    File “/usr/lib/python2.7/contextlib.py”, line 35, in __exit__
    self.gen.throw(type, value, traceback)
    File “/home/yy/.local/lib/python2.7/site-packages/pip/_vendor/urllib3/response.py”, line 430, in _error_catcher
    raise ReadTimeoutError(self._pool, None, “Read timed out.”)
    ReadTimeoutError: HTTPSConnectionPool(host=’files.pythonhosted.org’, port=443): Read timed out.
    怎么解决?是源的问题吗?

    • 神秘老铁 回复 2020年5月31日 上午11:00

      bash ./Tools/setup/ubuntu.sh –no-nuttx –no-sim-tools
      然后遇到里面提示某些python的依赖下不了 就手动pip2或pip3的方式单独下载

    • 回复 神秘老铁 2020年5月31日 下午2:12

      这一步今天执行没有问题 可能是网络原因 但又出现了新的问题 执行make posix_sitl_default gazebo编译时,就一直跑不动?就卡在这一步 — PX4 ECL: Very lightweight Estimation & Control Library v1.9.0-rc1 报错显示 error: RPC failed; curl 18 transfer closed with outstanding read data remaining
      fatal: the remote end hung up unexpectedly
      fatal: early EOF
      fatal: index-pack failed
      fatal: clone of ‘https://github.com/PX4/sitl_gazebo.git’ into submodule path ‘/home/yy/Firmware/Tools/sitl_gazebo’ failed
      Failed to clone ‘Tools/sitl_gazebo’. Retry scheduled
      可是github的网址 https://github.com/PX4/sitl_gazebo.git 能打开啊?

    • 回复 神秘老铁 2020年5月31日 下午2:14

      还有个问题 作者大大 你是在ubuntu16.04 还是18.04下搭建的?

    • 神秘老铁 回复 2020年5月31日 下午11:54

      我在ubuntu18.04 但是这个在16.04也是没有问题的 我都用过 我建议你按照官方网站的环境配置过程检查一下:dev.px4.cc

    • 回复 神秘老铁 2020年6月1日 上午10:41

      谢谢,昨天编译px4没问题了,现在试着往后面的步骤走

    • 回复 神秘老铁 2020年6月1日 上午11:11

      更改模型后 执行launch文件 gazebo反而打不开了?查看topic 也没有双目的话题发布 将sdf 文件中的model://stereo_cam更改为model://stereo_camera 模型可以打开了 但依然没有双目的话题?请问这个怎么处理?

    • 神秘老铁 回复 2020年6月1日 下午4:38

      是我的模型吗 我提供的那个和官方的不一样 是修改后的

    • 回复 神秘老铁 2020年6月5日 下午5:05

      是的 按照文中描述 将百度云中的模型添加进去的