数学基础
这里的每个概念都用机器人场景来讲。你不需要背公式,只需要理解"为什么需要它"和"怎么用它"。学完之后,你就具备了理解定位轮代码的所有数学工具。
一、坐标系 -- 告诉别人"你在哪"
1.1 为什么需要坐标?
VEX 比赛的场地是一个 366cm x 366cm 的正方形。比赛中你要跟队友沟通机器人的位置。
如果你说"机器人在左边一点",队友会问:多左?多一点是多少?
所以我们需要一种精确的方式来描述位置 -- 用两个数字:一个表示左右,一个表示前后。这就是坐标。
写法是 (x, y)。x 表示左右位置,y 表示前后位置。比如 (100, 200) 的意思是"往右 100cm、往前 200cm"。
1.2 x 和 y
- x = 左右方向。往右是正数,往左是负数。
- y = 前后方向。往前是正数,往后是负数。
看下面这个简化的场地俯视图,上面标了几个位置的坐标:
几个要点:
- 往右走,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 正。
二、角度和旋转
2.1 角度描述方向
坐标告诉我们机器人"在哪",角度告诉我们机器人"朝哪"。
我们用角度来描述方向:
- 0 度 = 面朝前(y 正方向)
- 90 度 = 面朝右
- 180 度 = 面朝后
- 270 度 = 面朝左
2.2 顺时针还是逆时针?
我们约定:顺时针 = 正角度。
跟时钟一样:从 12 点(前方)往 3 点(右边)转,就是顺时针转了 90 度。
数学课上一般逆时针为正。我们这里用顺时针为正,因为从上方俯视机器人时,顺时针更直觉 -- 就跟看时钟一样。
你面朝前(0 度),顺时针转 180 度,现在面朝哪?
2.3 角度和移动方向
当机器人朝某个角度走直线时,x 和 y 坐标都可能变化:
- 朝 0 度走 -- 只有 y 变(往前走)
- 朝 90 度走 -- 只有 x 变(往右走)
- 朝 45 度走 -- x 和 y 都变,而且变化量一样大
那如果朝 30 度走呢?x 和 y 各变多少?这就是下一章要解决的问题。
三、三角函数 -- 斜着走怎么算?
3.1 问题引入
机器人朝 30 度方向走了 10cm。问题来了:
- 往右走了多少?(x 变了多少?)
- 往前走了多少?(y 变了多少?)
画出来就是一个直角三角形:
斜边是 10cm,其中一个角是 30 度。数学家给这个拆分过程起了个名字:sin 和 cos。
3.2 sin 和 cos 是什么
很简单,它们就是"拆分比例":
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 怎么变化:
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() 函数不接受度,它们只接受另一种单位:弧度。
写 sin(90) 不会得到 1。因为 C++ 的 sin() 会把 90 当作 90 弧度(大约是 5156 度),结果完全不对!
正确写法:sin(90 * M_PI / 180) 或者 sin(1.5708)
而且弧度还有一个超好用的公式(下面会讲)。所以弧度不只是"另一种写法",它在数学上有独特的优势。
π(读作 "派")≈ 3.14159,是一个数学常数。
它的含义:任何圆的周长 ÷ 直径 = π。不管圆有多大多小,这个比值永远是 π。
记住 π ≈ 3.14 就够用了。代码里写 M_PI 就是 π。
4.2 弧度的定义
换算关系很简单:
半圈 = 180 度 = pi 弧度(约 3.14)
四分之一圈 = 90 度 = pi/2 弧度(约 1.57)
换算公式:
在代码里,通常定义一个宏或常量来做转换:
// 度转弧度
double toRad(double deg) {
return deg * M_PI / 180.0;
}
// 弧度转度
double toDeg(double rad) {
return rad * 180.0 / M_PI;
}
4.3 弧度的杀手级应用
弧度有一个非常简洁的公式:
只有用弧度,这个公式才成立。用度不行。
举个例子:半径 10cm 的圆弧,转了 90 度(= pi/2 弧度),弧长是多少?
- 弧长 = 10 x pi/2 = 10 x 1.5708 = 15.7cm
这个公式在定位轮里非常重要 -- 定位轮的轮子转过的弧长,就等于半径乘以转过的弧度。这是定位轮测距的数学基础。
准备好了!
你已经掌握了理解定位轮需要的所有数学工具。回顾一下:
- 坐标 = 用两个数字描述位置(x 是左右,y 是前后)
- 角度 = 描述机器人朝哪个方向
- sin / cos = 把"斜着走"拆成"往右多少 + 往前多少"
- 弧度 = 代码里使用的角度单位,弧长 = 半径 x 弧度
这四个工具组合在一起,就能理解定位轮的全部数学原理了。