Rosmin与Rossum

Rossum demo:

Rosmin demo:

Rosmin

项目地址:https://code.google.com/p/wtfrobot-rosmin/

相关文章:

Rosmin—OpenCV Color Blob Tracker on Android

Android下PocketSphinx的离线语音识别

Rosmin—OpenCV Color Blob Tracker on Android

Rosmin—两台Android手机的Socket双向通信

Rosmin—在Android上绘制小车行进路线图并标记

Rosmin—折腾USB Host Shield的日子

Rosmin机器人是我们去年(2012年)制作的一个使用Arduino驱动的小型移动机器人,连接上Android手机,可以完成手机控制的基本运动,追踪乒乓球,以QR码为人工路标移动到指定区域,搜寻目标,视频监控等等。

硬件结构:

软件结构:

  • 图像处理

    利用Android版OpenCV的ColorBlobTrack,控制舵机追踪乒乓球一类有明显颜色特征的物体。

  • 语音识别

    利用CMU Sphinx语音库实现的小范围离线语音识别,识别速度、准确度都还不错,而且是离线的,不需要连接网络。

  • Google ADK Mega2560

    使用Google ADK Mega2560 通过USB线与Android手机相连,让小车由小车上搭载的手机运行的服务端程序控制,另外另一台Android设备通过WiFi连接到小车上的手机作为客户端可对小车远程控制。

  • 陀螺仪

用陀螺仪的角加速度信息计算出角度,综合手机发出的控制命令绘制小车运行轨迹。

实现的功能有:

  1. 基本运动:用Android设备控制小车完成基本运动,可以用控制界面的按钮和语音来操控。如前进,后退,停止,左转,右转,车身左转90度,车身右转90度,舵机云台的转动等。

  2. 追踪乒乓球: 由小车上的Android手机做图像处理获取小球坐标,通过Arduino控制舵机对正小球。根据小球偏离中心位置的距离调整运动速度。详见这篇:Rosmin—OpenCV Color Blob Tracker on Android

  3. 以QR码为人工路标的导航: 我们设计了一个以QR码作为人工路标的导航策略,根据超声波传感器检测拐角,利用QR码提供的信息和陀螺仪传感器的信息运动到指定区域。会有一篇水论文,不过现在还没发出来。

  4. 绘制运动轨迹: 我们利用Android上的Google Maps控件做了一个绘制小车运动轨迹的程序,由小车上手机陀螺仪获取角加速度,计算出角度。不知是我们算法不行还是手机加速度计不够精确,用加速度计算出的里程误差太大根本用不了。于是我们就给小车一个恒定的速度,综合控制命令的信息(比如前进后退停止)来绘制轨迹。在客户端可以显示出小车的运行轨迹,还有QR码路标和目标的位置。详见这篇:在Android上绘制小车行进路线图并标记

  5. 寻找目标: 不断转动寻找目标,发现目标以后就向目标前进。根据目标区域面积判断是否足够靠近,足够靠近了就认为到达了目标自动停止。关于怎么检测目标和计算目标区域面积仍然在:Rosmin—OpenCV Color Blob Tracker on Android

  6. 视频监控: 用手机的WiFi Camera应用即可,可以通过PC端的Web界面控制。

Rossum

项目地址:https://code.google.com/p/wtfrobot-rossum/

相关文章:

Rossum—Android上ROS开发介绍与安装简介

Rossum—PID与里程计

Rossum—slam

Rossum—Android上ROS开发——android_core创建一个android应用

Rossum—ROSjava-android控制ROS机器人

Rossum—ROSjava的消息发送

Rossum—tpofinder 平面纹理物体识别

Rossum是我们以ROS机器人操作系统为核心做的一个自主导航机器人,名字来自于《罗萨姆的万能机器人( Rossum’s Universal Robots)》里的Rossum一词。使用 Kinect 传感器模拟激光测距仪,Arduino 控制器驱动电机控制机器人运动,Atom上网本置于机器人内作为主要的处理设备。

