一句话结论:
绝大多数工业机器人、机械臂、运动控制里的XYZ坐标:优先用 float(单精度);只有高精度场景才上 double(双精度)。
- 为什么大量机器人XYZ用 float(单精度 32bit)
- float 有效数字6~7位十进制。
机器人坐标单位一般是 mm(毫米):
float 可以表达: 12345.67 mm ,足够到 0.01mm级别,绝大多数机械臂、移动机器人定位精度需求完全够用。
-
内存小:4字节一个坐标点。XYZ三个数才12字节;如果double要24字节。轨迹点、点云、路径点一多,内存差距会放大。
-
嵌入式运动控制器(MCU、DSP)很多FPU硬件对float运算更快。
-
机器人传感器:IMU、激光雷达、里程计原始数据本身精度就有限,传感器噪声远大于float本身的浮点误差,用double属于"浪费算力"。
例子:AGV小车、六轴工业机械臂、普通协作机器人、SLAM机器人的位姿 (x,y,z,roll,pitch,yaw) ,很多都是float。
- 什么时候XYZ坐标必须用 double(双精度)
满足下面任意一种场景,选double:
- 大尺度空间:比如大型龙门机床、大型测绘机器人,工作空间几十米、上百米。
单位米,距离很大时,float的有效位数会不够,误差被放大。
float 7位有效数字:100米尺度,最小分辨大概0.01米;想要微米级就不够。
-
高精度加工:CNC、精密机床、激光切割、高精度检测机器人,要求微米级精度。
-
矩阵运算、逆运动学求解:大量矩阵连乘、迭代求解,多次运算误差累积,double可以抑制累积误差。
-
仿真软件(ROS的仿真、Webots、Gazebo、动力学仿真):仿真计算大量迭代,普遍用double。
例子:大型龙门机器人、精密测量机器人、动力学仿真环境 → double。
- 一个非常常见的坑(C语言写机器人代码要注意)
哪怕变量存成 float x,y,z; ,中间计算(矩阵、三角函数、sin/cos)C标准库函数默认是double。
也就是:计算的时候自动提升到double运算,算完再转回float保存。
好处:中间计算精度高;坏处:少量隐式转换开销,一般可以忽略。
- ROS里面的习惯(可以参考)
- ROS1/ROS2 消息: geometry_msgs/Point ,内部是 double x,y,z
✅ 注意:ROS消息定义用double,不是因为必须超高精度,是为了统一接口,兼容所有场景;但你自己写控制器底层算法,可以仍然用float来做实时控制,节省资源。
快速选型口诀
-
小型机械臂、AGV、室内移动机器人,工作范围几米内,精度要求0.01mm级别:float
-
大行程、精密加工、测绘、动力学仿真、矩阵迭代计算多:double