编程规则
本文档说明在 RobomationLAB 中进行机器人编程时应遵守的编程规则。
参考: 脚本编程 专用于 Python,积木会 1 对 1 转换为使用
robomationPython 包的 Python 代码。
顺序说明: 按共通的核心规则(1~2) → 积木代码规则(3~5) → Python 脚本代码规则(6~11) 的顺序整理。积木代码和 Python 代码的生成都要作为重点遵守。
1. 积木 ↔ Python 1 对 1 转换的限制
积木编程编辑器和 Python 编程编辑器 1 对 1 对应,并实时双向转换。
- 积木 → Python: 积木总是会转换为正确的 Python 代码。
- Python → 积木: 只对 能用积木表示的代码 进行转换。
因此,在 Python 编辑器中编写下面这样的代码时,可能无法从 Python 切换到积木编程编辑器,
这时会一起显示切换失败的原因。
- 有 Python 语法错误的代码
- 使用了不与积木对应(转换规则中未定义)的函数、方法、语法的代码
要保持能正常切换到积木编程编辑器,
必须在本文档和各机器人文档中定义的类、方法、函数以及支持的语法范围内编写代码。
2. 代码提示规则
只能使用 robomation Python API 手册 和 积木 ↔ Python 转换规则文档 中明确列出的类、方法和函数。
控制机器人时,严格禁止创建并使用上述文档中未定义的新的机器人控制方法。 不过,用户要求创建新函数时是允许的。
上述文档中的转换示例里没有出现的临时变量(例: 除存放机器人实例的变量以外的额外变量)的声明,只有在用户要求创建变量时才能创建。
另外,方法的实参必须写成字面量。
# 正确的例子
hamster_s.set_wheel_speed('both', 100)
# 错误的例子 - 使用了 API 手册中未列出的函数
hamster_s.set_wheel('both', 100)
# 错误的例子 - 声明任意变量
SPEED = 100
hamster_s.set_wheel_speed('both', SPEED)3. 积木代码的基本结构
提示积木代码时,必须始终把作为程序入口的最上层函数积木 setup 函数和 loop 函数作为基本结构包含进来。
加上这条规则后,之后所有的积木代码都会具有下面这样的基本结构。
| 积木结构 (Block Composer) | 提示方式(文本形式) |
|---|---|
| setup 函数 | setup 函数 |
| (内部的积木) | (内部的积木) |
| loop 函数 | loop 函数 |
| (内部的积木) | (内部的积木) |
4. 积木代码的格式(换行和缩进规则)
- 最上层的积木(setup 函数、loop 函数等)左对齐。
- 每个命令积木必须用换行符分隔,一行只输出一个积木。
- 内部有执行区域的积木(如果、重复、函数定义等)内部包含的下层积木要使用缩进,清楚地表现层次结构。
5. 内部积木和条件的表达规则
下拉菜单的选择值或输入值相当于积木的功能性实参(Argument),用方括号([])在积木文字中该值所在的位置直接插入来表达。
这样做是为了把积木固有的文字和用户选择、输入的值结合起来,在视觉上再现积木。
所有积木代码都必须以包含积木固有名称、下拉菜单选择值以及用户输入值(全部使用方括号([]))的形式提示,
用文本尽可能贴近地再现实际 Block Composer 积木的样子。
| 积木结构 (Block Composer) | 提示方式(文本形式) |
|---|---|
| 如果 [条件] 执行 [命令] 否则 [命令] | 如果 [条件] 执行 [命令] 否则 [命令] |
| RaccoonBot: 设为 [速度] 控制模式 | RaccoonBot: 设为 [速度] 控制模式 |
| RaccoonBot: 将关节 [1] 的速度设为 [100] | RaccoonBot: 将关节 [1] 的速度设为 [100] |
6. 脚本代码的基本结构
提示脚本代码(Python)时,必须始终把作为程序入口的函数 setup() 和 loop() 作为基本结构包含进来。
另外,为了能使用控制机器人所需的类和实用工具,要在代码最上方包含 from robomation import *,并把要使用的机器人声明为实例。
加上这条规则后,之后所有的脚本代码(Python)都会具有下面这样的基本结构。
# Python 代码的基本结构
from robomation import *
# (如果有要使用的机器人,就声明为实例,示例)
hamster_s = HamsterS(0)
# 在此处放置仅运行一次的初始化代码:
def setup():
pass
# 在此处放置重复运行的控制代码:
def loop():
pass7. 脚本代码的格式(换行和缩进规则)
- 最上层的函数(setup, loop 等)左对齐。
- 换行时产生的缩进必须以 1 个制表符(
\t) 为基准。(与编辑器的缩进基准相同)
8. 机器人控制规则(实例 / 方法)
控制机器人时,必须遵守下面这些规则。
- 在代码最上方包含
from robomation import *。 - 把要使用的机器人声明为实例。变量名使用各机器人既定的默认变量名,索引从 0 开始分配。
- 调用所声明实例的方法来控制机器人。
from robomation import *
hamster_s = HamsterS(0)
def setup():
hamster_s.set_wheel_speed('both', 50)
def loop():
pass使用同一种机器人的多台时,把索引按 0, 1, 2 … 递增来声明。(例:
hamster_s = HamsterS(0),hamster_s_1 = HamsterS(1))
机器人的轮速度设置、移动等操作,会在方法内部自动处理所需的初始化(例: 清理之前的移动命令),因此不需要另外编写前置的初始化代码。
9. 实用函数的调用规则
延时、播放声音、输出日志、颜色等共通的实用功能,通过 Utils 类的方法调用。
Utils.wait(1) # (seconds)
Utils.play_sound('', 100, False)
Utils.log(0, '', '')详细的实用函数列表请参阅下面的文档。
10. 优先使用机器人专用方法的规则
控制机器人硬件(轮速度、LED、声音等)时,
必须优先使用机器人(例:「HamsterS」)实例的专用方法,而不是共通的实用函数。
例如,需要用机器人发出声音时,
必须优先使用「HamsterS」实例的 sound_clip() 方法,而不是实用函数 Utils.play_sound()。
# 通过 HamsterS 机器人发出声音。(推荐)
hamster_s.sound_clip('beep')
# 通过 PC / 平板 / 移动设备发出声音。(不推荐)
Utils.play_sound('beep', 100, False)11. Import 规则
编写 Python 代码时,只 import 运行代码所需的模块。
- 为了控制机器人,默认在代码最上方包含
from robomation import *。 - 使用
math.的代码会自动添加import math,使用random.的代码会自动添加import random。 - 其他不必要的模块不要 import。
