Category Archives: Robotics - Page 2

ROS支持的Ubuntu版本

最近在项目中需要使用ROS机器人操作系统,在官网了解之后发现Ubuntu发行版对其的支持最好。我之前只接触过Fedore与RedHat,所以我特地了解了一下Ubuntu的特性。

Ubuntu基于Debian GNU/Linux,支持x86、amd64/x64和ppc架构,由全球化的专业开发团队(Canonical Ltd)打造的开源GNU/Linux操作系统。Ubuntu对GNU/Linux的普及特别是桌面普及作出了巨大贡献,由此使更多人共享开源的成果与精彩。在开源桌面操作系统中,无论是性能还是界面Ubuntu都被公认为是最优秀的。Ubuntu最初为桌面开发,但如今也是GNU/Linux服务器版本的一个重要选择 [1]。

Ubuntu每6个月发布一个新版本,每个版本都有对应的代号与版本号。版本号基于发布日期,如最新的版本15.10就发布于2015年10月。Ubuntu每隔两年就有一个LTS版本(Long-Term-Support),该版本一般比较稳定并且会提供长期支持。目前已有的LTS版本有6.06 LTS (dapper),8.04 LTS (hardy),10.04 LTS (lucid),12.04 LTS (precise)以及14.04 LTS (Trusty Tahr)。

ROS支持Ubuntu 10.04、Ubuntu 11.10、Ubuntu 12.04等 [3],最新的ROS Jade版本还支持Ubuntu 14.04。其中10.04使用的是我比较熟悉的Linux 2.6.32版本,并且也是LTS版本,所以优先考虑使用。之后,我将尝试在x86平台上构架该系统。

【参考文献】

[1] Baidu百科Ubuntu词条,http://baike.baidu.com/view/4236.htm

[2] Ubuntu官方网站,http://www.ubuntu.com/

[3] ROS官方网站,http://www.ros.org/

【修订历史】

V1.1    2015-11-30  更新了ROS Jade的相关内容。

锂电池的主要参数与选型

在进行机器人设计时,动力源是必不可少的。常用的供能方式有很多,如干电池、镍氢电池、锂电池、硫酸铅电池。其中,锂电池在放电性能以及能量密度方面的优势明显,被广泛使用。

锂电池有三个重要的性能参数:电压容量以及放电倍数

锂电池的电压是由串联级数决定的,单节锂电的电压是一定的,所以锂电总电压永远是单节电池电压的整数倍。锂电池在表示时,使用”串联级数+s“作为其型号,如两节串联表示为2s,三节串联则为3s。单节锂电池的额定电压为3.7v,充满时为4.2v,放空为3.5v。不同级数的锂电池电压整理如下:

电池级数 额定电压(v) 电压范围(v)
2s 7.4 7.0 – 8.4
3s 11.1 10.5 – 12.6
4s 14.8 14.0 – 16.8
5s 18.5  17.5 – 21.0
6s 22.2 21.0 – 25.2

锂电池的容量表示其存储电能的大小,容量越大,充电后运行的时间就越长。锂电池的容量以毫安时为单位,如2000mAH表示以2000mA电流放电,可以持续一个小时。

锂电池另外一个重要参数是放电倍数C,C值的大小决定了其放电电流的能力,公式为最大放电电流 = C * 容量。如一个1000mAH,20C的锂电池,最大的放电电流即为1000mA * 20 = 20A。

在选用前,需要核算机器人系统需要的电压、最短续航时间以及需要的最大供电电流,同时考虑到体积、重量以及是否需要保护板等其他因素,这样就可以选择到合适的锂电池了。

【修订历史】

v1.1   07/18/2014   修改了文章版式;将电压表制作为表格形式;修正了部分单位错误。

超声波雷达的设计与实现

本文作者:云飞机器人实验室

联系方式:automatic.dai@gmail.com

原文地址:www.yfworld.com

一、开发背景

