机器人编程教程5使用Git和SD卡副本备份代码

5使用Git和SD卡副本备份代码

在本章中,您将学习到以下内容:

  • 代码是如何破坏或丢失的
  • 策略 1 - 将代码保存在电脑上并上传
  • 策略 2:使用 Git 回溯历史
  • 策略 3 - 制作 SD 卡备份

5.1 代码是如何破坏或丢失的

代码和它的近亲--配置,都需要时间和艰苦的努力。代码需要配置才能运行,例如 Raspberry Pi 操作系统配置、额外软件和必要的数据文件。两者都需要研究和学习,需要设计、制作、测试和调试。

很多糟糕的情况会导致代码丢失。我在经过数周的工作后,在带机器人去参加展会的前一周就遇到过这种情况。那么,您的代码会发生什么情况呢?

5.1.1 SD 卡数据丢失和损坏

SD 卡损坏是指 SD 卡中用来保存代码、Raspberry Pi 操作系统和任何你准备好的东西的数据被破坏。文件无法读取,或者卡无法使用。SD 卡上的信息可能会永久丢失。

如果 Raspberry Pi 意外断电,SD 卡可能会损坏,导致数据丢失。发热的 Pi 会慢慢烘烤 SD卡,损坏它。Pi 上的视觉处理就容易发热。如果Pi通过GPIO引脚或电源发生严重的电气故障,SD 卡也会受损。

5.1.2代码或配置更改

编码意味着尝试。有些会成功,有些则会失败。在这种情况下,你会想回头看看你都改了些什么。

错误的配置也会让机器人失去作用,比如 Pi 无法联网或启动。系统软件包升级可能会出错,导致代码无法工作,或者需要对代码进行大量修改才能重新工作。

这些问题结合在一起可能会造成真正的噩梦。我曾见过代码的修改导致机器人行为失常,并以损坏 SD 卡的方式损坏自身。在一次重要的机器人活动前两周,我一直在更新操作系统的软件包,结果把电源线弄断了,导致 SD 卡损坏,Raspberry Pi 操作系统也随之损坏,重建操作系统的过程非常痛苦。这是一次惨痛的教训。

5.2 策略 1 - 将代码保存在电脑上并上传

通过安全文件传输协议(SFTP),您可以将文件从电脑传输到 Pi。这种策略可以让你在电脑上编写代码,然后上传到 Raspberry Pi。您可以选择自己的编辑器,并安全地拥有多个副本。
编辑代码需要专门设计的软件。针对Python推荐使用Mu、Microsoft VS Code、WingIDE、Geany、Notepad++ 和 PyCharm。

SFTP 使用 SSH 通过网络在 Raspberry Pi 上复制文件。让我们来看看如何操作:

  • 首先,在 PC 上创建一个文件夹,用于存储机器人代码;例如,my_robot_project。

  • 在该文件夹中,用编辑器制作一个测试文件,只需打印一段文字即可。将这段代码放入名为 hello.py 的文件中:


print("Raspberry Pi is alive")

  • 我们将把它复制到机器人上并运行。您可以使用 https://filezilla-project.org 上的 SFTP 工具 FileZilla 进行复制。下载并按照安装说明操作:

  • 插入Raspberry Pi并启动电源。你会发现在右侧面板底部,FileZilla显示"未连接"。
  • 在"Host"框中,键入您在无头设置中为机器人Pi提供的本地主机名,前缀为ftp://;例如,sftp://myrobot.local。
  • 在用户名框中输入pi,在密码框中输入之前设置的密码。
  • 单击 Quickconnect 按钮连接Raspberry Pi。
  • 连接完成后,你会在右侧的远程站点面板中看Raspberry Pi的文件,如图 5.2 所示:

  • 使用左侧的本地站点面板进入你电脑上的代码。

  • 现在单击图左上方突出显示的 hello.py,并将其拖动到右下角面板,将其放到Raspberry Pi上:

  • 你拖动文件时,你会在"已排队文件"部分看到它。由于文件较小,它只会在队列状态中停留一瞬间。你也可以对整个文件夹使用同样的系统。你很快就能在远程站点(Raspberry Pi)看到文件,如图右侧面板所示。

  • 要运行这段代码,请使用 PuTTY 登录 Pi 并尝试执行以下命令:

$ python3 hello.py
Raspberry Pi is alive

这一策略是让代码更安全的良好开端。通过在笔记本电脑/PC 上工作并复制到Pi上,你可以保证除了机器人上的那个副本外,总有一个副本。你还可以在电脑上使用任何你喜欢的代码编辑器,并在错误传到树莓派之前就发现它们。

5.2 策略2:使用Git回溯历史

Git是一种流行的源代码控制形式,是记录代码修改历史的一种方式。你可以回溯修改,查看修改内容,还原旧版本,并在注释日志中记录修改原因。Git 能将代码存储在多个位置,以防硬盘出现故障。Git将代码及其历史存储在仓库(或称 repos)中。在Git中,你可以创建分支,即整套代码的副本,与你的代码并行尝试各种想法,之后再将这些想法合并回主分支。

我将带你开始使用Git,但这部分内容只能让你了解Git的一些皮毛。让我们开始吧:

如果你使用的是Windows或macOS,我建议你使用GitHub应用程序,这样设置会更简单。

  • Git要求你在电脑上使用命令行设置身份:
