> For the complete documentation index, see [llms.txt](https://freebsd-journal-cn.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://freebsd-journal-cn.bsdcn.org/20200102-freebsd-zai-yan-jiu-zhong/interview-with-trenton-schulz.md).

# Trenton Schulz 专访

FreeBSD 期刊编辑委员会建议，BSD Now 系列中的一些精彩专访可能引起读者兴趣，因为它们反映了采访发生时的技术状态。在此，我们整理并节选了 Allan Jude 与 Benedict Reuschling 在 2019 年 10 月对 Trenton Schulz 的专访。

**BENEDICT REUSCHLING**：我们有一期关于 Trenton Schulz 的特别专访，话题涉及他早期使用 FreeBSD 的经历、机器人操作系统（ROS）、Qt 等。大家好，我是主持人 Benedict Reuschling。

**ALLAN JUDE**：我是 Allan Jude。

**BENEDICT**：Trenton Schulz 将与我们聊聊 FreeBSD 上的 Robot OS。首先欢迎 Trenton 来到节目。能介绍一下自己以及你是如何接触 BSD 的吗？

**TRENTON SCHULZ**：好的，非常感谢 Benedict。我在挪威计算机中心担任研究员。此前我曾是博士生与软件工程师。我接触 BSD 是在上世纪 90 年代末在明尼苏达读本科期间，当时实验室有一个游戏之夜，大家都可以带游戏到实验室电脑上玩。

但房间后排有几个人带来了自己的电脑。他们这样做是为了能访问网络，正把一种奇怪的 DOS 之类的东西装到电脑上——至少在我眼里是这样。于是我问：“你们在干什么？”

他们回答：“我们在装 FreeBSD。”我反问：“什么是 FreeBSD？”他们解释：“是一种操作系统。”

我说：“你是说像 Windows 那种？”他们答：“对，但它是 UNIX，”之类的。我那时已听说过 UNIX，所以有点兴趣。一两周内，我就把自己的电脑搬过去装上了。当时大学里大概有三个人在用 FreeBSD，互相之间频繁提问，或查找邮件列表之类。

我想我装的是 FreeBSD 2.2.5，当然，让软件正常工作本身就很有趣。我记得抱怨过想听音乐时声卡不工作之类的问题。这意味着要升级到 -CURRENT。

\[其中一位] 朋友毫不犹豫地在我的电脑上跑 buildworld，把它升级到 -CURRENT。当然，其他一些东西又不工作了。

我因此学到了一些关于操作系统如何运转的知识。

**ALLAN**：嗯，讲讲你是怎么得到第一份与 BSD 相关的工作的。

**TRENTON**：算是间接相关吧。读计算机科学时，我对在电脑上做图形学感兴趣。既然我用 FreeBSD 与 X Windows System，就想在它上面做图形。我寻找能用的工具包，当时学校教我们 C++ 编程，于是我找到了 Qt 库——为它编程的人称之为“cute”。

我开始独立写一些 Qt 小程序，然后把它们打包在一起，连同我用纯文本写的简历寄给了 Trolltech。当时他们正在招人，我顺利被录用。那时挪威除石油行业外，C++ 程序员相当稀缺。

我到了挪威，在 Trolltech 拿到一台 FreeBSD 机器。当时我在帮忙做 Qt/embedded 移植，它用 frame buffer。当然，我很有兴趣让 Qt/Embedded 在 FreeBSD 上跑起来，但对设备驱动所知甚少，无从下手。

有一个在 X11 上工作的虚拟 frame buffer，仅是一段共享内存，因此你能实际显示内容并同时使用 Qt/embedded 窗口系统与 X。

我记得在奥斯陆的第一个周末，或者说头几天，就在 Trolltech 修 Qt 虚拟 frame buffer 让它在 FreeBSD 上工作。最后发现只是用了一些 Linux 特有的信号量调用，把它们换成 FreeBSD 的对应调用，就同时在 Linux 与 FreeBSD 上工作了。我想那大概是我向 Qt 提交的第一笔代码。

我和一位叫 Brad 的同事共用一间办公室，他也是资深的 FreeBSD 用户。他参与过 Blackbox 窗口管理器，那是 Fluxbox 窗口管理器的前身。

我们是 Trolltech 的两个 FreeBSD 人，使命是确保 Qt 在其他操作系统——或者说其他 UNIX——上多少能跑。

**BENEDICT**：哦，太棒了。

**ALLAN**：你在那儿待了多久？

**TRENTON**：我在 Trolltech 待了——大概七年，直到他们并入诺基亚，然后我又在诺基亚待了一年。那时我已从 FreeBSD 转向 Mac。

\[转向 Mac 是因为] 有时 FreeBSD 上的一切会乱套，然后你得跑这个 portupgrade 工具，尝试重建所有 Ports，确实很烦。当时还没有如今这样的软件包之类的东西。

**ALLAN**：正是如此。

**TRENTON**：我想当时我已愿意让厂商去做这些额外维护工作，好让我能专心编程。Trolltech 雇我是来写 Qt 的，不是来维护我的系统的。

**ALLAN**：是的，某种程度上就是维护一个操作系统对 Qt 的使用等等。

**TRENTON**：于是我转向 Mac 用了一段时间。后来，我完成了一个大项目，觉得自己需要尝试些不同的东西。于是我投身研究，研究本身也自有其趣味。

**ALLAN**：你在做哪方面的研究？

**TRENTON**：我刚刚提交了关于人机交互的博士论文。

**ALLAN**：噢噢。

**TRENTON**：在那里我处理两个不同的方面。一是研究将机器人引入家庭这一想法，以及在这些场景下你会做什么。你需要关注一台带有大量传感器、在家中移动的电脑所带来的隐私问题。

另一个方面回到我在 Trolltech 的 GUI 编程岁月。我对动画技术以及机器人的运动方式如何使其更生动、更有趣感兴趣。我研究了如何使用动画技术驱动机器人，以及这如何影响人与机器人的交互。

**BENEDICT**：这与你使用机器人操作系统的工作有关吗？

**TRENTON**：在某种程度上。对我而言，与 FreeBSD 相关的事情大多像是副业。我刚到奥斯陆大学时，信息学系对操作系统选择相当开放——你可以运行任何想运行的操作系统。如果是 Windows 机器，他们当然会统一管理。但如果你用 Mac 或其他什么，基本享有自由。

我说，好，我去搞一台崭新的 ThinkPad，试试在上面跑 FreeBSD。正好那时新款 MacBook 出了，但它们在可开启性与可维修性方面让我失望。

**BENEDICT**：我懂。

**TRENTON**：以前打开并维修过 Mac，我并不确信那种事不会重演。于是我买了一台 ThinkPad，装上当时称作 TrueOS 的系统，让无线网卡等一切工作起来。

我用了一年左右，对我做的工作没什么问题，然后用虚拟机运行机器人操作系统，或称 ROS。

我想我应该先停下来说清楚 ROS 是什么。

ROS 是一种中间件，能在它构建的网络上的不同节点之间通信。你可以创建发布信息的 topic，例如来自摄像头的画面、传感器读数等。

关键是它可以分布式部署，能在不同电脑上运行；同时它是非常标准化的接口，因此一旦机器人的某个驱动能以良好方式发布信息，你只要把它接到节点上，所有人就都能用。它是开源项目，因此易于获取所有这些软件包。

它是一套相当不错的小型软件包与通信系统，但原本只为 Linux 设计。你可以在 Mac 上用 Homebrew 运行，我想在 Windows 10 上也可以用 Linux 子层运行。但目前 ROS 的发布是跟随 Ubuntu 的。

Ubuntu 发布 LTS 版时，ROS 也发布 LTS 版，并在所有机器人上支持到 Ubuntu 支持期结束。

所以我有这台 FreeBSD 机器，需要开始使用一台使用 ROS 的机器人。我想，我不想为了在虚拟机里直接与这台机器人通信而做这么多网络跳转。于是我想试着移植它。

我下载了源码并开始构建。几乎全部用 C++ 或 Python 编写。\[构建系统] 全部基于 CMake，据我所知大部分已在 FreeBSD Ports 中。只要我能跟着这些脚本走，估计能行。

我推进得相当远——基础通信部分完成了。我想，好，这或许是我能做的事。我可以在一天内完成，因为它就在后台编译，我同时干别的事。

但我意识到我还需要图形组件，它们也是 ROS 的一部分。ROS 还有大量调试工具、数据可视化方式，以及机器人模拟器——因为你不想把糟糕的代码放到机器人上把它弄坏，要先模拟。

我开始想，好吧，我也可以试着移植这些其他程序，做一个桌面版 ROS。这非常困难，因为首先需要构建 OpenCV——一个计算机视觉库。当时 FreeBSD Ports 有版本 2，但 ROS 需要版本 3。

这是一项庞大的工作，同时还需要 Python Qt 绑定，但它没明确说需要哪种。如果你了解 Qt 社区，Python 至少有两种 Qt 绑定。

事情变得一团糟。我花了几天。但后来我意识到，我得先把博士论文搞完，而不是花时间让所有东西编译起来。遗憾的是，我只能咬咬牙装上 Ubuntu 把事做完。

后来我想，我可以再试一次，因为自 2017 年尝试以来情况有变。现在是 2019 年。我看到 OpenCV 3 已进入 Ports。

我们有了现代 Qt 等等，所以我觉得这应该能成。

我还读了 Michael W Lucas 关于 Jail 的书，对如何使用 Jail 有了更深的理解。

我创建了 Jail，复制或下载源码，安装所有依赖，并实际开始编译。当然，我为 ROS 所需的一些构建工具创建了 Ports，并把它们提交到了 Ports 树。

在 Jail 中构建 ROS 非常好。它消除了“你到底需要哪种 Qt 绑定”之类的问题，因为环境是干净的。

**ALLAN**：它不会与你同时为桌面使用的 Qt 版本冲突吗？

**TRENTON**：正是！我很高兴，也奇怪自己为什么没早点这么做。但直接上手 Jail 不容易，你需要读些资料真正理解它们的工作方式。

**ALLAN**：是的，Michael Lucas 在写 Jail 那本书时也发现，他得先写六本其他书。

**TRENTON**：的确！的确。而我读过那另外六本。我想最后要说的是，读完他的书后，我终于成功构建了 CUPS Jail——之前我试过多次都失败了。

**ALLAN**：是的，你可能觉得自己不需要它，但一旦读了，你会发现自己有各种方式可以用它让生活更轻松。

**TRENTON**：是的，回到 ROS 的话题——使用这些 Jail，我得以再次构建基础通信部分。然后我也构建了桌面部分。是的，我得到了一个图形化的 ROS 发行版，可以用基础工具、图形工具、可视化工具等等。

我仍没有模拟器，因为没人移植过。这些模拟器是机器人专用的。如果你没有全部 ROS 组件，单独移植模拟器没多大意义。

模拟器是 Gazebo，是其中最大的一个。但据我所知，有些人正在考虑转向 Unity 或 Unreal 之类。但我认为它们没有 Gazebo 模拟器那样的物理引擎。

然后我想这或许是 EuroBSDcon 的一个好主题。我写了一份摘要，寄给了 EuroBSDcon。

**BENEDICT**：EuroBSDcon 是你参加的第一个 BSD 大会吗？

**TRENTON**：是的。EuroBSDcon 的妙处在于它来到了挪威利勒哈默尔。

那是我的第一个大会，确实非常享受。

**ALLAN**：大会上你最享受的是什么？

**TRENTON**：让我想想。一件我享受的事是第一天的教程，Tom Jones 关于 FreeBSD 硬件 hack 的教程。我自己从未做过很多这类事。我一直与做这些事的人在一起，但从未真正坐下来亲自尝试。

对我来说，能和大家待在一起、聊聊天、了解 BSD 各方面的最新进展，本身就是乐趣。我觉得坐在现场看那些演讲比之后在网上看更有趣，因为你还至少有机会提些问题，否则可能没机会。

我推荐大家去，尤其是如果在你居住的国家举办、又不至于路途太艰难的话，绝对要去。大会办得很好。

**BENEDICT**：换个话题，你从 BSD 起步，中间有一段间断，然后又回来，对刚开始用 BSD 的人，有什么建议或忠告吗？应该做什么，或避免什么？也许有些坑？

**TRENTON**：嗯。我开始用 FreeBSD 时，能与朋友用同样的东西很重要。上世纪 90 年代末的互联网与今天在查找信息方面完全不同。

好处是当时你能获得实时的帮助。我想说一件事是：如果可以和朋友一起入门 BSD，那会很有帮助，因为你们能在探索中互相帮助。

如果让我给一个提示——如果你打算用 ZFS，应该在入门早期就设置 Port zfstools，这样能自动做快照，便于回滚，因为我觉得“哦，回滚到快照就行”说起来容易，但如果你忘了做快照，就麻烦了。

**ALLAN**：是的，除了你可能手动做的快照之外，请每 15 分钟做一个保留 4 小时的快照，再加一个 grandfathering 测试方案。

**TRENTON**：是的，把它设置好，这样你做事时就无所畏惧多了。你不必太担心弄坏东西。然后你也可以用 boot environment。

**ALLAN**：是的，我之前没真正想过，90 年代如果你要把 FreeBSD 装到一台机器上，它很可能是机器上唯一的操作系统。否则你就得折腾双启动之类。但你基本是把整台机器都交给它了；而用虚拟机，你可以完全无风险地启动一台 FreeBSD 机器，不必担心弄坏电脑再去修。

**TRENTON**：没错，没错。我认为那时唯一的约束就是要有足够的磁盘空间来投入。如果你想装很多软件看看效果，得提前规划。但除此之外，真的很好。

我重新开始看 FreeBSD 时，第一件事就是装上 VirtualBox，放一个 FreeBSD 镜像上去，看看它怎么工作，以便心里有数后再真正去做。

**ALLAN**：是的，我们希望有一天能加一个选项，让安装程序说：“哦，我看到你已经装过 FreeBSD 了。也许你弄坏了。要不要做一个全新的安装作为新的 boot environment，但保留所有旧文件让你还能访问，同时让系统能干净启动？”

**TRENTON**：是的！那会很棒。

**BENEDICT**：是的，未来还有许多工作要做。

**ALLAN**：在放你走之前，我还有一个关于 Robot OS 的问题。你刚才谈了一点它的分布式特性。一个机器人会由多台电脑组成吗，还是更多是让许多机器人协同工作？

**TRENTON**：嗯，如果你愿意，两者皆可。基本上，你创建节点，每个节点有特定的 topic。一个机器人可以有许多节点。在我的一个研究项目中，我用了一个 turtle bot，它顶部有一个旋转的 LIDAR（光探测与测距）传感器，用来定位。

它还有轮子用于转向等，这些每一项都是一个 topic，报告机器人速度、转向或运动方式。还有另一个 topic 接收 LIDAR 数据，整个想法是你可以写另一个节点说：哦，我监听 LIDAR 的这些信息，用它来推断地图位置，然后我用另一个节点，它有机器人的规划器，会告诉机器人移动到哪里。

你最终会创建许多不同的节点，大多数节点用 C++、Python 或 Common Lisp 编写。通常它们对你想做的事足够快，只要你不做实时性的事——那是 ROS 2 的目标。

它是个有趣的系统，如今用于许多机器人。但与许多这类东西一样，它非常研究导向，大多数 ROS——至少 ROS 1.0 版本——不考虑安全。它有点像 FTP 模型，你到一个已知端口，然后它给你另一个 UDP 端口用于监听，但你不知道那个 UDP 端口是什么。

如果你有防火墙，他们首先会告诉你：在你和机器人之间建一个 VPN，这样你们才能相互通信。

我相信他们在后续版本中尝试修复了这点，但我记得在大学里这是个问题，因为无线网络通常需要关闭。突然你需要开放所有这些端口，而你直到实际建立连接才知道它们是什么。

**ALLAN**：它们在你尝试连接机器人时随机分配？

**TRENTON**：正是。这工作得不太好。你必须创建一个非常特定、封闭的小网络。但总体而言，我认为大多数机器人应该放在封闭网络上 \[出于安全考虑]。

**ALLAN**：是的，这又回到你做的关于隐私如何应用于机器人的研究。如果机器人用摄像头作为眼睛，记录它所看到的，你如何决定怎么处理这些数据等等？

**TRENTON**：对，还有另一个问题：摄像头图像实际发生了什么？如果摄像头图像只在本地使用，例如它是深度摄像头，只是想测量物体之间的距离，而这一切都只是为了找机器人位置和规划路径，永远不会涉及到互联网，全部本地处理。

这种情况下，隐私问题没那么严重。有一大堆问题需要审视，那是其中之一。

**BENEDICT**：是的，你得给未来的科学家留点事做。他们还在工作……

**TRENTON**：要做的事很多。我上周刚参加一个机器人大会，讨论的其中一点是：有那么多研究问题尚未解决，短期内也解决不了。毫无疑问，未来科学家有大量事情可做。

**BENEDICT**：太好了。

**ALLAN**：Trenton，在我们放你走之前，还有什么想聊的吗？

**TRENTON**：除了非常感谢你们做的这些采访，我想不到别的了。

**ALLAN**：非常感谢你愿意与我们对话。


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://freebsd-journal-cn.bsdcn.org/20200102-freebsd-zai-yan-jiu-zhong/interview-with-trenton-schulz.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