实现的功能:

  1. 基本运动控制: 机器人运动模式为轮式运动,由两个驱动轮驱动机器人运动,一个万向轮辅助,采用 PI 反馈,闭环控制机器人速度,可以精确平滑地控制机器人的运动,同时利用编码器获取的数据,由运动学模型推算机器人的当前坐标系位姿。

  2. 语音控制: 通过 Android 手机发送语音控制机器人运动,可进行离线英文语音识别(和Rosmin相同),在线中文语音识别(讯飞)。

  3. 跟随运动: 即turtlebot_follower,使机器人与人保持一定距离并正对人体,当人转向或移动时,机器人相应跟随人体转向和移动。

  4. 同时定位与地图构建(SLAM): 移动机器人在未知环境中依靠传感器获取的信息进行环境建模,同时利用所创建的环境地图估计其本身的位姿。

  5. 自主导航: 在构建出静态地图的基础上,实现机器人从一个位置运动到地图上的另一个指定位置。

  6. 物体识别: 利用tpofinder,实现识别有纹理特征的物体,如书本封面,咖啡盒等,识别后用TTS发声,通过舵机云台对准物体。详见:Rossum—tpofinder 平面纹理物体识别

最开始确定方案的时候我们找到了Dr. Rainer Hessmer的一篇文章,它是用Kinect来模拟激光测距仪来做SLAM的,里程计只靠电机上的编码器。他的博客上讲得非常详细,Arduino的介绍,Kinect模拟激光测距仪,惯性导航,SLAM和路径规划的参数这些全都有。当时我们啥都不懂,就把他的博客打印出来一篇一篇地看。

由于时间很紧,而且在机器人功能还没完全实现前就要写各种文档,我们真正用在这个机器人身上的开发时间很少,甚至可能不如Rosmin,但这个项目却是准备时间最长的,从一开始接触ROS,Android编程,Python,长时间犹豫不决地选购底盘,到后来的调试SLAM耗时有半年,调试SLAM和导航实际时间也就一个多月。

一开始我还想在ARM上实现它。那个时候ROS的网站上还没有Ubuntu ARM的源,但是刚刚发布ROS Groovy,把构建工具由rosbuild改成了catkin,还给出了详细的编译步骤。于是我就照着步骤编译了一下,核心包比较顺利地编译成功了。不过现在即使官方网站有源了,除了核心的库外,其它比较上层的包多数都没有构建成功。用它来做难度太大,而且性能不太好,于是我还是放弃了。图个方便不想遇到驱动问题,而且那时侯我们时间也比较紧了,所以没用mini-itx主板什么的,直接用了10寸的Atom上网本。至于底盘,在ROS的qq群里刚好发现有人出售专门用于ROS的机器人底盘Boomerang,于是我们就直接买了,包括它整个亚克力板的外壳和两个带编码器的电机、轮子。

虽然我们找到了这么详细的教程,不过要适配上我们的机器人硬件仍然有很多麻烦。Dr. Rainer Hessmer使用的ros版本是electric,而我们要用fuerte,有一些代码要改,比如参数的双引号什么的。还有一些包被废弃了,改名了,要把launch文件改一下。还有Kinect放置的位置和轮子的距离参数之类的,里程计的调试耗费了最长时间。但是编码器精确度有限,到最后里程计也还是很不准的。在我们视频里可以发现,其实机器人的位置估计是很不准的,万幸的是可以用SLAM算法纠正过来,在SLAM建图的时候注意对准拐角,建出的地图勉强可用,我们还可以用GIMP或者其它图片编辑工具小小滴修正一下,用来导航效果还行。SLAM的参数我们一开始尝试调过,不过后来觉得调整的意义不大,因为Dr. Rainer Hessmer做的已经很好了,我们效果没他的好主要原因应该是里程计。关于PID和里程计:http://blog.csdn.net/xiaoqiaoaidianzi/article/details/9179809/,slam:http://blog.csdn.net/xiaoqiaoaidianzi/article/details/9190829/

地图手工修正前后对比:

最后,其实我开始想实现的远远不止这些,我还想用OpenCV的blob检测来绘制出空中乒乓球的运动轨迹,利用运动轨迹做一些有意思的事情,让机器人具有简单的“认知”,还有三维的rgbd-slam,还有PCL的三维物体识别,还有利用语音识别让机器人完成一些有逻辑的任务,可惜时间远远比我们预料的少,遇到的问题远远比我们预料的多,我们的精力也有限,仍然有一些遗憾吧,现在我们WTFRobot团队的三人都已经加入考研大军了。