65.9K
CodeProject 正在变化。 阅读更多。
Home

如果早点使用 ANTS Profiler...

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2007年11月9日

CPOL

5分钟阅读

viewsIcon

226909

一位普林斯顿大学的毕业生讲述了自己参加 Darpa Grand Challenge 比赛的经历,比赛要求无人驾驶汽车在没有人类干预的情况下完成赛道。阅读完整故事,了解他为什么希望早点使用 ANTS Profiler。

这是我们对 The Code Project 赞助商的展示性评测。这些评测旨在为您提供我们认为对开发人员有用且有价值的产品和服务信息。

Screenshot - CIMG1156_small.jpg

如果早点使用 ANTS Profiler... 我们就有机会赢得 200 万美元奖金!

我叫 Bryan Cattle。我毕业于普林斯顿大学电气工程专业,是 DARPA Grand Challenge 团队的成员。DARPA Grand Challenge 项目是由美国政府赞助的一系列比赛,旨在鼓励自动驾驶汽车的研究。无人驾驶汽车尝试在没有人类干预的情况下穿越赛道。最高奖金为 200 万美元。

无人驾驶卡车运行在 10,000 行 C# 代码上

Screenshot - prospect11.jpg

我们参加了 2005 年的大挑战赛,我们的团队一路晋级到拉斯维加斯的全国总决赛。决赛的赛道是在莫哈韦沙漠中一条长达 138 英里的赛道。

我们的汽车使用了一个由我们从头开始编写的、基于事件的异步代码栈。在最低级别,它包括了设备驱动程序和基本功能的低级控制器,例如方向盘位置和 GPS。在此之上是障碍物检测。在进入决赛的团队中,我们是唯一的采用立体视觉而不是扫描激光来检测和测距障碍物的团队。总而言之,我们编写了 10,000 行 C# 代码来驾驶汽车。

障碍物检测代码中的错误

在决赛中,我们行驶了 9 英里后,由于障碍物检测代码中的内存泄漏而失败。实际上,我们的大部分代码是用垃圾回收的 C# 编写的,所以严格来说并不是内存泄漏,但直到两周后我们才发现真正的问题。

在“托管”语言中,这是最接近内存泄漏的状况了。C# 通过跟踪您创建的对象来管理内存。当您的代码不再保留对对象的任何引用时,它就会被自动标记为删除,而无需程序员手动释放内存,就像在 C 或 C++ 中一样。因此,要在 C# 中分配永不释放的内存,您需要以某种方式引用一个您不知道的对象。我们实际的错误发生在障碍物检测代码中。当我们检测到每一帧的障碍物时,我们就会存储检测到的障碍物。当汽车移动时,我们会对我们知道的每个障碍物调用一个更新函数,以更新它们相对于汽车的位置。显然,一旦我们通过了一个障碍物,我们就不需要将其保留在内存中,所以车后 10 英尺的所有东西都会被删除。

或者我们是这么认为的。我们注意到电脑在长时间驾驶后会开始变慢。这个问题很棘手,因为它只在驾驶了 40 分钟到一小时,收集了大量障碍物后才会出现。电脑性能会逐渐下降,直到汽车完全失去响应,通常是油门踩到底,然后就会直接开进灌木丛,直到我们拔掉电源。我们逐行地在纸上检查代码,但无论如何也想不明白问题出在哪里。不可能是障碍物列表的问题:那里明明有删除旧障碍物的代码。在比赛前一晚,我们坐在麦当劳里,仍然不知道为什么电脑会缓慢死亡。因为我们不知道这个问题为什么会在 40 分钟后出现,所以我们决定设置一个计时器。40 分钟后,我们会停车并重启电脑以恢复性能。

比赛当天,我们设置了计时器,汽车顺利地行驶了 9.8 英里。不幸的是,我们的系统看到了并记录了路边能找到的每一棵 tumbleweed 和灌木。与我们在受控测试中看到的障碍物数量相比,看到了更多的障碍物,列表比预期的更快地膨胀,电脑在仅仅 28 分钟内就停止了工作,我们的比赛也因此结束了。

ANTS Profiler 揭示了问题

比赛结束后几周,我们即将迎来假期,所以我们把车留在了拉斯维加斯,两周后回来调查这个问题。我们的一位团队成员下载了 ANTS Profiler 的 14 天试用版,并在我们汽车的导航代码上运行了它。我们分析了内存使用情况,看到了障碍物列表的膨胀。怎么会这样?我们明明调用了“delete”来删除那些旧的障碍物!令我们惊讶的是,仅仅几分钟后我们就意识到,我们检测到的障碍物列表从未被垃圾回收。尽管我们认为我们已经清除了对列表中旧条目的所有引用,但由于这些对象仍然被注册为事件的订阅者,它们从未被删除。

如果早点使用它就好了……

我们添加了一行代码来移除事件订阅,在接下来的三天里,我们成功地在莫哈韦沙漠中驾驶汽车行驶了 300 英里。

ANTS Profiler 帮助我们在几分钟内解决了需要数周才能追踪到的问题。如果我们早点想到它,我们很可能就能完成整个比赛,并有机会赢得最高奖金。

Bryan Cattle,普林斯顿大学 DARPA Grand Challenge 团队成员

有关普林斯顿团队的更多信息,请访问 这里。有关 ANTS Profiler 的更多信息,请访问 Red Gate 网站

© . All rights reserved.