机器人编程教程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 <your@email.com>
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 <your@email.com>
Date: <the time of the next commit>
Show the robot hostname
commit 11cc8dc0b880b1dd8302ddda8adf63591bf340fe (HEAD ->
master)
Author: Your Name <your@email.com>
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会告诉你读取成功,然后你就可以退出软件了:
参考资料
- 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
- 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
- python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
- Linux精品书籍下载 https://www.cnblogs.com/testing-/p/17438558.html
- Raspberry Pi(树莓派4B)4轻松入门(上)-安装 https://www.cnblogs.com/testing-/p/17604049.html
- Raspberry Pi 基金会安装 Raspberry Pi 操作系统指南:https://www.raspberrypi.org/documentation/installation/installing-images/README.md。
- 《Raspberry Pi By Example》,Ashwin Pajankar和Arush Kakkar,Packt Publishing,其中有一节介绍Raspberry Pi的替代操作系统,以及许多令人兴奋的 Raspberry Pi项目。
- Raspberry Pi GPIO 引脚输出 (https://pinout.xyz/): 它介绍了不同电路板与Raspberry Pi的实际引脚连接方式。
- GitHub 上的《Git 手册》:https://guides.github.com/introduction/git-handbook/。该文档全面介绍了 Git 是什么、它能解决什么问题,以及使用其功能的起点。
- 手把手教你使用 Git 进行版本控制:https://www.packtpub.com/application-development/hands-version-control-git-video。这是一个关于如何使用Git的视频教程。
- GitHub 指南:https://guides.github.com/。一系列关于如何充分利用Git和GitHub的指南。
- GitLab基础:https://docs.gitlab.com/ee/gitlab-basics/。GitLab是GitHub的绝佳替代品,拥有庞大的社区和一些出色的Git使用指南。
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在完成之前不会有任何输出,然后会显示有关操作的统计信息。