2011年初,当时我的毕设”基于嵌入式系统的无线环境监测机器人”需要一套用于自主避障的传感方案。当时候选的传感器有:GP2D12、红外收发管、超声波传感器、激光传感器。红外收发管测量距离较近,受环境光影响严重;激光传感器受反射面材质影响较大,而且不易处理;GP2D12虽也是基于红外原理设计的,但经过了调制与滤波,所以性能相比红外收发管要好很多,可其输出是模拟量需要额外的信号调理,且其输出电压与距离呈非线性,不易处理,另外价格也较高(90元左右)。所以最终确定了使用超声波传感器模块,原因有以下几个:

1)精度较高,可达3mm;

2)测量结果与其输出呈线性关系;

3)测量距离范围大,可达5m;

4)价格相对便宜,30元左右;

5)输出为数字电平,易于处理。

 

二、硬件设计

我所设计的机器人需要有前方180度范围的障碍物探测能力,而超声波模块的检测角大约有30度左右,故可以在180度范围内部署6个互成30度排列的超声波传感器。但是这种方式得到的分辨率极低,每次采集只能得到6个采样点。如果要提高采样点的数量,就必须增加超声波传感器的数量,这样空间上就会十分拥挤。

为了解决分辨率与超声波数量之间的矛盾,我参照雷达的工作原理,设计了该超声波雷达模块。该模块由舵机、支架、激光管、超声波模块组成,其组成如下图所示:


Figure 1. 超声波雷达顶视图


Figure 2. 超声波雷达左视图

其中舵机为MG995模拟舵机,其旋转角在180度,速度为0.13秒/60度。支架部分为一块PCB电路板,完成超声波模块的物理、电气连接,同时也实现了与舵机的物理连接,使得支架板可与舵机同步旋转;两个平行放置的激光管在效果图中未画出,是为今后升级至视觉测距预留的;三个超声波模块均匀排列,采用三个可以加快扫描速度,而间隔60度使每个传感器负责60度的测量范围,并且不会相互干扰。

支架板的PCB图如下所示,P11、P22、P33安装超声波模块,J1为外部接口:


Figure 3. 支架PCB图

最终实物图如下图所示:


Figure 4. 超声波雷达实物图

 

三、工作原理

超声波雷达有两种工作模式:一种为静态模式,一种为扫描模式。

工作在静态模式时,支架平台不移动,这种情况下可以快速采集周边障碍物状态,但分辨率较差,只能得到左、中、右3个采样点。

而工作在扫描模式时,舵机带动支架平台作扫描运动,每隔1度进行一次采样。这种模式下分辨率较高,但是一次扫描周期较长,无法在运动中测量。这种模式下,支架平台的运动情况如下:


Figure 5. 工作在扫描模式

由上可知,静态模式和扫描模式各有利弊。在实际使用中,工作在静态模式即可进行简单的避障,而在遇到周边环境较为复杂的情况时,则切换到扫描模式进行全面扫描,从而实现避障行为。

支架平台的旋转是通过舵机来实现的,舵机是一种角度控制元件,常用于航模中。舵机的输出角度与其信号输入有关,该信号周期一般为50Hz,其脉宽就决定了舵机的旋转角度。对于MG955,当Ton=1500us时,舵机旋转至中心位置;Ton=1000us左右时旋转至左45度位置;Ton=2000us时旋转至右45度位置。其他角度依次类推,呈线性关系。


Figure 6. MG955舵机

超声波模块采用市场上常见的US100超声波模块,使用时首先给Trig脚一个10us以上的高电平,之后等待Echo为高,并测量Echo高电平的时间t,所测距离可由以下公式得到:

s = (t * Vsound) / 2。


Figure 7. 超声波模块US100

 

四、软件设计

该超声波雷达平台的软件使用AVR-GCC开发,基于Germs SDK。Germs是本站一个基于ATmega系列单片机的SDK,旨在提高AVR项目的开发速度。

软件设计的整体思路是:在内存中开辟一个180单元的缓冲数组,每个数组单元与角度一一对应。当扫描开始后,控制舵机由-30度方向向+30度方向旋转,每次步进一度,每步进一次,依次采样三个超声波模块的距离值,并保存在对应的缓冲数组中。0~59度范围由左方超声波传感器进行采集,60~119度由中间传感器负责采集, 120~179度由右方传感器采集,总计180度。该部分程序代码如下:

