Published on

树莓派折腾日记

Authors

树莓派折腾日记

搞了台树莓派3b+来玩玩linux

1. 硬件结构(以pi3为例)

image

2. 修改root密码

sudo passwd

3. 连接网络

先找到无线网卡的名字

ls /sys/class/net

输出的名字中wl开头的就是无线网卡,en开头的是有线网卡

然后编辑配置文件

$ cd /etc/netplan/
$ ls
50-cloud-init.yaml
$ sudo vim /etc/netplan/50-cloud-init.yaml

添加以下内容:

wifis:
  wlan0:
    dhcp4: true
    access-points:
      "你的wifi名称":
        password: "你的密码"

其中 wlan0 为无线网卡名称,dhcp4 表示开启自动IP地址分配,在 access-points 下可以设置多组 ssid(即通常所说的“Wi-Fi名称”)与密码。

更新后,配置文件内容大致如下,ethernets是以太网卡:

network:
  version: 2
  renderer: NetworkManager
  
  ethernets:
    eth0:
      dhcp4: true
      optional: true
      
  wifis:
    wlan0:
      dhcp4: true
      access-points:
        "wifi_name1":
          password: "mypassword"
        "666":
          password: "66666666"

检查配置文件

sudo netplan try  # 检查配置文件中是否有语法错误、尝试用新的配置

应用配置文件

sudo netplan generate  # 生成 renderers 所需的配置文件
sudo netplan apply  # 应用 netplan 新配置,将自动重启 network-manager 使修改生效
附录a:网卡设备名称简析

在使用 ifconfig -aip a 列出本机所有网卡设备名称时,可能看到若干名称,其含义简单分析如下:

  • lo 表示 local
  • en 表示 ethernet 以太网
  • wl 表示 wlan,即 Wireless Local Area Network 无线局域网
  • 后面的 p2s0 等表示 PCIe 接口的物理位置(bus, slot),总线与插槽

例如, wlp4s0 表示一张位于 PCIe 总线4 插槽0 的无线网卡。

附录b:树莓派连接无线网络

在使用新安装 Ubuntu Server 系统的树莓派时,可能遇到手头没有显示器、也没有有线网络连接的情况。这时本可以通过电脑 SSH 连接至树莓派进行远程开发,但前提是树莓派必须已经接入无线局域网络;而为了让树莓派接入网络,又需要用 SSH 连接后才能修改 Netplan 配置文件,陷入僵局。解决问题的办法是,在树莓派系统启动之前就完成对网络的配置:通过修改安装着树莓派的操作系统的存储卡中的特定文件即可实现。

将存储卡通过读卡器连接到电脑,可以看到 system-boot 和 writable 两个分区,打开 system-boot 分区,搜索名为 network-config 的文件:

image-20241009003840680

使用文本编辑工具打开该文件:

# This file contains a netplan-compatible configuration which cloud-init will
# apply on first-boot (note: it will *not* update the config after the first
# boot). Please refer to the cloud-init documentation and the netplan reference
# for full details:
#
# https://netplan.io/reference
# https://cloudinit.readthedocs.io/en/latest/topics/network-config.html
# https://cloudinit.readthedocs.io/en/latest/topics/network-config-format-v2.html
# ...

# Some additional examples are commented out below

network:
  version: 2

  ethernets:
    eth0:
      dhcp4: true
      optional: true

#  wifis:
#    wlan0:
#      dhcp4: true
#      optional: true
#      access-points:
#        myhomewifi:
#          password: "S3kr1t"
#        myworkwifi:
#          password: "correct battery horse staple"
#        workssid:
#          auth:
#            key-management: eap
#            method: peap
#            identity: "me@example.com"
#            password: "passw0rd"
#            ca-certificate: /etc/my_ca.pem

可以看到,该文件的格式与语法正是 Netplan 形式,用于在首次启动系统时初始化 Netplan 配置。参考原本注释掉的示例和本文正文,编辑该配置文件,添加 Wi-Fi 信息并保存。

完成配置文件的编辑后,将存储卡插回到树莓派中,通电开机,即会自动连接至无线网络。进入路由器后台管理,即可看到设备名为 ubuntu 的设备,记住其局域网 IP 地址,在电脑上使用 ssh 连接即可:

ssh ubuntu@192.168.3.24

如果没有路由器的管理员权限,无法进入后台查看树莓派的 IP,可以在电脑上尝试使用 Angry IP Scanner 等 IP 扫描工具寻找。

4. 查看ip

想查看树莓派是否连接上了网络

ipconfig -a

但是出现command not found

sudo apt install net-tools

后来发现网络似乎没连通,调整网络后安装完毕

image-20241009004523002

5. 连接树莓派

由于存储卡烧坏了,重新安装了系统,导致ssh公钥更换了,出现了以下报错

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:78lBQ3vMowOD+RUYFI/NX9hwDJMiiNLG02H/7JcJ1FE.
Please contact your system administrator.
Add correct host key in C:\\Users\\\346\262\210\345\206\215\345\256\211/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in C:\\Users\\\346\262\210\345\206\215\345\256\211/.ssh/known_hosts:18
Host key for 192.168.2.104 has changed and you have requested strict checking.
Host key verification failed.

通过删除本机上的公钥重新生成公钥即可

ssh-keygen -R 192.168.2.104(树莓派的ip)

