Robo4J入门
这篇博文将向您展示如何快速开始使用Robo4J并解释一些关键概念。
Robo4J包含一些关键的核心“模块”。 我们将在这里松散地使用“模块”一词,因为它们还不是JDK 9模块。 这些模块都被定义为它们自己的Gradle项目,并且在Gradle中有自己的编译时依赖性。
当您构建自己的机器人时,通常会依赖于robo4j-core以及为您的机器人使用的平台定义的单位。 例如,用于Raspberry Pi的robo4j-units-rpi,或用于Lego EV3机器人的robo4j-units-lego。
在这篇博文中,我将使用提供的Raspberry Pi lcd示例来展示如何在Raspberry Pi上设置和运行Robo4J。 米罗稍后将发布一个乐高示例。
模 | 描述 |
---|---|
robo4j,数学 | 常用的结构如点,扫描(激光范围扫描),特征提取等。 大多数模块都依赖于此模块。 |
robo4j-HW-* | 特定于平台的模块,具有易于使用的特定硬件平台抽象。 例如robo4j-hw-rpi,它包含易于使用的抽象,适用于Adafruit和Sparkfun的常见现成硬件。 |
robo4j核心 | 定义Robo4J框架的核心高级概念,例如RoboContext,RoboUnit和RoboReference。 |
robo4j-单元 - * | 一个特定于平台的模块,它定义了可以包含在项目中的高级RoboUnit。 这些模块基本上将硬件特定模块连接到Robo4J核心框架中,提供可以简单配置的即用型单元,可以是XML或代码。 |
请注意,可以使用robo4j-hw- *模块而无需购买框架的其余部分。 如果您只想引导使用您购买的硬件,而不使用框架的其余部分,那当然是可能的。 希望你会发现框架的其余部分足够有用。
你要做的第一件事是拉动robo4j核心回购:
git clone https://github.com/Robo4J/robo4j.git
一旦完成git拉动源,您将需要将模块安装到本地maven存储库中:
gradlew安装
现在您已准备好为LCD示例提取源:
git clone https://github.com/Robo4J/robo4j-rpi-lcd-example.git
我们最终将它全部构建成一个可运行的胖罐:
gradlew:fatJar
现在,要运行该示例,只需运行jar:
java -jar build \ libs \ robo4j-rpi-lcd-example-alpha-0.3.jar
如果您不在Raspberry Pi上,并且连接了Adafruit LCD屏蔽,那么您可以在任何硬件上运行该示例,向LCD工厂询问Adafruit LCD的Swing模型:
java -Dcom.robo4j.hw.rpi.i2c.adafruitlcd.mock = true -jar build \ libs \ robo4j-rpi-lcd-example-alpha-0.3.jar
(这个特定的例子实际上可以在不使用Robo4J核心的情况下运行;请参阅我之前发布的robo4j-hw-rpi版本的示例 。)
现在,让我们看看实例是如何设置的。 该项目有两个示例发射器。 一个是使用XML配置文件设置Robo4J, 一个用Java设置所有内容。 两者都是有效的方法,有时您可能想要混合它们 - 这是构建器支持的。 我将在此博客中使用XML版本。
在此示例中,我们需要配置两个单元。 按钮单元和LCD单元。 它们实际上位于相同的硬件地址上(Adafruit使用MCP23017端口扩展器与按钮和LCD使用相同的I2C地址通信)。 然而,在软件中连接它们时将它们视为两个逻辑单元要好得多,而这正是Robo4J对待它们的方式。
这是XML文件中最相关的部分:
请注意,AdafruitLcdUnit和AdafruitButtonUnit是为我们提供的,它们只是为示例配置。 另请注意,它们与预期位于相同的硬件地址上。 没有更改或添加代码来配置这些单元。 然而,控制器单元是我们的,它定义了按下按钮时应该发生的事情。
以下代码片段显示了如何实例化它(关注代码中最相关的部分):
我们自己创建了一个RoboBuilder,我们将配置文件作为输入流添加到构建器中,就配置而言。 构建器将用于在总体RoboContext的上下文中实例化单个RoboUnits。 RoboContext可以被认为是对“机器人”(具有(通常)共享生命周期的RoboUnits的集合)的引用。 它目前是本地引用(仅在本地Java运行时),但是一旦我们获得网络服务,您还可以查找远程RoboContexts。
一旦我们设置了RoboContext,我们就启动它,然后启动单个RoboUnits。 完成之后,我们还通过获取名为“lcd”的RoboUnit的引用向LCD提供一点启动消息,并向其发送初始LcdMessage。
控制器(不是现成的单元)在LCD上运行很少的演示,并允许用户使用向上和向下按钮在演示之间导航。 只需到这里寻找消息来源。
我将简单地指出,构建自定义单元最重要的部分是覆盖onMessage方法,并且该单元与大多数单元有些不同,因为它实际上是在内部状态上同步,并且将跳过所有按下的按钮。 demo正在运行。
概要
这是robo4j框架目前的简要介绍。 请注意,我们当前对核心进行了更改,这些更改当前未实现,例如使用注释更改单个RoboUnits的线程模型/行为。 在达到1.0之前,预计会发生变化。 另请注意,我们目前实施的单位数量非常有限。 在我们发布1.0之前,这也将发生变化。 在我们在框架中实现更多机器人之前,我们不会发布第一版API。
其中一个正在迁移到Robo4J的机器人是Coff-E 。
希望这会有所帮助,请注意这一天都在变化。 事情将继续发生变化,至少在今年夏天之后。 如果您想添加自己的单位,硬件抽象或类似,请随时通过info@robo4j.io与我们联系。 我们很乐意得到更多帮助!
:)