<br />
int i = 0, j = 0;</p>
<p>int distance[180];</p>
<p>for ( i = -30; i &lt; 30; i++ )</p>
<p>{</p>
<p>	server_setdegree(i);</p>
<p>	distance[j] = ultrasonic_getdistance(0);</p>
<p>	distance[j+60] = ultrasonic_getdistance(1);</p>
<p>	distance[j+120] = ultrasonic_getdistance(2);</p>
<p>	j++;</p>
<p>}<br />

程序中包含两个子函数:server_setdegree()与ultrasonic_getdistance()。其中server_setdegree()通过修改PWM的占空比,控制舵机的旋转角度;而ultrasonic_getdistance()用于对指定超声波通道进行一次触发-采样。

超声波传感器的量程为:5-5000mm,以声速为340m/s计算,对应的高电平时间应为29.4us~29411.8us,使用tick为1us的16位定时器即可准确测量该时间。实际因资源受限只能使用1个tick为1us的8位定时器模拟16位定时器,对应精度为340m/s*1us=0.34mm,可以满足系统要求。

将一次实验采集到的数据通过串口发送至上位机,并通过Excel展示,得到以下距离分布图:


Figure 8. 超声波雷达距离测量图

将以上测量图与实际环境比较,大体符合实际情况。

 

五、误差分析

该系统的误差有以下两个方面:

1、距离误差,即测量的距离与实际距离之间的误差;

2、角度误差,即障碍物的角度与实际角度之间的误差。

导致以上两个误差的原因,我认为有以下几个方面:

1、定时器误差

在读取超声波模块返回时间时,是以查询方式进行的,故存在延时;另外定时器为离散计数,在时间上非连续,也存在±1 LSB的量化误差。

2、余波干扰

因为超声波会在空间中不断反射、震荡并逐步衰减,所以有可能导致本次的采集结果为上一次的余波,造成误差。

3、互扰

多个超声波模块如果同时工作,也会相互干扰,这已经通过分时复用的方式进行了避免。

4、声速误差

声速是受温度影响的,温度越高,声速越快,在运算时应根据当前的环境温度进行一定的补偿。声速与温度的近似关系是:V = 331.5 + 0.607*T,在室温25度的情况下为346.675m/s。所选用的超声波模块内部已经进行了温度补偿,故程序中不需要重复进行该工作。

5、计算误差

程序在计算时以浮点数方式运算,也存在一定的计算误差。

经实际测量,雷达的精度在距离较近时比较准确,在3mm以内;而在距离比较远时则误差较大,会发生跳动。这可能是因为超声波指向性不好,使其被沿途的其他物体干扰,造成了误测量。

 

六、问题与不足

1、舵机控制为开环控制,在运行时无法得知当前角度,若舵机变化速度较快,有可能导致所测距离与角度不同步;

2、如何有效在原始数据的基础上建立避障算法,实现自主避障导航;

3、目前扫描一次的时间较长,需要进一步提高扫描速度。可以采用适当降低扫描精度的方法,如间隔3度采样一次,实现扫描速度的提高;

4、因超声波模块的指向性不强,故很容易有干扰,另外超声波的余波也会成为干扰源,干扰超声波信息的正常采集。

机器人电机驱动器YFWind

YFWind是专门用于中小型移动机器人的电机驱动模块,该模块支持双路有刷电机驱动,可提供5A持续电流,6A瞬间电流,电路留有YFSMega专用接口,也可使用其它控制器驱动。模块留有电源指示灯、正反转工作指示灯,并具有反接、过热关断、输出短路等保护。

模块的主要特性如下所示:

控制对象

5 – 12V 直流电机

负载电流

5A持续,6A峰值

通道数量

两路

控制方式

GPIO

调速方式

PWM

指示LED

电源、正转、反转

保    护

反接保护、过热关断保护、输出短路保护

接  口

单排插针*2,或10口输出(与YFSMega兼容)

机器人控制器YFSMega128

YFSMega128是我在2010年设计的一款机器人控制器,该控制器使用Atmega128作为主控芯片,具有丰富的外设资源,包括:8路数字输入/输出,8路模拟量输入,6路PWM输出,2路转速传感器输入,1个LCD显示,4个用户按键,1个蜂鸣器,1个IO并口与1个YFWind电机接口。

该控制器的参数如下所示:

