一、摄像头(ROS)
1.1 ROS摄像头驱动
在linux系统中,可以直接在终端中输入ls /dev/video*
,查看是否有可用的摄像头设备。一般只有一个摄像头的系统会返回/dev/video0
。
在检测到摄像头设备后,用三条语句进行相机的测试,
sudo apt-get install ros-kinetic-usb-cam //开始安装ROS摄像头的驱动
roslaunch usb_cam usb_cam-test.launch //启动摄像头
rqt_image_view //显示摄像机画面
1.2 相机标定
只有经过标定后的摄像头才能进行后续的操作,摄像头参数的标定可以借助标定功能包,安装方式如下,
sudo apt-get install ros-kinetic-camera-calibration //标定功能包安装
标定的具体操作参考官网。
此外除了普通的RGB相机,其它类型的相机也有相对应的驱动和标定功能包,这视情况而定。
二、物体识别
2.1 人脸识别
本案例中,人脸识别借助OpenCV中的人脸识别接口,一种基于Haar特征的级联分类器对象检测算法。OpenCV的安装如下,
sudo apt-get install ros-kinetic-vision-opencv libopencv-dev python-opencv
这里需要注意的是,OpenCV中的图片格式和ROS中的图片格式是不同的,需要通过cv_bridge
库进行转换,即
from cv_bridge import CvBridge
#ros_imag为ROS中的图像数据,cv_image为opencv可以处理的格式
cv_image = CvBridge().imgmsg_to_cv2(ros_imag, "bgr8")
ros_image = CvBridge().cv2_to_imgmsg(cv_image, "bgr8")
2.2 水杯识别
通过基于tensorflow框架的SSD_MobileNet,来进行水杯的识别。tensorflow的环境,可以借助virtualenv工具配置完成。virtualenv的安装如下,
sudo apt-get install python-pip python-dev python-virtualenv
tensorflow环境配置,首先创建一个包含系统环境的空间virtualenv --system-site-packages ~/tensorflow
,接着激活新创建的虚拟环境source ~/tensorflow/bin/activate
,然后就是更新下pip版本easy_install -U pip
,最后便是tensorflow环境的安装,而关于tensorflow的安装要注意和ROS环境相匹配,如果直接pip install --upgrade tensorflow
,会出现依赖包因为版本不匹配的错误,因此需要事先限制依赖包的版本。
比如kinetic版本的ROS,各依赖包的版本如下,
Flask==0.11.1
attrdict==2.0.0
eventlet==0.19.0
python-socketio==1.6.1
numpy==1.13.1
Pillow==2.2.1
scipy==0.19.1
keras==2.0.8
tensorflow==1.3.0
h5py==2.6.0
可以将这些依赖保存为一个txt文件,然后通过pip install -r requirements.txt
安装,这里如果网速不好的话,可以设置镜像源安装,比如添加ustc的镜像源,
pip install -r requirements.txt -i https://mirrors.ustc.edu.cn/pypi/web/simple
通过摄像头识别水杯可以参考SSD_MobileNet中的usb_cam_detector.launch和detect_ros.py文件。
三、遥控四轮车
3.1 思路
物体的识别后会得到物体在图片中的中心点(x, y)和识别物体大小的矩形宽(w)和高(h),我们可以借助(x, y)处于图片的什么区域对小车转向进行控制,而识别物体的矩形框的大小可以控制小车的前进后退。
3.2 实现方式
假设摄像机采集的图片分辨率为$W \times H$,则有小车的控制规则如下,
if ( w > W/2 and h > H/2):
小车前进
else:
小车后退
if (x > W/2):
小车右转
else:
小车左转
这样就基本实现了通过识别物体的状态来遥控小车,控制小车的运行方式。