6. 设置开机自执行命令

创建命令sh文件

vim auto_boot_run.sh

通过设置以下命令

crontab -e

在最后一行添加

@reboot /path/to/command

参考资料:

  1. 博客园

7. pip报错解决

如果出现了以下pip报错Could not fetch URL https://pypi.org/simple/ultralytics/: There was a problem confirming the ssl certificate:,则只需要只当第三方源即可

pip install ultralytics(包名) -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

同类型的第三方源还有:

1)http://mirrors.aliyun.com/pypi/simple/ 阿里云
2)https://pypi.mirrors.ustc.edu.cn/simple/ 中国科技大学
3)http://pypi.douban.com/simple/ 豆瓣
4)https://pypi.tuna.tsinghua.edu.cn/simple/ 清华大学
5)http://pypi.mirrors.ustc.edu.cn/simple/ 中国科学技术大学

只要连带着把--tursted-host一起改了就行

8. 树莓派摄像头调用(通过mobaxtrem的x11服务器转发视频流)

要使用 v4l2-ctl 工具配合 X11 服务器从 USB 摄像头截取图像并传输到本机,你可以按照以下步骤操作:

1. 安装必要的软件包

首先,确保你已经安装了 v4l-utils,这是一个包含 v4l2-ctl 工具的软件包,可以用来控制和配置 V4L2 (Video4Linux2) 设备。

sudo apt update
sudo apt install v4l-utils
2. 检查 USB 摄像头

确保你的 USB 摄像头已正确连接,并可以被系统识别。你可以使用以下命令查看系统中的视频设备:

v4l2-ctl --list-devices

如果设备正常,系统应该会列出类似如下的设备信息:

USB2.0 Camera: USB2.0 Camera (usb-0000:00:14.0-4):
    /dev/video0

/dev/video0 是你的 USB 摄像头设备节点。

3. 获取摄像头支持的格式

你可以用 v4l2-ctl 来查看摄像头支持的格式和分辨率:

v4l2-ctl --device=/dev/video0 --list-formats-ext

这将显示你的摄像头支持的视频格式和分辨率。例如,你可能会看到类似的输出:

ioctl: VIDIOC_ENUM_FMT
  Type: Video Capture

  [0]: 'YUYV' (YUYV 4:2:2)
  [1]: 'MJPG' (Motion-JPEG)
  [2]: 'H264' (H.264)
4. 抓取图像并保存为文件

使用 v4l2-ctl 截取图像并保存为文件,例如 JPG 格式,参考资料

v4l2-ctl --device /dev/video0 --set-fmt-video=width=1920,height=1080,pixelformat=MJPG --stream-mmap --stream-to=./output_1920.jpg --stream-count=1

#用ffmpeg拍摄图像
ffmpeg -f v4l2 -video_size 1280x1024 -i /dev/video1 -frames:v 1 output_image.png
#用ffmpeg录制视频
ffmpeg -f v4l2 -framerate 30 -video_size 640x480 -i /dev/video1 output_video.mp4

这会抓取当前帧并将其保存为 output_image.png。你可以替换文件名和路径以保存到你想要的位置。

5. 显示图像(通过 X11 显示)

为了将摄像头捕获的图像传输到本地 X11 显示服务器,你可以使用工具如 feheog(Eye of GNOME)来显示图片。

首先,安装 feheog

sudo apt install feh

然后用 feh 显示刚刚捕获的图片:

feh output_image.png

或者使用 eog 来显示图片:

eog output_image.png
6. 实时显示视频流(可选)

如果你希望实时查看摄像头的视频流,你可以使用 v4l2-ctl 结合 ffmpeg 来进行视频流的显示。例如:

ffmpeg -f v4l2 -framerate 30 -video_size 640x480 -i /dev/video0 -f x11grab -r 30 -s 640x480 :0.0+100,100 output.mp4

这条命令会将摄像头的实时视频流录制为 output.mp4,并显示到 X11 屏幕上。

7. 使用 MJPEG 流或其他格式

如果你的摄像头支持 MJPEG 等流媒体格式,你也可以使用 mjpg-streamervlc 来创建流并通过浏览器或 X11 客户端查看。安装 mjpg-streamer 并启动一个 HTTP 流:

sudo apt install mjpg-streamer
mjpg_streamer -i "/usr/lib/mjpg-streamer/input_uvc.so -d /dev/video0 -r 640x480 -f 30" -o "/usr/lib/mjpg-streamer/output_http.so -w /usr/share/mjpg-streamer/www -p 8080"

然后通过浏览器访问 http://localhost:8080 来查看摄像头的视频流。

8. 在 X11 中显示实时视频流(帧率低)

如果你想直接在 X11 窗口中显示视频流,可以结合 mplayervlc

mplayer tv:// -tv driver=v4l2:device=/dev/video0
9. 使用ffmpeg来推流到本机(帧率较高)
在远程主机运行

将摄像头视频流推送到本地网络:

ffmpeg -f v4l2 -framerate 30 -video_size 640x480 -i /dev/video0 -f mpegts udp://<local-ip>:1234
  • <local-ip>:替换为本机的 IP 地址。
  • 1234:可以选择其他未占用的端口。
在本地主机运行

在本机使用 ffplay 接收并显示视频流:

ffplay udp://0.0.0.0:1234