Application

机器人竞赛、机器人DIY、AVR学习、毕业设计

MCU

Atmega128

FLASH

128KB

RAM

4KB

EEPROM

4KB

Digital

8路带指示灯三线制I/O,8路并口I/O

Analog

8路12位ADC(可接三线制传感器)

PWM

6路,其中2路与电机复用

LCD

Nokia5110

UART

UART0(TTL,232),UART1(TTL,232)

SPI

1路

I2C

1路

Interface

电机专用接口(与YFWind系列兼容),另含2路转速传感器接口

Power Input

电池或外接电源适配器,6V – 12.6V

Power Supply

舵机总计3A,传感器总计1A

Programming

通用AVR-ISP编程口

MicroMouse V2电机的选择

第一版本的MM(MicroMouse)使用的是带减速箱的N20电机。这种电机非常小巧,比130电机的体积还要小,空载转速大概50转/分钟,适合小型机器人。电机店和淘宝上很容易买到,价格大约在15-25元之间:

图1  N20直流电机

新版本的MM首先希望在电机上进行改进,备选的几个方案有:

1) 直流步进电机;

2) 直流无刷电机;

3) 直流空心杯电机。

步进电机的好处是易于控制,且不需要额外的转速反馈。缺点是速度较慢,且一旦打滑就会造成累积误差。2010年参加全国电脑鼠大赛时,赞助商周立功公司提供的电脑鼠就是使用步进电机的。我觉得步进电机是一个好的入门级方案,可以实现,但无法出色。

之后考虑过使用无刷电机,无刷电机没有换向接触损耗、噪音低、寿命长、稳定性好,广泛用于光盘驱动、电动车中。无刷电机的缺点就是要使用专门的驱动电路,之前和朋友做毕业设计时接触过无刷驱动器的设计,觉得还是挺麻烦的。再者就是控制难度比较大,每路需要六个Mos管、三个驱动芯片和三个PWM。虽然可以使用成品电调,可是势必会增加重量,对电脑鼠的速度性能不利。

现在我有了更好的选择:直流空心杯电机。空心杯电机使用无铁芯转子,具有很小的转动惯量,这一点对于需要快速起停、运动灵活的电脑鼠来说非常适合。参照以往电脑鼠国际大赛的设计,一般使用Faulhaber1717 (冯哈伯1717)电机。1717后缀表示直径17mm,机身长度17mm。以下是冯哈伯电机的介绍:

“FAULHABER直流电机采用斜绕方式的空心杯转子,没有齿糟效应以及非常轻的重量。这使得转子转动惯量极小。因而FAULHABER电机动态性能上卓越超群。对小动率产品,FAULHABER电机采用精密合金换向器,因其接触电阻低而使性能优良。”(引自互联网)

在机器人设计中经常可见Faulhaber电机,之前使用博创的机器人平台好像也是使用的Faulhaber电机。尤其是其德国的血统,让人对之的性能充满信心。

      图2  Faulhaber电机 

可惜的是,我在网上并没有找到本地销售Faulhaber1717这款电机的,只找到一家国外的网站,报价大约是500元一个,那是相当贵啊。不过我倒是找到有售Faulhaber2224电机的,价格也很便宜只有几十块钱。虽然体积大了一点(r=22mm l=24mm),但是我想对于我这种业余爱好者来说应该不是很大的问题。

一些MicroMouse的照片

一年之前我用AVR单片机设计了一台电脑鼠,时至今日这个设计已经略显过时。近日准备重新制作一个,改为32位处理器并使用无刷电机驱动,于是搜集了一些电脑鼠的设计照片,图片来源:

http://www.micromouseonline.com/2012/02/14/apec-2012-mice/#axzz1oKnSyfiT

Read more »

Robocode官方应用文章索引

Robocode最早来自IBM公司,由Mathew Nelson创立并维护。
IBMdeveloperWorks里,我找到了很多有关Robocode的应用文章,现整理如下:

Robocode 基本原理之方向剖析
http://www.ibm.com/developerworks/cn/java/l-robocode/

Robocode 高手的秘诀:圆周瞄准
http://www.ibm.com/developerworks/cn/java/j-circular/index.html

