ros功能包
计算机视觉
使用ROS的功能包使用以下常见的机器视觉应用。
1)摄像头标定:摄像头本身存在光学畸变,可以使用camera_calibration功能包实现双目和单目摄像头的标定。
2)基于opencv的人脸识别和物体跟踪:opencv是图像处理中的利器,ROS中的cv_bridge功能包为两者提供了接口,赋予ROS应用强大的图像处理能力,可以轻松实现人脸识别,物体跟踪等多种功能。
3)二维码识别:ROS中的ar_track_alvar功能包允许我们创建多种二维码标签,并且可以使用摄像头或Kinect实现二维码的识别与定位,为上层应用提供标识信息。
4)物体识别:ORK是ROS中的物体识别框架,提供了多种物体识别的方法,需要将已知的物体模型进行训练,通过模式匹配的方式识别三维物体的位置。
ROS中的图像数据
无论是USB摄像头还是RGBD摄像头,发布的图像数据格式多种多样,在处理这些数据之前,我们需要了解这些数据的格式。
连接USB摄像头到PC端的USB接口,通过一下命令启动摄像头:
roslaunch usb_cam usb_cam-test.launch
启动成功后,使用以下命令查看当前系统中的话题信息
rostopic info /usb_cam/image_raw

从打印的信息中可以看出,图像话题的消息类型是sensor_msgs/Image,这是ROS中定义的一种摄像头原始图像的消息类型,可以使用以下命令查看该图像的详细定义。
rosmsg show sensor_msgs/Image

该类型图像数据的具体内容如下。
1.header:消息头,包含图像的序号,时间戳和绑定坐标系。
- height:图像的纵向分辨率,即图像包含多少行的像素点,这里使用的摄像头为720.
- width:图像的横向分辨率,即图像包含多少咧的像素点,这里使用的摄像头为1280.
- enconding:图像的编码格式,包含RGB,YUV等常用格式,不涉及图像压缩码。
- is_bigendian:图像数据的大小存储模式。
- step:一行图像数据的字节数量,作为数据的步长参数,这里使用的摄像头为width乘以3=1280乘以3=3840字节
- data:存储图像数据的数组,大小为step乘以height字节,根据该公式可以算出这里使用的摄像头产生一帧图像数据大小为3840乘以720=2764800字节即2.7648MB.
三维点云数据
在Kinect数据显示中,rviz订阅camera/depth_registered/points话题后,主界面即可显示三维点云数据,那么这种三维点云数据的消息类型是什么呢,可以使用如下命令查看
rostopic info /camera/depth_registered/points

该消息类型对应于rviz中的Add可视化插件时所选择的插件类型,使用以下查看该消息类型的具体结构
rosmsg show sensor_msgs/PointCloud2

三维点云的消息定义如下。
1)height:点云图像的纵向分辨率,即图像包含多少像素点。
2)width:点云图像的横向分辨率,即图像包含多少像素点。
3)fields:每个点的数据类型。
4)is_bigendian:数据的大小存储模式。
5)point_step:单点的数据字节步长。
6)row_step:一列数据的字节步长。
7)data:点云数据的存储数组,总字节大小为row_step乘以height
8)is_dense:是否是无效点
点云数据中每个像素点的三维坐标都是浮点数,而且包含图像数据,所以单帧数据量也很大。如果使用分布式网络传输,在带宽有限的前提下,需要考虑能否满足数据的传输要求,或者针对数据进行压缩。
摄像头标定
摄像头这种仪器对光学器件的要求很高,由于摄像头内部和外部的一些原因,生成的无题图像往往会发生畸变,为了避免数据源造成的误差,需要针对摄像头的参数进行标定。ROS官方提供了用于双目和单目摄像头标定的功能包–camera_calibration.
camera_calibration功能包
首先使用一下命令安装摄像头特定功能包camera_calibration:
sudo apt-get install ros-kinetic-camera-calibration
启动标定程序
一切就绪后准备开始标定摄像头。首先使用一下命令启动USB摄像头:
roslaunch robot_vision usb_cam.launch
机器语言
语音识别的大致流程,主要分为以下两个步骤
第一步是学习或者训练。根据识别系统的类型选择能够满足要求的一种识别方法,并分析出这种识别所需的语音特征参数,并作为标准模式存储起来。
第二部是识别或者检测。根据实际需要选择语音特征参数,将这些特征参数的时间序列构成测试模板,再将其与已存在的参考模板逐一比较,并进行测量估计,最后经由专家知识库判决,最佳匹配的参考模板为识别结果。
通过一下内容实现机器人的听和说的两大功能。
英文语音识别:基于创建的语音库,ROS中的pocketsphinx功能包可以实现机器人的语音识别功能。
英文语音播放:ROS中的元功能包audio-common提供了文本转语音的功能包sound_play,可以实现机器人的英文播放功能。
智能语音应答:结合人工智能的标记语言AIML,机器人可以从语料库中智能匹配交流的输出语句,从而实现机器人的英文语音播放,从而实现智能化交流应用。
中文语音的识别与合成:在ROS中集成科大讯飞的语音处理SDK,让机器人更懂中文。
pocketsphinx功能包
在运行语音识别之前,先来了解pocketsphinx功能包的用户接口。
(1)话题和服务
pocketsphinx功能包发布的话题和提供的服务如图所示

