一 什么是Buzz?
Buzz是一种面向异构机器人集群的编程语言,允许用户用简洁的脚本来表达复杂的群体行为。
它是基于C语言开发,可用于任何类型的机器人软件,可与ROS框架集成(例如RosBuzz)。
目前支持支持Linux 和 MacOSX系统。
在群体内,bytecode字节码文件会被上传到群内不同机器人上,每个机器人的BVM(Buzz Virtual Machine)会执行该字节码文件。Buzz的调试文件与字节码文件分离,节省了机器人上运行内存。
Buzz是基于ARGos模拟器开发调试的。
二 Buzz相关概念
离散群:群被视为离散的机器人集合,每个机器人独立运行BVM和Bytecode。
按步执行:每一步包含四个阶段,包括处理接收到的消息、读取传感器数据、执行step脚本、广播消息。在过程中,必须设置每步的长度,便于启动下一步之前终止上一步的所有阶段。
通信模型:Buzz假设群内的所有机器人能够通过位置通信来交换信息。位置通信是一种基于gossip的信息交换形式,在这种方式中,机器人在接收到消息后能够估计消息源的相对位置。
三 Buzz脚本的编译与执行
工具:bzzparse、buzzasm、bzzdeasm、bzzc、bzzrun
文件:*.bzz(Buzz脚本代码文件,Buzz Script)、*.bo(字节码文件)、*.bdb(调试信息文件)、*.basm(汇编文件)
编译过程:(假设Buzz脚本代码文件为A.bzz)
1)bzzparse命令将A.bzz脚本代码文件编译为A.basm汇编文件;
2)bzzasm命令将A.basm汇编文件编译为A.bo字节码文件和A.bdb调试信息文件;(bzzdeasm是bzzasm的反编译过程)
bzzc命令综合了bzzparse命令和bzzasm命令,也就是说,可以通过 $ bzzc A.bzz 命令直接编译出A.bo和A.bdb文件。
机器人执行命令:$ bzzrun A.bo A.bdb (-trace参数用于输出堆栈信息,-I 参数用于添加依赖的bzz文件路径)
四 运行Buzz第一个案例(群体梯度距离计算)
function init() {
if(id == 0) {
# Source robot
mydist = 0.
}
else {
# Other robots
mydist = 1000.
# Listen to other robots' distances
neighbors.listen("dist_to_source",
function(value_id, value, robot_id) {
log("ROBOT ", id, ": value = ", value, " from robot ", robot_id, " at ", neighbors.get(robot_id).distance)
mydist = math.min(
mydist,
neighbors.get(robot_id).distance + value)
log("ROBOT ", id, ": mydist is now ", mydist)
})
}
}
function step() {
neighbors.broadcast("dist_to_source", mydist)
log("ROBOT ", id, ": mydist = ", mydist)
}
function destroy() {
}
mydist是本机器人到源机器人的距离,源机器人是id=0的机器人;
ARGos模拟器会按步执行调用step方法,step方法发送本机器人的全局变量mydist;
本机器人侦听邻居机器人发送过来的“dist_to_source”数据,计算并更新本地mydist;
2) 编译脚本代码:$ bzzc testgradient.bzz
3) 配置ARGos模拟器实验文件testgradient.argos(详细配置文件参考src/testing/test_experiment.argos文件)
3.1)配置控制器
<controllers>
<buzz_controller_footbot id="bcf">
<actuators>
<differential_steering implementation="default" />
<leds implementation="default" medium="leds" />
<range_and_bearing implementation="default" />
</actuators>
<sensors>
<range_and_bearing implementation="medium" medium="rab" show_rays="true" noise_std_dev="0" />
</sensors>
<params bytecode_file="testgradient.bo" debug_file="testgradient.bdb"/>
</buzz_controller_footbot>
</controllers>
<params>用于指定argos要执行的buzz脚本。
3.2)配置场景机器人
<arena size="50, 50, 4" center="0,0,2">
<distribute>
<position method="uniform" min="-2,-2,0" max="2,2,0" />
<orientation method="gaussian" mean="0,0,0" std_dev="360,0,0" />
<entity quantity="6" max_trials="100">
<foot-bot id="fb" rab_data_size="100">
<controller config="bcf" />
</foot-bot>
</entity>
</distribute>
</arena>
场景中6个foot-bot机器人,位置均匀分布在[-2,-2,0]和[2,2,0]的范围内,方向高斯分布在[0,0,0]和[360,0,0]的范围内,控制器使用第一步中定义的bcf控制器。
3.3)配置Buzz编辑器
<visualization>
<qt-opengl>
<user_functions label="buzz_qt" />
</qt-opengl>
</visualization>
4)启动argos模拟器,执行Buzz脚本
命令: $ argos3 –c testgradient.argos
按步执行结果: