第 3 课 · 位置与速度
这一课学什么?
前一课里,CoCube 已经能按时间前进和转弯。
这一课开始加入定位反馈,让程序不只是“让它动”,还要“知道它动到了哪里”。

学习目标
- 认识
cocube.pos - 学会先判断
cocube.pos.state - 会用
print()调试坐标和朝向 - 知道
move_to()和rotate_to()里的speed会影响动作快慢 - 理解从“按时间走”到“按坐标走”的差别
用到的硬件和功能
这一课建议把 CoCube 放到 CoMaps 上运行。
会用到的接口主要有:
cocube.pos.x/cocube.pos.y/cocube.pos.angle:当前位置和朝向。x/y是当前坐标;angle是当前朝向角。cocube.pos.state:定位是否有效。只有它为真时,上面的坐标和朝向数据才可靠。cocube.move_ms(direction, speed, ms):按时间先做一段基础动作,方便和坐标运动做对比。direction取cocube.FORWARD/cocube.BACKWARD;speed是速度;ms是时长。cocube.move_to(x, y, speed=40):移动到目标坐标。x/y是目标点;speed是移动速度,常用0~50。cocube.rotate_to(angle, speed=30):转到指定朝向。angle是目标角度;speed是转向速度。
先认识这个能力
CoMaps 上的运动,不再只是“走 800 毫秒”。
它更像是在处理两个持续变化的数据:
- 当前位置
- 当前朝向
开始读坐标前,先记住一条原则:
cocube.pos.state为真,位置数据才可信
开始编程
1. 先把位置打印出来
import time
import cocube
while True:
if cocube.pos.state:
print(
"x =", cocube.pos.x,
"y =", cocube.pos.y,
"angle =", cocube.pos.angle,
)
else:
print("定位暂时无效,请把 CoCube 放回定位垫")
time.sleep_ms(200)
运行这段程序后,可以先做三个观察:
- 轻轻移动 CoCube,看
x和y会不会变化 - 转动 CoCube,看
angle会不会变化 - 暂时离开定位区域,再看
pos.state会不会变化
2. 把“读数据”和“做动作”连起来
import time
import cocube
cocube.move_ms(cocube.FORWARD, 30, 800)
time.sleep_ms(300)
if cocube.pos.state:
print("after move:", cocube.pos.x, cocube.pos.y, cocube.pos.angle)
cocube.rotate_to(90, 25)
time.sleep_ms(300)
if cocube.pos.state:
print("after turn:", cocube.pos.x, cocube.pos.y, cocube.pos.angle)
这段程序的重点不是动作本身,而是看动作之后数据怎么变。
3. 从“按时间走”升级到“按位置走”
import time
import cocube
if cocube.pos.state:
cocube.move_to(120, 60, 35)
time.sleep_ms(300)
cocube.rotate_to(90, 25)
time.sleep_ms(300)
cocube.move_to(120, 120, 35)
else:
print("请先把 CoCube 放到定位垫上,再尝试 move_to()")
这里最值得体会的一点是:
move_ms()更像“按时间发命令”move_to()更像“根据反馈到达目标”
运行时观察什么
运行这课程序时,重点看这些现象:
- 坐标变化通常不是完全同步的
angle会直接反映转向结果- 同一个目标点,
speed不同,运动节奏也会不同 - 同一个目标点,在不同起点出发时,路径不一定一样
常见问题 / 使用提醒
pos.state无效时,不要继续依赖move_to()和rotate_by()- 先把打印结果跑通,再做更复杂的坐标任务
- 如果路径总是偏,先看角度和起点摆放,不要只盯着目标点
- 位置控制比时间控制更稳定,但也更依赖定位状态
挑战一下
给自己设计一个三段式坐标任务:
- 从起点移动到一个补给点
- 转向指定角度
- 再移动到终点
如果还想继续升级,可以再加一行屏幕提示,比如到站后显示 Mission OK。
快速参考
这一课最常用的写法是:
import cocube
if cocube.pos.state:
print(cocube.pos.x, cocube.pos.y, cocube.pos.angle)
cocube.rotate_to(90, 25)
cocube.move_to(120, 120, 35)
cocube.pos.state:定位是否有效cocube.pos.x/y/angle:当前位置和朝向cocube.rotate_to(...):转到指定朝向cocube.move_to(...):移动到指定坐标
如果想继续查定位和运动接口,可以查看 cocube 核心接口速查。