Jetson 01 JupyterLab 基础和机器人介绍
来自Waveshare Wiki
机器人基础信息介绍
控制架构
本机器人使用了上位机+下位机的架构(大小脑架构),上位机可以为树莓派、Jetson Nano、Orin Nano或其它带有类似40PIN接口的单板电脑,下位机使用ESP32来控制机器人外设、读取传感器信息、电机闭环速度控制(PID控制器)。
上位机与下位机使用 JSON 格式的指令通过串口进行通信,具体的通信内容可以参考下位机的文档,目前作为新手不需要了解那些指令,初期只需要跟随教程文档调用常见的指令或封装好的函数即可。
采用大小脑的架构优势
- Jetson 或其它单板电脑作为上位机处理复杂任务,如视觉信息处理,而ESP32下位机负责控制外设和传感器,这种模块化设计提高了系统的灵活性和可扩展性。
- Jetson 或其它单板电脑专注于高级处理和决策制定,而ESP32负责实时低级任务,如电机控制,这样的分工使得每个组件都可以专注于其擅长的领域。
- 这种架构可以有效分配处理能力和 IO 资源,减轻单一系统的负担,提高整体效率。
- 通过串口使用 JSON 格式进行通信,提高了数据传输的效率和可读性,便于调试和扩展。
- 对于预算有限的创客和爱好者来说,这种架构能够在保持较高性能的同时,降低成本和系统复杂度。
使用 JupyterLab 交互式开发基础教程
JupyterLab是什么?
- 交互式开发环境:JupyterLab 是一个开源的交互式开发环境,它提供了一个易于使用的界面,用于编写代码、运行实验和查看数据。
- 适合数据科学和机器学习:虽然最初设计用于数据科学和机器学习,但它的灵活性和易用性使其成为机器人编程和实验的理想选择。
- 基于网页的工具:作为一个基于浏览器的应用,JupyterLab 不需要复杂的安装过程,用户可以在几乎任何操作系统上使用它。
使用JupyterLab开发的优势
- 易于上手的编程环境:JupyterLab 提供的简洁、直观的用户界面,使得编程和实验对于初学者更加友好。通过交互式笔记本轻松编写和测试代码,适合初学者逐步探索和学习。
- 即时反馈和结果可视化:即时反馈,用户可以立即看到代码更改的效果,这对于调试和学习非常有用。JupyterLab 可以方便地进行数据可视化,帮助理解机器人的行为和性能。
- 支持多种编程语言:JupyterLab 支持 Python 等多种编程语言,为各种技能水平的用户提供灵活性。
- 自定义和扩展功能:JupyterLab 具有的高度可定制性和扩展性,用户可以根据自己的需要添加新功能或工具。
- 跨平台和可访问性:JupyterLab 是基于网页的工具,具有出色的跨平台能力,它可以在不同操作系统上运行,通过浏览器即可访问。
JupyterLab 基础使用方法
- 你可以参考 JupyterLab 的官方文档来学习: https://jupyterlab.readthedocs.io/en/latest/getting_started/overview.html
- 由于我们的交互式教程都是由 Jupter notebooks(.ipynb) 文件来完成的,我们这里会介绍一些基础使用方法。
什么是 Jupyter notebooks(.ipynb) 文档
Jupyter notebooks(.ipynb) 是一种文档,它结合了可直接运行的代码和叙述性文本(Markdown)、方程式(LaTeX)、图片、交互式可视化以及其他丰富的输出内容。
切换文档的主题
- 我们默认的主题是亮色的 Jupyter Dark。
- 你可以根据自己的喜好来切换为暗色的主题:依次点击界面上方的 Settings - Theme - JupyterLab Dark。
COMMAND / EDIT MODE
JupyterLab 有两种工作模式,一种是COMMAND模式,一种是EDIT模式
- COMMAND 模式
当你在 COMMAND 模式下时,你可以快速地进行笔记本的整体操作,比如增加或删除单元格、移动单元格、更改单元格类型等。在这个模式下,单元格边框呈现灰色。你可以通过按 Esc 键进入 COMMAND 模式。
- EDIT 模式
EDIT 模式允许你在单元格中输入或修改代码或文本。在这个模式下,单元格边框为蓝色。你可以通过在选中的单元格中点击或按下 Enter 键来进入 EDIT 模式。
单元格操作
在 JupyterLab 中,你可以执行以下操作:
- 在 COMMAND 模式下,使用方向键的上下来选择单元格。
- 在下方添加单元格:你可以通过点击工具栏的 "+" 按钮或使用快捷键 B(在 COMMAND 模式下)来在当前单元格下方添加新单元格。
- 在上方添加单元格:你可以通过点击工具栏的 "+" 按钮或使用快捷键 A(在 COMMAND 模式下)来在当前单元格下方添加新单元格。
- 删除单元格:使用 D,D(连续两次按 D 键,在 COMMAND 模式下)可以删除当前选中的单元格。
- 复制单元格:(在 COMMAND 模式下)使用快捷键 C。
- 粘贴单元格:(在 COMMAND 模式下)使用快捷键 V。
- 剪切单元格:(在 COMMAND 模式下)使用快捷键 X。
- 撤销:(在 COMMAND 模式下)使用快捷键 Z。
- 重做:(在 COMMAND 模式下)使用快捷键 Shift + Z。
- 将当前单元格转换为代码块:(在 COMMAND 模式下)使用快捷键 Y。
- 将当前单元格转换为Markdown:(在 COMMAND 模式下)使用快捷键 M。
- 切换单元格类型:你可以将单元格设置为代码单元格、Markdown 单元格或原始单元格。这可以通过工具栏的下拉菜单或快捷键 Y(代码单元格)、M(Markdown 单元格)在 COMMAND 模式下进行切换。
- 运行单元格:你可以点击工具栏的 "▶︎" 按钮或使用快捷键 Shift + Enter 来执行当前单元格并自动运行后续单元格。
保存和导出
- 保存 notebook:你可以点击工具栏的 "💾" 按钮或使用快捷键 S(在 COMMAND 模式下)来保存你的 notebook。
- 导出 notebook:JupyterLab 支持将 notebook 导出为多种格式,包括 HTML、PDF、Markdown 等。这可以通过 File > Export Notebook As... 菜单选项来实现。
什么是 JupyterLab 的 Kernel
- JupyterLab 的 Kernel 是一个计算引擎,它执行用户在 notebook 中编写的代码。
- 每个 notebook 都与一个 Kernel 关联,这个 Kernel 可以是不同的编程语言,如 Python、R 或 Julia。Kernel 也能访问资源,比如内存或 CPU。
将Kernel设置为机器人的虚拟环境
- 当你打开后续的 .ipynb 教程文档时,你需要手动选择 notebook 中的 kernel 以便可以正确执行机器人相关的代码块。
- 具体方法如下:点击 notebook 选项卡右上角"⭕"旁边的 Kernel 选项,从下拉菜单中选择 Python 3 (ipykernel)。
Kernel管理
- 启动:当打开一个 Jupyter 笔记本时,相关联的 Kernel 会自动启动,启动后会在文件列表中对应笔记的前方出现一个小绿点。
- 重启:如果 Kernel 崩溃或者需要清除当前会话的状态,可以通过 "Kernel" -> "Restart Kernel..." 选项来重启 Kernel。
- 停止:在 Kernel 正在运行的笔记界面中,通过 "Kernel" -> "Shut Down Kernel" 来停止当前笔记的 Kernel;也可以通过 "Kernel" -> "Shut Down All Kernels" 来停止所有笔记的 Kernel。
- 注意:如果你在某个教程的 Kernel 中调用了摄像头,没有停止该笔记的 Kernel,则会一直占用这个资源,其它教程则不能正常使用,需要停止该教程的 Kernel 之后其它教程才能正常使用。
运行代码块
选择了正确的 kernel 之后,就可以运行 notebook 里面的代码块了。在 JupyterLab 中,代码块是 notebook 的基本组成部分。运行代码块的操作如下:
- 运行单个代码块:选择你想运行的代码块,然后点击工具栏上的 "▶︎" 按钮或使用快捷键 Shift + Enter。这将执行当前代码块并选中下一个代码块。
print("test text in jupyterlab")
- 运行所有代码块:你也可以运行整个 notebook 中的所有代码块。为此,点击工具栏的 Run 菜单,然后选择 Run All Cells。
for i in range(0, 10): print(i)
- 停止代码块运行:如果需要停止正在运行的代码块,可以点击工具栏上的 "■" 按钮。
通过这些基础的操作方法,你可以有效地使用 JupyterLab 来完成各种任务。更多高级功能和详细的使用指南可以在 JupyterLab 的官方文档中找到。
删除代码块输出
- 删除单个代码块输出:选择一个代码块,依次点击上方的 Edit - Clear Cell Output
- 删除全部代码块输出: 依次点击上方的 Edit - Clear Outputs of All Cells
更多高阶内容
- 你可以参考 JupyterLab 的官方文档来学习: https://jupyterlab.readthedocs.io/en/latest/getting_started/overview.html