(2)参数
pocketsphinx功能包中可供配置的参数如图所示

pocketshinx功能包的核心节点是recognizer.py文件。这个文件通过麦克风收集语音信息,然后调用语音识别库进行识别并生成文本信息,通过/recognizer/output消息进行发布,其他节点可以通过订阅该消息获取识别结果,并进行相应处理。
语音识别测试
首先,插入麦克风设备,并在系统设置里测试麦克风是否有语音输入。
然后,运行pocketsphinx包中的测试程序:
roslaunch pocketsphinx robocup.launch
创建语音库
语音库中的可识别信息使用txt文档存储。在功能包robot_voice创建一个文件夹config,用来存储语音库的相关文件。然后在该文件夹下创建一个commands.txt文件,并输入希望识别的指令。

当然,也可以根据需求对以上文件进行修改或添加。将该文件在线生成语音信息和模板文件,这一步需要登录以下网站操作:
http://www.speech.cs.cmu.edu/tools/lmtool-new.html
根据网站的提示,点击选择文件按钮,上传刚刚创建的commands.txt文件,再点击COMPILE KNOwLEDGE BASE按钮进行编译
编译完成后,下载COMPRESSED TARBALL压缩文件,解压到robot_voice功能包的config文件夹下,这些解压出来的.dic,.lm文件就是根据我们设计的语音识别指令生成的语音模板库。如图所示。

创建launch文件
接下来创建一个launch文件, 启动语音识别节点, 并设置语音模板
库的位置。 robot_voice/launch/voice_commands.launch文件的详细内容如
下:
<launch>
<node name="recognizer" pkg="pocketsphinx" type="recognizer.py" output= "screen">
<param name="lm" value="$(find robot_voice)/config/commands.lm"/>
<param name="dict" value="$(find robot_voice)/config/commands.dic"/>
<param name="hmm" value="$(find robot_voice)/config/pocketsphinx-en/model/hmm/en/hub4wsj_
</node>
</launch>
从以上代码中可以看到, launch文件在运行recognizer.py节点的时候
使用了之前生成的语音识别库和文件参数, 这样就可以使用自己的语音
库来进行语音识别了。 此外, 这里的hmm语音引擎参数发生了变化, 改
为一款支持更多语音模型的引擎。
语音指令识别
通过以下命令测试语音识别的效果如何, 尝试能否成功识别出
commands.txt中设置的语音指令
$ roslaunch robot_voice voice_commands.launch
$ rostopic echo /recognizer/output
语音引擎参数发生了变化, 改
为一款支持更多语音模型的引擎。
语音指令识别
通过以下命令测试语音识别的效果如何, 尝试能否成功识别出
commands.txt中设置的语音指令
$ roslaunch robot_voice voice_commands.launch
$ rostopic echo /recognizer/output

更多推荐


所有评论(0)