我连续两届参加中国机器人及人工智能大赛自主巡航项目,都拿了国一。第一年其实是国二,第二年才摸到门道。回头想想,关键不在算法多高级,而是系统在真实环境里能不能稳稳跑完。
核心任务与理解
场地里那些任务牌看着简单,光照、角度一变,识别难度差很多。去年决赛有支队伍用了很精深的深度学习模型,现场光照不对,识别率掉到四成以下,基本任务都没走完。
任务分数拆解:
- 语音识别与播报(10 分)
- 三次任务点识别与到达(60 分)
- 终点到达(10 分)
- 技术文档(10 分)
60 分的基础分必须稳稳拿到,后面才有余量冲高分。
ROS 架构调整
第一年我们把所有功能塞进一个节点,调试简直噩梦。第二年改成多节点,感知、规划、控制拆开,用 ROS 消息通信。大概结构:

模块化之后,大家能并行开发,单元测试也好写了。找 bug 的效率至少提升了十倍。
激光数据预处理
激光雷达在反光、遮挡时经常出野值。下面这个过滤函数帮我们扛住了很多异常:
// 激光雷达数据异常处理函数
sensor_msgs::LaserScan filterScan(const sensor_msgs::LaserScan& scan) {
sensor_msgs::LaserScan filtered = scan;
// 1. 剔除无效值
for (size_t i = 0; i < scan.ranges.size(); i++) {
if (scan.ranges[i] < scan.range_min || scan.ranges[i] > scan.range_max || !std::isfinite(scan.ranges[i])) {
filtered.ranges[i] = scan.range_max; // 将无效值设为最大值
}
}
// 2. 中值滤波 (三点滑动窗口)
for (size_t i = 1; i < filtered.ranges.size() - 1; i++) {
std::vector<float> window = { filtered.ranges[i-1], filtered.ranges[i], filtered.ranges[i+1] };
std::sort(window.begin(), window.end());
filtered.ranges[i] = window[1];
}
( i = ; i < filtered.ranges.(); i++) {
diff = std::(filtered.ranges[i] - filtered.ranges[i]);
(diff > && filtered.ranges[i] > ) {
filtered.ranges[i] = filtered.ranges[i];
}
}
filtered;
}


