跳到主要内容

第 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):按时间先做一段基础动作,方便和坐标运动做对比。directioncocube.FORWARD / cocube.BACKWARDspeed 是速度;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)

运行这段程序后,可以先做三个观察:

  1. 轻轻移动 CoCube,看 xy 会不会变化
  2. 转动 CoCube,看 angle 会不会变化
  3. 暂时离开定位区域,再看 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()
  • 先把打印结果跑通,再做更复杂的坐标任务
  • 如果路径总是偏,先看角度和起点摆放,不要只盯着目标点
  • 位置控制比时间控制更稳定,但也更依赖定位状态

挑战一下

给自己设计一个三段式坐标任务:

  1. 从起点移动到一个补给点
  2. 转向指定角度
  3. 再移动到终点

如果还想继续升级,可以再加一行屏幕提示,比如到站后显示 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 核心接口速查