0 / 4 个检查点已完成
前置课程

数学基础

前置:无(零基础可学)
这不是数学课

这里的每个概念都用机器人场景来讲。你不需要背公式,只需要理解"为什么需要它"和"怎么用它"。学完之后,你就具备了理解定位轮代码的所有数学工具。

一、坐标系 -- 告诉别人"你在哪"

1.1 为什么需要坐标?

VEX 比赛的场地是一个 366cm x 366cm 的正方形。比赛中你要跟队友沟通机器人的位置。

如果你说"机器人在左边一点",队友会问:多左?多一点是多少?

所以我们需要一种精确的方式来描述位置 -- 用两个数字:一个表示左右,一个表示前后。这就是坐标

坐标就是两个数字

写法是 (x, y)。x 表示左右位置,y 表示前后位置。比如 (100, 200) 的意思是"往右 100cm、往前 200cm"。

1.2 x 和 y

  • x = 左右方向。往右是正数,往左是负数。
  • y = 前后方向。往前是正数,往后是负数。

看下面这个简化的场地俯视图,上面标了几个位置的坐标:

x+ y+ (0, 0) (100, 100) (-100, -100) (100, -100) VEX 场地俯视图(简化)

几个要点:

  • 往右走,x 增大;往左走,x 减小
  • 往前走(图上是往上),y 增大;往后走(图上是往下),y 减小
  • 中心点是 (0, 0),叫做原点
动手试试

在脑子里想象一个方格纸。你站在 (0, 0):

  • 往右走 3 步 -- 你在 (3, 0)
  • 再往前走 2 步 -- 你在 (3, 2)
  • 再往左走 1 步 -- 你在 (?, 2) 答案是?

1.3 原点和正方向

原点就是坐标的起始点 (0, 0)。通常我们把机器人出发的位置设为原点。

正方向的约定:

  • x 正方向 = 往右
  • y 正方向 = 往前

这个约定并不是绝对的 -- 有些代码可能把 y 正方向定义成往后。重要的是:你和你的代码约定一致就行。

记住

坐标系没有"标准答案",关键是团队和代码保持一致。我们这里统一用:右 = x 正、前 = y 正。

检查点 1
机器人在 (10, 20),往前走了 5cm,现在在哪?
已完成

二、角度和旋转

2.1 角度描述方向

坐标告诉我们机器人"在哪",角度告诉我们机器人"朝哪"。

我们用角度来描述方向:

  • 0 度 = 面朝前(y 正方向)
  • 90 度 = 面朝右
  • 180 度 = 面朝后
  • 270 度 = 面朝左
0 度 (前) 90 度 (右) 180 度 (后) 270 度 (左) 顺时针

2.2 顺时针还是逆时针?

我们约定:顺时针 = 正角度

跟时钟一样:从 12 点(前方)往 3 点(右边)转,就是顺时针转了 90 度。

注意

数学课上一般逆时针为正。我们这里用顺时针为正,因为从上方俯视机器人时,顺时针更直觉 -- 就跟看时钟一样。

动手试试

你面朝前(0 度),顺时针转 180 度,现在面朝哪?

2.3 角度和移动方向

当机器人朝某个角度走直线时,x 和 y 坐标都可能变化:

  • 0 度走 -- 只有 y 变(往前走)
  • 90 度走 -- 只有 x 变(往右走)
  • 45 度走 -- x 和 y 都变,而且变化量一样大

那如果朝 30 度走呢?x 和 y 各变多少?这就是下一章要解决的问题。

检查点 2
机器人在 (0, 0) 朝向 90 度,直走 10cm,到哪?
已完成

三、三角函数 -- 斜着走怎么算?

3.1 问题引入

机器人朝 30 度方向走了 10cm。问题来了:

  • 往右走了多少?(x 变了多少?)
  • 往前走了多少?(y 变了多少?)

画出来就是一个直角三角形:

x(右) y(前) 30 度 10cm 5cm(往右) 8.66cm (往前)

斜边是 10cm,其中一个角是 30 度。数学家给这个拆分过程起了个名字:sincos

3.2 sin 和 cos 是什么

很简单,它们就是"拆分比例":

核心公式
sin(角度) = 往右走了多少 / 总共走了多少(横向比例)
cos(角度) = 往前走了多少 / 总共走了多少(纵向比例)

所以:

  • 往右走了 = 总距离 x sin(角度)
  • 往前走了 = 总距离 x cos(角度)

用上面的例子验证:机器人朝 30 度走了 10cm

  • 往右 = 10 x sin(30 度) = 10 x 0.5 = 5cm
  • 往前 = 10 x cos(30 度) = 10 x 0.866 = 8.66cm
