HCR 实验室机器人研究
Table of Contents
这篇博客记录了我在科罗拉多矿业学院本科期间的机器人之旅,从在 CSCI473 中发现我的热情,经过 2020 年夏季的 CS Field Session 项目,到 2021 年 2 月至 2021 年 9 月在以人为本的机器人实验室(HCR)进行的研究工作。
背景
我于 2018 年秋季学期开始在科罗拉多矿业学院进行本科学习。我的专业是计算机科学,专注于机器人与智能系统。我于 2022 年春季毕业。
我很幸运在早期就找到了我的热情。在高中期间,我花了相当多的时间来弄清自己喜欢什么以及擅长什么。经过一些尝试和错误,我发现我的热情是计算机科学。但也是在这段时间,我发现自己对通过代码构建的热爱非常强烈。
在矿业学院,我有机会在矿业学院的以人为本的机器人实验室(HCR)下与张浩博士合作。我在 2020 年春季通过他的课程“以人为本的机器人”(CSCI473)首次见到张博士,在经历了 COVID 的混乱和课堂工作后,我于 2021 年春季初在他的实验室工作。
以人为本的机器人(CSCI473)课程
矿业学院的以人为本的机器人(CSCI473)是我大学经历中少数几门对我产生深远影响的课程之一。该课程由张浩博士授课。我们整个课程的成绩由三个项目组成,每个项目都提出了一个挑战性的问题,介绍了机器人学的核心概念。这些项目包括:
- 学习机器人操作系统(ROS)
- 机器人墙跟随的强化学习
- 使用基于骨架的表示来理解人类行为的机器人
🧩 学习机器人操作系统(ROS)
这是我们被分配的第一个项目。该项目包括三个任务:
- 设置开发环境
- 了解 Gazebo 模拟器
- 编写 ROS “Hello World”
对于任务 1 和 2,我们只需设置开发环境并遵循 Gazebo 入门教程。包括:
- 设置 ROS Melodic,我在 2011 年的 HP 笔记本上完成,足够使用
- 安装和配置 ROS 与 Gazebo
- 浏览 gazebosim 的教程 和 e-manual 的教程。
另一方面,任务 3 是一个真正的挑战。任务是使用 turtlesim 让乌龟绘制矿业学院的 “M” 标志:
![]() |
![]() |
这个任务虽然听起来简单,但比看起来更困难。这个项目最终让我了解了开环和闭环系统的概念。您可以在 ROS Move Turtle 项目页面了解更多关于此项目和我的解决方案。
🧩 机器人墙跟随的强化学习
这是我们被分配的第二个项目,也是我在大学期间参与的最困难的项目之一。项目描述如下:
在本项目中,学生将设计并实现强化学习算法,以教会自主移动机器人跟随墙壁并避免碰撞。学生将使用 ROS Melodic 中的 Gazebo 仿真来模拟名为 Triton 的全向移动机器人,并使用提供的环境地图。学生将使用机器人上的激光测距仪进行感知和学习,机器人通过转向和速度指令进行控制。学生需要使用 C++ 或 Python 在 ROS Melodic(运行在 Ubuntu 18.04 LTS)上编写此项目的代码(即与项目 1 相同的开发环境)。此外,学生需要使用 LATEX 按照标准 IEEE 机器人会议的格式撰写报告。
对于强化学习算法,我们被指示使用 Q-Learning。我们还使用了课堂提供的 Stingray Gazebo 仿真环境。Stingray 包含 Triton 模型和物理逻辑。我们还提供了一个机器人要跟随的迷宫。总体而言,环境如下所示:
完整的项目描述请查看 csci473-p2.pdf。我从未将我的解决方案发布到 GitHub 或网络上,因为它并不很好且存在严重缺陷。而且在正确的环境中运行代码相当困难且令人烦恼。不过,我有一个提交给课堂的演示视频,展示我的解决方案。您可以在此观看:
🧩 使用基于骨架的表示来理解人类行为的机器人
对于第三个项目,项目描述如下:
在本项目中,学生将实现几种基于骨架的表示(交付物 1),并使用支持向量机(SVM)(交付物 2)来分类使用 Kinect V1 传感器收集的公共活动数据集中的人类行为。此外,学生需要在交付物 3 中使用 LATEX 按照标准 IEEE 机器人会议的格式撰写报告。
这个项目具有挑战性,但不如第二个项目困难。主要目标是使用 Kinect V1 传感器数据,来自 MSR Daily Activity 3D 数据集,以及 支持向量机 来分类某些人类动作/行为。您可以在 使用 LIBSVM 预测人类行为 项目页面了解更多关于此项目和我的解决方案。
CSCI473 结论
CSCI473 是我在 Mines 本科期间所修的最好的课程之一(如果不是的话)。所有这些项目让我学到了很多,并让我拥有一个酷炫的项目目录,可在简历中反映和引用。这也是我第一次感到自己在适合的领域,因为我从不是擅长考试的学生,却在完成项目方面表现出色。也是通过这门课,我认识了张浩博士,他最终帮助我在矿业学院的以人为本的机器人(HCR)实验室获得了研究助理的职位。
CS 实地课程(2020 年夏)
在 2020 年夏季,在完成 CSCI473 并加入 HCR 实验室之间,我在科罗拉多矿业学院的计算机科学本科课程中选修了 CSCI370 或“高级软件工程”。CSCI370 是一门让学生为公司设计、实现和文档化软件相关解决方案的课程。它让学生将课程知识应用于真实的计算机科学问题。您可以在此处了解更多关于该课程的信息。
在课程中,你可以决定要参与的项目/公司。课程提供了每个项目和公司的 PDF 详细信息。最终,我决定参与一家名为 Lunar Outpost 的公司发布的项目,名为“增强月导航的实时轮滑检测和错误校正”。由于名称较长,我们将该项目别名为“轮滑检测”。
问题
Lunar Outpost 是一家试图创建自主月球车的初创公司。在月球上,有大量的月尘,已知会导致大量的轮滑。这并不理想,因为轮滑会导致自主系统失去对真实位置的跟踪。在地球上,这通过使用 GPS 数据来纠正因轮滑导致的偏差来解决。但 GPS 的问题是,它只能通过在轨道上不断绕地球运行的 30+ 颗导航卫星并发送唯一信号来让计算机计算其位置。但在月球上,目前没有 GPS。知道这一点,必须使用除 GPS 之外的其他方法来检测轮滑。项目问题的更详细报告可在此处查看。
团队
这个项目并不简单,因此必须团队合作。团队由五名科罗拉多矿业学院的学生组成:
这个项目并不简单,因此必须团队合作。该团队由 Mehmet Yilmaz(我)、Kane Bruce、Braedon O’Callaghan、Liam Williams 和 Kevin Grant 组成。
该项目要求我们了解一些 ROS、C++、Python、Linux、Raspberry Pi 和 Arduino。我们大多数人都有其中一种或多种技术的经验,但我唯一在 2020 年春季的以人为本的机器人(CSCI473)课程中使用过 ROS。因此,我在早期帮助大家了解 ROS 以及如何进行开发。
挑战
在此项目中有很多挑战。但我们面临的最大挑战是没有真实的机器人进行测试。这是由于 COVID 使一切远程化,阻止我们在 Lunar Outpost 的实验室/建筑中工作。因此,我们必须使用仿真。
Also, we went through some academic research from the WVU导航实验室 to get an idea of how the Wheel Slippage problem could get solved for Lunar Outpost’s use case. Which, for us, as undergraduate sophomores and juniors, was more difficult than we expected.
Another challenge we faced was the amount of time we had to work on this project. CSCI370 is a one month class. But the problem itself is a massive problem that many companies and academics have been trying to solve/perfect for decades. So one month is far from enough time to solve this issue. But, despite all these challenges we pushed through and made sure to deliver.
结论
After working through all the research and development, we determined that it is almost impossible to simulate proper moon physics digitally, so really trying this algorithm in a simulation is no good and not going to yield any meaningful research in wheel slippage detection in space and on the moon. We concluded that setting up a proper test environment using something like sand and real hardware, like a Husky robot, is far more important for this type of research. We did update the wheel slippage detection code to work as a ROS node and it functioned properly and could easily be imported into real hardware for testing. This project allowed me to take a leadership role, educate my peers on ROS development, and gain experience with Python, ROS, and Gazebo while tackling a complex problem I had never encountered before. Most importantly, this experience further solidified my passion for robotics and reinforced my desire to pursue research in the field, setting the stage for what would come next in my robotics journey.
在 HCR 实验室的开始
After completing CSCI473, my CS Field Session in the summer of 2020, and my Fall 2020 semester, I decided to pursue research in robotics. I had such great experiences with both CSCI473 and the CS Field Session that I decided I wanted to do research for the HCR Lab. Since I had met Dr. Zhang the year prior, I decided to email him and ask about any opportunities the lab might have in January 2021. Within about 2 weeks, Dr. Zhang expressed interest, presented me with research options, and offered me a role in the lab. I then started working for the lab in February 2021.
介绍视频
Here’s my introduction video that I recorded a few months into my time in the HCR Lab. It was recorded in May 2021 and covers the research I would focus on in the HCR Lab during the summer of 2021:
我的项目
Throughout my time in the HCR Lab, I mainly focused on the Triton project. The Triton project is a mobile robot developed by the Human Centered Robotics Lab at the Colorado School of Mines. It’s a triangular omni-wheel ground robot powered by NVIDIA’s Jetson Nano.
The Triton, in a simple overview, consisted of the following parts:
- NVIDIA Jetson Nano
- NVIDIA’s Seed Studio A205 Carrier Board
- Arduino Mega
- 64 GB Micro SD Card
- Custom 3D printed body
- 3 mecanum wheels
- 1 AR Battery
- Custom circuits for optimized power distribution and wiring
- Intel’s Realsense D435 Camera
- Some LEDs
It was designed, built, and manufactured around 2018-2020 as a robot for educational purposes. By the time I joined, the Triton was pretty established, and the lab was considering making a new version of it. However, the main issue with the Triton was its software. The Triton could move, charge, and function in a basic sense but did not really do anything intelligent. It even lacked the ability to make more advanced movements.
![]() |
![]() |
![]() |
![]() |
To start addressing this, the lab set up an area where we could keep track of the Triton. To do this, they created a 2-meter by 2-meter area with 8 Optitrack Flex (Infrared Red) Cameras in a square-like shape about 6-7 feet above the floor.
![]() |
![]() |
Along with having this area built, each Triton had three gray sphere balls attached at the top of their bodies.
With this setup, we had effectively built our own small-scale GPS system that allowed us to get the exact coordinates in meters of a Triton in our area of interest. By using the Optitrack infrared cameras and the Optitrack gray spheres in a triangular shape, we could pinpoint the exact coordinates of a Triton in our area. This allowed us to apply a closed-loop system for better accuracy in movement.
The Optitrack system provided position and orientation data at about 120Hz with sub-millimeter accuracy when properly calibrated. Each Triton’s three reflective markers formed a unique triangular pattern that the system could track as a rigid body. The coordinate system was calibrated so that (0,0) was at the center of the tracking area, with X and Y axes aligned to the room’s geometry. But despite this precise positioning data, the Triton still struggled with movement.
With this setup, one core feature we wanted to provide the Triton was the ability to move to a specific coordinate. The user, or their software, could provide a (x, y) coordinate within their area of interest. Then the robot would move to that coordinate as fast, accurately, and seamlessly as possible. When I joined, this feature existed but it wasn’t working very well. Here is a simple animation showing how the original moving logic worked:
I did not record the original solution in action, so I created this simple animation showing you the old moving logic in action. Knowing this, what are the issues with this method?
- It’s really slow
- It makes the robot take up a lot of space just to go to a specific point. This made it difficult for us to use this solution when multiple Tritons were moving around.
So why was this behavior happening? The issue was that the Triton first turned, changing its alpha, until it pointed toward the target point within a specific margin of error. Then it would sprint forward, and after its theta was off from the target by a specific amount, it would stop and start turning again until the alpha was within that acceptable range for the target goal. Then it sprints again and keeps doing this until it gets to the point. Also, as it got closer and closer to the goal point, the turning and sprinting speed would get much slower to make sure it didn’t overshoot. This resulted in the Triton having unnatural movement, taking forever to get to a target point, and requiring so much area just to get to a specific target point. So with all of these issues, and given how essential this feature was for the development of the Triton project, when I started working at the HCR Lab, my first task was to develop more effective solutions that would allow the Triton to better navigate to a goal point.
Knowing this, I spent a lot of time doing research on the best possible way of addressing this problem. Ironically, I was taking a class called Introduction to Feedback Control Systems (EENG307) at Mines. Early in that class, we learned about the concept of Open-loop controllers and Closed-loop controllers. Knowing this, and after some discussion I had with the professor of that class and my smart roommate, it became clear that this goal of getting the Triton to a goal point was a closed-loop system problem.
Now, after extensive testing and research, I developed two distinct controller approaches for the Tritons:
方法 1:距离-角度控制器
This approach used two separate proportional controllers running simultaneously:
- Distance Controller: 计算到目标的欧氏距离,并应用比例增益来确定前后速度
- Theta Controller: 计算机器人当前朝向与目标方向之间的角度误差,使用单独的比例增益来控制旋转速度
The algorithm continuously calculated the Euclidean distance to the target and the angular error between the robot’s current heading and the desired direction. Two separate proportional gains were applied to generate linear and angular velocities respectively.
This resulted in the Triton naturally turning toward the goal while simultaneously moving forward, creating smooth curved paths. The key advantage was that the robot always kept its front face oriented toward the destination, which was crucial for camera-based applications.
方法 2:X-Y 坐标控制器
This approach treated the robot like a 2D plotter, with independent control of X and Y movement:
- X Controller: 基于X坐标误差直接控制东西方向的移动
- Y Controller: 基于Y坐标误差直接控制南北方向的移动
实现独立计算 X 和 Y 坐标误差,分别应用比例增益,然后使用旋转矩阵将这些全局速度分量转换到机器人本地坐标系中。之所以需要此转换,是因为机器人全向轮驱动需要在其自身参考框架内的速度,而不是全局坐标。此方法产生了最直接的目标路径,并且显著更快,但由于没有显式的方向控制,机器人航向会漂移。
对于方法 #1,我在我的 Move Turtle (TurtleSim) 博客 中详细介绍了此方法。强烈建议阅读此博客,以了解 PID 控制器的一般工作原理以及方法 #1 的实现细节。我使用 ROS 的 TurtleSim 开发了方法 #1,然后将代码迁移到 Triton 并更新以适应更真实的环境。
方法 #2 使用了完全不同但同样有效的方法。该方法不考虑机器人朝向和与目标的距离,而是将运动视为坐标平面问题。控制器持续分别计算 X 和 Y 方向的误差。例如,若机器人需要从 (0,0) 移动到 (2,3),则视为需要纠正 X 方向的 2 米误差和 Y 方向的 3 米误差。两个比例控制器同时工作:一个根据 X 误差调整机器人在 X 方向的速度,另一个根据 Y 误差处理 Y 方向的运动。这样产生了更直接的目标路径,类似于 3D 打印机的移动,并允许平滑的对角线运动。机器人无需显式转向目标,使得该方法在狭小空间或需要精确定位时特别有效。
两种方法都比原始方法显著更快、更可靠。要查看这些新方法的实际效果,请查看 Tritons in Action 播放列表,其中展示了使用新方法的所有 Triton 的实际运行。
原本需要 30-45 秒完成的简单点对点移动现在只需约 8-12 秒。更重要的是,Triton 现在能够在狭小空间中更高效地导航,这在我们的多机器人场景中非常有用。
Development Challenges and Debugging
实现这些控制器并非易事,涉及多个重要的调试挑战:
Coordinate System Transformations:最棘手的方面之一是正确进行坐标转换。Optitrack 系统提供其自身坐标框架的数据,机器人有其本地坐标框架,我需要在它们之间准确转换。早期实现中机器人朝错误方向移动,因为我混淆了旋转矩阵的计算。
Real-World vs. Ideal Behavior:最大挑战是考虑现实世界中不出现在教材控制理论中的因素。机器人轮子具有不同的摩擦特性,电机响应不一致,且从 Optitrack 到控制软件再到机器人 Arduino 的通信链路总有一定延迟。我花了数周时间调节比例增益并添加死区滤波器,以适应这些物理现实。
Oscillation and Stability Issues:我的首次实现出现了振荡问题,机器人会超出目标并来回摆动。这让我认识到 PID 控制器中微分项的重要性以及正确增益调节的必要性。最终,我主要采用比例控制并精细调节增益,而不是完整的 PID,因为系统的固有阻尼足以满足大多数应用。
Multi-Robot Interference:当多个机器人同时运行时,我发现了意外的干扰模式。机器人有时会“争夺”同一空间或产生死锁,导致它们无限期地相互阻挡。这促使我实现了协调机制和避碰算法。
Multi-Triton Control System
一旦解决了单个 Triton 的运动问题,实验室的下一个挑战是让多个 Triton 同时协同工作。这成为我的主要关注点之一,并成为项目的重要贡献。
原始系统只能一次控制一个 Triton,极大限制了研究可能性。实验室希望模拟多个自主车辆需要协同移动的场景,例如自动驾驶汽车相互通信以优化交通流并创建更好的 SLAM(同步定位与建图)地图。
为此,我使用 Python 的 multiprocessing 库实现了多进程方法。每个 Triton 都拥有自己的专用进程,能够独立运行,同时仍由中心控制系统协调。这使得多个 Triton 能够同时移动而不干扰彼此的控制循环。
Multi-Robot Architecture Design
我开发的系统架构包括以下关键组件:
Main Controller Process:作为中心协调者,处理用户界面交互、路径规划以及机器人之间的高层协调。它维护全局状态并向各个机器人进程分发指令。
Individual Robot Processes:每个 Triton 拥有自己的 Python 进程,负责:
- 约 50Hz 的实时 PID 控制计算
- 与机器人硬件(Arduino/Jetson)的通信
- 本地路径执行和避障
- 向主控制器报告状态
Shared Memory Communication:使用 Python 的 multiprocessing.shared_memory 和 Queue 对象实现高效的进程间通信。这样可以在不使用网络通信的情况下实现实时协同。
Synchronization Mechanisms:为防止多个机器人需要协同(如避免碰撞)时产生冲突,我实现了信号量和锁,允许机器人请求对工作空间特定区域的独占访问。
挑战在于确保所有机器人能够独立运行其控制循环,同时保持全局协同。每个机器人进程自行进行 PID 计算并直接向硬件发送电机指令,而主进程负责更高层次的协同,如避碰和路径规划。
![]() |
![]() |
多Triton 系统打开了全新的研究可能性。我们现在可以模拟:
- 车与车之间的通信场景
- 带有避障的协同路径规划
- 群体机器人行为
- 多代理 SLAM 映射
- 编队控制和跟随行为
以下是多个 Triton 同时运行时实验室的设置:
![]() |
![]() |
我还开发了一个用户友好的界面,允许研究人员为每个 Triton 可视化地定义路径。您可以直接绘制每个机器人要跟随的路径,它们会以完美的协同执行这些路径。这在无需手动编写每个动作的情况下,设置复杂实验非常有用。
该系统可同时处理最多 5 台 Triton,每个都运行自己的 PID 控制器,并通过中心控制系统进行协同。性能令人印象深刻,所有机器人在保持各自精度的同时,作为团队一起工作。
以下播放列表展示了 Triton 的实际运行,从单机器人控制到多机器人协同:Tritons in Action 播放列表
Depth Sensor Integration and Coordinate Correction
另一个我所做的重大进展是利用安装在每个 Triton 上的 Intel RealSense D435 深度摄像头。虽然 Optitrack 系统提供了极其精确的定位数据,但我想探索机器人如何利用其 onboard 传感器提升空间感知并纠正坐标误差。
想法是 Triton 可以使用深度传感器检测附近的其他 Triton 并交叉验证它们的位置。这将实现多种目的:
-
Error Correction:如果 Optitrack 系统出现校准漂移或临时遮挡,机器人可以通过视觉确认彼此的位置来保持准确的坐标系统。
-
Enhanced SLAM:通过多机器人协同使用深度传感器,我们可以创建更丰富的环境地图,拥有冗余的数据点。
-
Collision Avoidance:实时深度感知可以让机器人在即使中心控制系统出现通信延迟时,也能检测并避免彼此碰撞。
- 使用其独特的三角形外观和反射球标记检测其他 Triton
- 使用深度数据计算相对位置和方向
- 将这些测量值与 Optitrack 数据进行比较,以识别差异
- 可能实时调整其坐标系统以保持精度
计算机视觉实验
我花了大量时间实验一个分阶段工作的计算机视觉管道:
![]() |
![]() |
![]() |
![]() |
![]() |
深度数据处理:Intel RealSense D435 提供了 RGB 和深度数据流。我主要处理深度数据,它以 30Hz 的 640x480 距离测量数组形式提供。首要挑战是过滤这些噪声深度数据以提取有意义的几何信息。
对象检测尝试:我尝试了多阶段检测算法。我在分割深度图像以识别地面层的对象(过滤掉墙壁、天花板等)并寻找具有约 0.3x0.3 米足迹的合适尺寸特征的对象方面取得了一些成功。我尝试使用边缘检测和几何分析来识别独特的 Triton 轮廓,结果喜忧参半。
标记识别实验:每个 Triton 上的三个反射球似乎是最有前景的检测特征。我尝试使用斑点检测算法来识别深度图像中三个亮点的三角形特征。我在受控光照条件下取得了一些有希望的结果,尽管其可靠性不稳定。
坐标融合研究:我研究了将基于视觉的位置估计与 Optitrack 数据融合的方法,包括基本的卡尔曼滤波实现。概念是当 Optitrack 数据可用时给予更高权重,但在需要时回退到视觉,尽管在我离开实验室前未能完全实现。
性能挑战:让所有这些处理在机器人控制循环的实时运行中变得困难。我尝试了优化方法,使算法在约 10-15Hz 运行而不超负荷 Jetson Nano 的处理能力。
不幸的是,我在完成这项计算机视觉工作之前就离开了实验室。虽然我取得了一些有前景的早期结果并学到了很多关于深度传感器处理的知识,但我未能将系统实现为完全可靠的状态。这仍然是一个有趣的研究方向,其他人可能会在此基础上进一步构建。
以下是我测试计算机视觉算法的视频:
以下是我实验期间深度传感器视图的样子:
虽然我未完成深度传感器集成工作,但该概念在诸如模拟自动驾驶汽车场景等应用中显示出潜力,在这些场景中,车辆需要相互了解而不完全依赖外部基础设施。我开始探索的研究方向可能对实验室的未来工作有所贡献。
文档与知识保存
我对 HCR 实验室最重要的贡献之一,也许是我最自豪的,是组织和保存所有项目文档。当我加入实验室时,Triton 项目的知识分散在多个平台和格式中。关键信息分散在:
- 属于已毕业的不同学生的多个 Google Drive 账户
- 收件箱中埋藏的旧邮件
- 随机的 Dropbox 文件夹
- 多个 GitHub 仓库
- 组织不一致的 GitLab 仓库
- 只有特定人员能解释的手写笔记
这种碎片化的文档是一个巨大的问题。新学生花费数周时间仅仅是想弄清楚如何开始,而当人们毕业或离开实验室时,宝贵的知识不断丢失。
我主动系统地解决这个问题。我花费了无数时间追踪与 Triton 项目相关的每一份文档、代码、视频和笔记。随后,我将所有内容组织到一个集中式 GitLab 仓库中,结构清晰、逻辑明确。
![]() |
![]() |
集中式文档包括:
- 构建指南:从零开始组装 Triton 的逐步说明
- 软件设置:完整的开发环境设置指南
- 代码文档:带有清晰解释的注释代码
- 硬件规格:详细的零件清单、接线图和 PCB 设计
- 故障排除指南:常见问题及其解决方案
- 视频教程:我创建并上传了教学视频到 YouTube,包括详细的 Optitrack 校准教程:
我还制定了文档标准,以确保未来的贡献能够组织有序且易于访问。我创建的仓库结构成为实验室后续所有工作的基础。
除了组织现有文档,我还创建了多个原创指南和教程,填补了知识库中的关键空白。这些包括为新实验室成员提供的详细设置说明、全面的故障排除指南以及复杂流程的演示视频。
影响立竿见影且持久。新学生可以在几天而不是几周内快速上手。我创建的文档仓库在我离开多年后仍被实验室使用。它成为 Triton 项目的唯一真相来源,为未来的研究者节省了无数小时/天的时间。
指导与知识转移
在 HCR 实验室期间,我最有价值的经历之一是有机会指导他人并分享我获得的知识。随着我的工作进展并对 Triton 系统的经验增加,我承担了越来越多的培训新团队成员的责任。
指导实验室继任者
当我准备最终离开实验室专注于完成学位和在 eBay 的工作时,我确保彻底培训两位在我离职后接手 Triton 项目的人。这不仅仅是向他们展示工作原理,更是确保他们真正理解底层原理,以便继续创新。
我花了数周时间与他们密切合作,内容包括:
- PID 控制系统的数学基础
- 协调多个机器人时的多进程架构
- 深度传感器集成和计算机视觉算法
- 文档系统及其维护方式
- 调试技术和常见故障模式
知识转移非常彻底。我们一起进行真实的调试会,我让他们修改和扩展现有代码,并确保他们能够独立从零设置新的 Triton。
高中生指导项目
甚至更有价值的是,我通过实验室的外展项目指导了一名高中学生。这是一个在他们教育的关键阶段向他们介绍机器人、计算机科学和研究的绝佳机会。
我设计了一个涵盖以下内容的综合课程:
计算机科学基础:
- 使用 Python 作为主要语言的编程概念
- 面向对象编程简介
- 对算法和数据结构的理解
机器人概念:
- 传感器的工作原理以及如何与其交互
- 执行器控制和电机系统
- 自主系统和反馈控制的基础
ROS(机器人操作系统):
- 理解发布/订阅消息系统
- 创建节点和服务
- 使用 launch 文件和参数服务器
实践项目工作:
- 我们合作创建了一个 ROS 服务,控制 Triton 头部的 LED 系统
- 她学会编写干净、文档化的代码,集成到我们现有系统中
- 她创建的 LED 控制服务成为 Triton 代码库的永久部分
这次指导特别之处在于看到她从几乎不了解编程到为活跃的研究项目贡献有意义的代码的过程。她从问“变量是什么?”到独立调试 ROS 通信问题并编写自己的服务实现。
她开发的 LED 控制系统使研究人员能够通过简单的 ROS 命令轻松更改 Triton 头部 LED 的颜色和模式。听起来简单,但需要了解 ROS 架构、硬件接口和正确的软件设计模式。她的贡献至今仍在实验室使用。
这次指导对我和她一样都是教育性的。它迫使我把复杂概念拆解成易于理解的部分,并思考我们所做工作的基础。教别人让我成为更好的工程师和研究者。
与博士研究的合作
我在实验室期间最具职业回报的方面之一是与 Peng 合作,他是一名博士生,研究重点是自动驾驶汽车算法。我对 Triton 系统所做的软件改进帮助支持了他的博士研究。
Peng 的研究需要精确、可靠的多机器人协作来模拟自动驾驶汽车场景。在我对运动控制和多机器人系统进行改进之前,这些实验进行起来要困难得多。机器人速度更慢,精度更低,且无法有效协同工作。
我的贡献在多个方面帮助了 Peng 的研究:
交叉口管理研究: 通过改进的 PID 控制器和多机器人协作,Peng 能够模拟多个“车辆”(Tritons)需要协调其运动的交叉口场景。更好的时机和定位使这些研究更具可行性。
车与车之间的通信: 我开发的多进程框架使 Peng 能够实现并测试模拟车辆之间的通信协议。每个 Triton 都可以在仍然与其他机器人协同的情况下做出决策,类似于自动驾驶汽车可能需要的操作方式。
SLAM 与地图绘制研究: 深度传感器集成工作为 Peng 的同步定位与地图绘制研究提供了额外的数据。拥有多个具备协同感知能力的机器人,使得更全面的地图绘制实验成为可能。
我们的合作之所以特别有价值,是因为这不仅仅是我帮助他的研究,而是一种真正的合作伙伴关系。Peng 对自动驾驶车辆理论方面的理解帮助我完善了实际实现。他的反馈和需求推动我使系统更加稳健和强大。
我们在实验室里一起花了很多时间,调试场景,讨论不同的控制策略,探索 Triton 平台能够实现的功能。Peng 成为我的同事和朋友,与他合作让我学到了很多关于学术研究实际运作的知识。
我构建的系统成为 Peng 论文工作的重要组成部分。看到我的实际工程贡献支持了自动驾驶技术的研究,令人非常满足。这强化了我对坚实工程与研究相结合、产生有用成果的兴趣。
即使我离开实验室后,Peng 和我仍保持联系。知道我的工作在离开后仍继续为重要研究做出贡献,极具成就感。
视角:LLM 之前的开发时代
值得注意的是,所有这些工作都是在 LLM 之前的软件开发时代完成的。所有这些都发生在 2020 年至 2021 年之间(主要是 2021 年),在 ChatGPT、Claude、Perplexity 或像 Cursor IDE 之类的 AI 驱动开发工具出现之前。
每一行代码都是从头编写的,每个算法都是通过学术论文和教材进行研究的,每一次调试都使用传统方法,如打印语句、调试器和系统化的测试。当我在坐标变换或 PID 调参问题上卡住时,我不能像现在一样向 AI 助手询问概念或帮助调试。
这使得开发过程更具挑战性,但也更具教育意义。我必须:
手动研究所有内容:理解 PID 控制理论需要阅读教材和学术论文。弄清坐标变换需要手工推导数学。每个概念在实现前都必须完全理解。
在没有 AI 帮助的情况下调试:当机器人朝意外方向移动或在目标周围振荡时,我必须系统地追踪逻辑,添加调试输出,一次一个假设地进行测试。没有 AI 来建议潜在问题或帮助解释错误模式。
从第一原理学习:没有办法快速询问“如何在 Python 中实现机器人多进程?”我必须深入理解底层概念。这迫使我在并发编程、控制系统和计算机视觉方面打下坚实基础。
文档至关重要:由于不能依赖 AI 以后解释代码,我必须编写极其清晰的文档和注释。这种纪律在向他人传递知识时极其宝贵。
回顾过去,虽然现代 AI 工具会加速许多开发环节,但在没有它们的情况下工作迫使我培养更深层次的问题解决能力和对底层系统的更深入理解。想象如果今天的开发工具可用,这个项目会有多么不同,令人感慨。
离开的艰难决定
尽管我非常热爱在 HCR 实验室的工作,但到 2021 年底,我面临了许多学生都会遇到的艰难决定:平衡多种机会和责任。我同时在 eBay 担任全职软件工程师,完成 Mines 的计算机科学学位,并在 HCR 实验室进行研究。
eBay 的机会很重要;它是我的第一个重要软件工程岗位,提供了宝贵的行业经验和稳定的收入。然而,维持全职工作、完成学位并在研究中做出有意义的贡献是不可持续的。必须做出取舍。
当我向张博士提出可能减少课程负担以更专注于实验室工作时,他强烈建议不要这样做。他的理由很合理:完成学位应是首要任务,eBay 的行业经验对我的职业发展有价值。他认为,虽然放弃课程以专注研究很诱人,但从长远来看可能不是最佳决定。
于是,在 2021 年 9 月,在实验室进行约 8 个月的密集工作后,我做出了艰难决定:退出研究助理角色,专注于完成学位和在 eBay 的工作。这是当时我做出的最艰难的职业决定之一。
即使正式离开实验室后,我仍继续提供支持,帮助任何需要系统帮助的人。我根据需要更新文档,回答调试问题,并远程帮助排除故障。我所建立的联系和对项目成功的投入并没有因为不再正式加入团队而消失。
反思与回顾
现在,2025 年,四年后,我对那段时光有着复杂的情感。我的职业道路深入到 Web 开发和 AI/ML 工程,这些领域极具回报,提供了巨大的成长和影响机会。
然而,我仍然会想“如果”。机器人技术是我的真正热情,甚至现在仍然如此。与物理系统一起工作,看到代码转化为真实的运动和行为,这种体验是 Web 开发甚至 AI 工作所无法完全复制的。
我有时会想,如果我走了不同的道路会怎样。若我在完成本科学位后立即继续研究生学习?若我选择优先实验室工作而不是行业经验?
但我也认识到每条道路都有其取舍。我在 Web 开发和 AI 方面的技能非常有价值。行业经验让我了解大规模软件工程、用户体验设计以及构建数百万用户使用的产品的实际挑战。这些经历让我成为更好的工程师。
在 HCR 实验室的工作仍然影响着我今天的思考方式。PID 控制系统所需的系统化思维体现在我设计软件系统反馈循环的方式上。文档和知识管理的技能在每个角色中都极其重要。指导和教学的经验塑造了我与初级开发者合作和分享团队知识的方式。
最重要的是,这段经历让我明白,我在解决具有实际影响的技术难题时最有活力。无论是优化机器人运动算法,还是构建帮助用户实现目标的 AI 系统,满足感来自于解决重要的难题。
持久的影响
回顾 HCR 实验室的经历,我惊讶于在相对短的时间内完成了多少工作。我构建的系统根本改变了 Triton 平台的运作方式,许多改进至今仍在使用。我创建的文档库成为整个项目的知识库。我建立的导师关系对同事产生了持久影响。
但也许最重要的是,这段经历让我看到自己在热爱的问题上能做到的事情。在那八个月里,我:
- 改进了限制平台的机器人运动控制系统
- 从零构建了多机器人协作系统
- 集成了计算机视觉和传感器融合功能
- 创建了完整的文档和知识管理系统
- 指导了多位同事并帮助知识转移
- 支持了自动驾驶车辆的博士级研究
这些成就展示了我在热情驱动的项目中所能达到的高度。
这不仅仅是关于技术成就,尽管那些对我而言意义重大。它是关于学习,只要坚持和系统性思考,即使作为本科生,你也能做出有价值的贡献。
未来与机器人
虽然我的职业生涯已经走向了其他方向,但我对机器人技术的热情并未减弱。我仍然关注该领域的发展,对机器人学习和自主系统的进步感到兴奋,并且偶尔在空闲时间进行个人机器人项目的工作。
谁知道未来会怎样?我在人工智能和机器学习方面培养的技能与机器人技术的关联日益增强。我所获得的行业经验教会了我如何构建稳健、可扩展的系统。也许未来会有一种情况,这些不同的经验线索会以意想不到的方式汇聚在一起。
目前,我对在 HCR Lab 度过的时光以及它提供的经历心怀感激。那是一个塑造我技术技能和对最有成就感的工作类型理解的关键时期。虽然我有时会想念它,但我知道我所学到的教训和所形成的方法仍然影响着我的一切行动。
机器人仍然在那里,仍在为研究人员服务,仍在推动重要工作。这真是相当美好。