Robocode 参数大揭密
http://www.ibm.com/developerworks/cn/java/l-robocode5/index.html

Robocode Rumble: 冠军的技巧
http://www.ibm.com/developerworks/cn/java/j-robowrap/index.html

Robocode 高手的秘诀: 因数避墙法(factored wall avoidance)
http://www.ibm.com/developerworks/cn/java/j-fwa/

世界robocode机器人的四大运动方式分析
http://www.ibm.com/developerworks/cn/java/l-robocode3/index.html

Robocode 基本原理之坐标锁定
http://www.ibm.com/developerworks/cn/java/l-robocode2/index.html

在Robocode中使用Vector实现敌人列表
http://www.ibm.com/developerworks/cn/java/l-robocode4/index.html

人工智能 Java 坦克机器人系列: 强化学习
http://www.ibm.com/developerworks/cn/java/j-lo-robocode2/index.html

人工智能 Java 坦克机器人系列: 神经网络,上部
http://www.ibm.com/developerworks/cn/java/j-lo-robocode3/index.html?ca=drs

人工智能 Java 坦克机器人系列: 神经网络,下部
http://www.ibm.com/developerworks/cn/java/j-lo-robocode4/index.html?ca=drs

Robocode常见问题

本文由 云飞机器人实验室 翻译。

What is the difference between frames and ticks?
一帧(Frame)与单位时间(Tick)有什么区别?
A tick refers to one unit, which is also called a Turn in Robocode. During one turn, you may perform one action as a Robot, or multiple (independent) actions as an AdvancedRobot. A frame is a unit of drawing to the Robocode client interface. If you are processing turns slowly, you will get one frame per tick / turn. However, if you up the turns per second beyond your computer’s ability to render the frames, you will miss some frames of animation. This won’t affect the robots’ behavior, unless you foolishly added code in your onPaint(Graphics2D) method that alters your bots behavior. In that case, your bot will behave differently depending on whether or not the Paint button has been enabled, and if the framerate can keep up with the turnrate.
一个单位时间指Robocode中的一个回合。在这个回合中,Robot只能执行一个动作,AdvancedRobot只能执行一组独立动作。而一帧是一连串界面的绘图动作。如果你将每回合的时间设得很长,你会得到一帧/回合。然而,如果你每回合的速度过快,超过了计算机的绘制速度,那么你可能会丢帧。但这只是绘制上的损失,不会影响你机器人的行为(除非你傻到在OnPaint中编写代码)。

Can I fire bullets with power higher than 3.0 or lower than 1.0?
我可以发射火力在1.0与3.0之外的子弹么?
No and yes. You can’t fire bullets with power greater than 3.0, but you can fire bullets with power as low as 0.1. If you call a firing function (i.e. setFire()) with a value greater than 3.0, Robocode will adjust it to 3.0, and if you call it with a power lower than 0.1 (except 0.0 which will not fire) it will adjust it to 0.1. Additionally, you can fire bullets with power less than 0.1 under one condition: when your robot has less than 0.1 energy left, in which case a bullet is fired with however much energy your robot had left.
是也不是,你不可以发射大于3.0的子弹,但是可以发射小到0.1能量的子弹。如果调用setFire()时大于3.0,会被矫正到3.0;同样的,小于0.1会被矫正到0.1。只有一种情况能发射<0.1的子弹,那就是你的能量不足0.1,这时子弹能量是你当前的最大生命。

Read more »

构建你的第一个Robocode坦克

上次向大家简单介绍了一下Robocode的安装,但却没有具体说明如何创建一个Robocode项目。要开发Robocode,需要正确安装JVM(Java Virtual Machine),Robocode程序,以及Visual Studio2008。当然你也可以使用JAVA环境开发,这里假设你使用的是Robocode的.Net版本。

打开Visual Studio2008,点击File->New->Project,在弹出的窗口中选择Visual C#中的Class Library:

 
图1. 新建一个C# Class Library工程

输入工程名,比如”MyTank”。这时会生成一个工程,并默认包含了一个Class1.cs文件。因为我们需要使用Robocode的开发库,所以需要添加相关引用,右键点击工程树中的”References”选择”Add Reference”:

 
图2. 
添加引用   Read more »