> git config --global user.name "<Your Name>"
> git config --global user.email <your email address>
  • 要将这个项目置于源代码控制之下,我们需要初始化它并提交第一段代码。请确保您已进入代码文件夹(my_robot_project),然后在计算机命令行中键入以下内容:
> git init .
Initialized empty Git repository in C:/Users/danny/
workspace/my_robot_project/.git/
> git add hello.py
> git commit -m "Adding the starter code"
[master (root-commit) 11cc8dc] Adding the starter code
1 file changed, 1 insertion(+)
create mode 100644 hello.py

"git init ."命令Git将文件夹创建为Git仓库。"git add"将hello.py文件保存在仓库。

  • 现在我们可以用"git log"查看日志了:
> git log
commit 11cc8dc0b880b1dd8302ddda8adf63591bf340fe (HEAD ->
master)
Author: Your Name <[email protected]>
Date: <todays date>
Adding the starter code
  • 现在修改 hello.py 中的代码,将其改成这样:
import socket
print('%s is alive!' % socket.gethostname())

让我们看看这段代码与之前有什么不同:

> git diff hello.py
diff --git a/hello.py b/hello.py
index 3eab0d8..fa3db7c 100644
--- a/hello.py
+++ b/hello.py
@@ -1 +1,2 @@
-print("Raspberry Pi is alive")
+import socket
+print('%s is alive!' % socket.gethostname())

以上是Git显示差异的方式。Git将这些改动理解为去掉了打印行,取而代之的是导入和打印行。我们可以把它添加到Git中,生成一个新版本,然后再用 git log查看两个版本:

> git add hello.py
> git commit -m "Show the robot hostname"
[master 912f4de] Show the robot hostname
1 file changed, 2 insertions(+), 1 deletion(-)
> git log
commit 912f4de3fa866ecc9d2141e855333514d9468151 (HEAD ->
master)
Author: Your Name <[email protected]>
Date: <the time of the next commit>
Show the robot hostname
commit 11cc8dc0b880b1dd8302ddda8adf63591bf340fe (HEAD ->
master)
Author: Your Name <[email protected]>
Date: <todays date>
Adding the starter code

这样你就可以回溯到以前的版本,或只是比较版本,并保护自己免受可能会让你后悔的改动。

现在,我们可以回溯和向前(至少对我们的代码而言),我们可以更自信地进行修改。只要记住频繁提交--尤其是在完成某些工作之后!

5.3 策略3-制作 SD 卡备份

开始之前,请正确关闭 Raspberry Pi,取出 SD 卡并将其放入电脑。这些干净的镜像文件很大,所以不要把它们放到 Git 仓库中。在任何情况下,根据镜像文件的大小不同,这项操作都需要 20-30 分钟。

5.3.1 Windows

Windows上将使用Win32DiskImager。因此,我们的第一步就是安装和设置它。继续:

从https://sourceforge.net/projects/win32diskimager获取安装程序。

在"文件名"方框中将图像命名为myrobot.img。然后单击"打开"按钮确认:

单击"读取"按钮开始复制图像。在读取图像的过程中,你会看到一个进度条和剩余时间估算。图像复制完成后,Win32 Disk Imager会告诉你读取成功,然后你就可以退出软件了:

参考资料

5.3.2 Mac

MacOS有一种制作SD卡和磁盘镜像的内置方法。这就是使用内置的磁盘工具。让我们来看看它是如何工作的:

单击 "查看 "菜单:

现在点击显示所有设备选项。选择包含启动卷的设备:

在菜单栏中,选择文件 | 新映像:

在此菜单下,选择 "从 <您的存储设备> 映像":

磁盘工具将显示一个对话框。设置文件名和位置,并格式化为 DVD/CD 母盘:

磁盘工具为这些文件提供 .cdr 扩展名:

将其重命名为 .iso:

您需要确认是否需要这样做:

现在,你可以在 macOS 上创建SD镜像文件,以便与balenaEtcher 一起使用。

5.3.3 Linux

在Linux下,备份SD卡可以通过命令行dd命令完成。在了解如何操作之前,我们首先需要找到设备的位置。让我们开始吧:

插入卡并键入以下命令查找设备的位置:

$ dmesg

该命令将输出很多内容,但您只对接近末尾的一行感兴趣,该行内容如下:

sd 3:0:0:0: [sdb] Attached SCSI removable disk

卡在方括号[sdb]中,在你的电脑上可能有所不同。SD卡的位置将是/dev/<驱动器位置>,例如/dev/sdb。

请注意正确的位置,因为您可能会破坏SD卡或计算机硬盘中的内容。如果不确定,请勿使用此方法。

确定SD卡位置(如 /dev/sdb 或 /dev/disk1)后,就可以使用 dd 命令启动克隆。该命令可将数据转入或转出驱动器:

$ sudo dd if=/dev/sdb of=~/myrobot.img bs=32M
Password:
474+2 records in
474+2 records out
15931539456 bytes (16 GB, 15 GiB) copied, 4132.13 s, 3.9
MB/s

if参数为输入文件,本例中为SD卡。of参数是输出文件,即克隆卡中的myrobot.img文件。

bs参数是区块大小,因此将其设置为32M,会使操作更快。

你需要输入用户密码才能启动。dd命令会将myrobot.img文件创建为主目录下整个SD卡的克隆文件。dd在完成之前不会有任何输出,然后会显示有关操作的统计信息。

热门相关:恭喜你被逮捕了   买妻种田:山野夫君,强势宠!   拒嫁豪门,前妻太抢手   不科学御兽   大妆