前言:这篇文档主要的内容包括两方面:一是在Ubuntu18.04系统上安装ROS控制bebop2无人机并接收到无人机拍摄的图像信息;二是使用YOLOv5算法对获取到的图像进行检测识别。
这篇文档的无人机控制部分主要参考师兄的博客,在此感谢~
一、安装ROS
控制系统采用ROS(robot operate system),版本为Melodic。打开terminal,并依次输入以下命令:
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt update
sudo apt install ros-melodic-desktop-full
sudo rosdep init
rosdep update
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
ubuntu16.04系统只支持kinetic版本的ros,ubuntu18.04系统只支持melodic版本的ros
二、创建工作空间以及编译相关资源包
1、 安装依赖包
sudo apt-get install build-essential python-rosdep python-catkin-tools
2、创建和初始化工作空间
mkdir -p ~/bebop_ws/src && cd ~/bebop_ws
catkin init
cd src
git clone https://github.com/AutonomyLab/bebop_autonomy.git src/bebop_autonomy
3、更新、安装依赖库
rosdep update
rosdep install --from-paths src -i
4、编译工作空间
catkin build -DCMAKE_BUILD_TYPE=RelWithDebInfo
5、teleop_twist_keyboard下载及编译
cd ~/bebop_ws/src
git clone https://github.com/ros-teleop/teleop_twist_keyboard.git
cd teleop_twist_keyboard
mkdir build
cd build
cmake ..
make -j8
6、darknet-ros下载及编译
这里在我的电脑上没有安装成功,以下提供参考代码:
cd ~/bebop_ws/src
git clone https://github.com/leggedrobotics/darknet_ros.git
cd ..
catkin_make -DCMAKE_BUILD_TYPE=Release
catkin build darknet_ros -DCMAKE_BUILD_TYPE=Release
三、YOLOv5的代码改进
在上一章节darknet-ros编译部分遇到问题之后,这里通过改进YOLOv5的代码,用于读取无人机传送的图像进行检测。这里声明这只是无奈之举……
这一章节可以确定无人机能够飞行并且传输图像之后再操作
1、确定图像位置
在无人机将采集到的图像传输到电脑上之后,会显示在电脑屏幕上我们首先打开terminal,输入:
xwininfo
这时鼠标的箭头变为一个‘十’字,放在图像窗口上,点击即可输出窗口的位置信息。
2、修改数据加载代码
1、打开yolov5/utils/dataloaders.py
找到类LoadScreenshots,把第214行注释掉,根据上一步获取到的位置信息重新写:
monitor = {'left': 67, 'top': 57, 'width': 856, 'height': 480} # 这是我自己的位置,举例用
2、打开yolov5/detect.py
找到第229行:
parser.add_argument('--view-img', action='store_true', help='show results')
# 修改为:
parser.add_argument('--view-img', action='store_true', default='True', help='show results')
找到第222行,改为:
parser.add_argument('--source', type=str, default='screen', help='file/dir/URL/glob/screen/0(webcam)')
四、调整相关代码
1、控制部分代码调整
该部分代码修改较为简单,进入teleop_twist_keyboard文件夹下,打开teleop_twist_keyboard.py代码,找到节点消息发布相关代码,将这行代码修改如下:
Pub = rospy.Publisher(‘bebop/cmd_vel’, Twist, queue_size = 1)
2、yolo检测算法代码部分修改
进入darknet_ros文件夹下,找到config文件夹,并且进入打开ros.yaml文件,打开后,找到camera_reading这段代码,将topic修改为:
/bebop/image_raw
修改完后,我们已经完成了yolo算法对视屏流的订阅,只要无人机视频传输回笔记本,我们启动检测算法,算法会自动对传输回来的视频流进行检测;(注意:改完代码后需重新编译工作空间,可以用catkin build指令对整个工作空间编译,也可单独编译这一个文件夹)
五、开始飞行并检测
1、打开无人机,让笔记本连接到无人机的WiFi
2、启动ROS
打开一个terminal,输入指令:
roscore
3、启动无人机图传
打开一个新的terminal,输入指令:
source ~/bebop_ws/devel/setup.bash
roslaunch bebop_tools bebop_nodelet_iv.launch
4、让无人机起飞\降落
再打开一个terminal,输入指令:
source ~/bebop_ws/devel/setup.bash
rostopic pub --once bebop/takeoff std_msgs/Empty (起飞)
rostopic pub --once bebop/land std_msgs/Empty (降落)
rostopic pub -1 bebop/reset std_msgs/Empty (紧急停止)
5、控制无人机
开启一个新的终端,输入指令:
source ~/bebop_ws/devel/setup.bash
rosrun teleop_twist_keyboard teleop_twist_keyboard.py cmd_vel:=bebop/cmd_vel
此时,控制端已经开启,操作方式为键盘操作:
i:控制无人机前进;
k:中断飞行指令;
,:控制无人机后退;
j控制无人机左转;
l控制无人机右转;
6、检测及效果
运行YOLOv5即可呈现检测效果(不要乱动屏幕,因为检测的区域是固定的)