一句话总结

sin 和 cos 就是把"斜着走"翻译成"往右走了多少 + 往前走了多少"的工具。

动手试试

不用计算器,猜一猜:

朝 0 度(正前方)走 10 步,sin(0 度) 应该是多少?(提示:完全往前走,往右走了 0 步)

3.3 常用值参考(不用背,用的时候查这里)

以下数值不需要记住。写代码时电脑会帮你算 sin/cos,这张表只是帮你建立直觉 -- 角度越大,sin 越大,cos 越小。

角度 sin cos 含义
0 度 0 1 完全往前走
30 度 0.5 0.87 主要往前,稍微偏右
45 度 0.71 0.71 往前和往右各一半
60 度 0.87 0.5 主要往右,稍微偏前
90 度 1 0 完全往右走

规律很明显:角度越大,sin 越大(越偏右),cos 越小(越不往前)。

3.4 自己试一试

拖动下面的滑块,看看不同角度时 sin 和 cos 怎么变化:

x+ y+ sin = 0.50 cos = 0.87
30 度
sin(角度)
0.50
cos(角度)
0.87
走 10cm:往右 5.00 cm,往前 8.66 cm
检查点 3
机器人朝 45 度走了 20cm。往右走了多少?(保留 1 位小数)
cm
已完成

3.5 为什么定位轮需要 sin/cos?

定位轮测到的是两个信息:

  • 机器人走了多远(通过轮子转了几圈计算出来的距离)
  • 机器人朝哪个方向(通过陀螺仪或两个轮子的差值)

但我们的坐标系需要的是:

  • x 变了多少(左右方向的位移)
  • y 变了多少(前后方向的位移)

sin 和 cos 就是那个翻译器 -- 把"朝某个方向走了多远"翻译成"x 变了多少、y 变了多少"。

定位轮核心公式预告

在定位轮的代码里,你会看到这两行:
deltaX = distance * sin(heading)
deltaY = distance * cos(heading)
现在你知道它们在干什么了。

四、弧度 -- 另一种角度单位

4.1 为什么要学第二种单位?

我们平时用"度"来表示角度,这是给人看的 -- 0 度、90 度、180 度,很直觉。

但 C++ 代码里的 sin()cos() 函数不接受度,它们只接受另一种单位:弧度

常见 Bug

sin(90) 不会得到 1。因为 C++ 的 sin() 会把 90 当作 90 弧度(大约是 5156 度),结果完全不对!

正确写法:sin(90 * M_PI / 180) 或者 sin(1.5708)

而且弧度还有一个超好用的公式(下面会讲)。所以弧度不只是"另一种写法",它在数学上有独特的优势。

等一下,π 是什么?

π(读作 "派")≈ 3.14159,是一个数学常数。

它的含义:任何圆的周长 ÷ 直径 = π。不管圆有多大多小,这个比值永远是 π。

记住 π ≈ 3.14 就够用了。代码里写 M_PI 就是 π。

4.2 弧度的定义

换算关系很简单:

度和弧度的换算
一圈 = 360 度 = 2pi 弧度(约 6.28)
半圈 = 180 度 = pi 弧度(约 3.14)
四分之一圈 = 90 度 = pi/2 弧度(约 1.57)

换算公式:

弧度 = 角度 x pi / 180

在代码里,通常定义一个宏或常量来做转换:

C++
// 度转弧度
double toRad(double deg) {
    return deg * M_PI / 180.0;
}

// 弧度转度
double toDeg(double rad) {
    return rad * 180.0 / M_PI;
}

4.3 弧度的杀手级应用

弧度有一个非常简洁的公式:

弧长公式(只对弧度有效!)
弧长 = 半径 x 弧度

只有用弧度,这个公式才成立。用度不行。

举个例子:半径 10cm 的圆弧,转了 90 度(= pi/2 弧度),弧长是多少?

  • 弧长 = 10 x pi/2 = 10 x 1.5708 = 15.7cm

这个公式在定位轮里非常重要 -- 定位轮的轮子转过的弧长,就等于半径乘以转过的弧度。这是定位轮测距的数学基础。

检查点 4
代码里写 sin(90) 会得到正确结果吗?
已完成

准备好了!

你已经掌握了理解定位轮需要的所有数学工具。回顾一下:

  • 坐标 = 用两个数字描述位置(x 是左右,y 是前后)
  • 角度 = 描述机器人朝哪个方向
  • sin / cos = 把"斜着走"拆成"往右多少 + 往前多少"
  • 弧度 = 代码里使用的角度单位,弧长 = 半径 x 弧度

这四个工具组合在一起,就能理解定位轮的全部数学原理了。