虽然树莓派的初衷是教育领域,但它丰富的GPIO接口,廉价却完整的硬件构架使其成为了最受欢迎的机器人系统开发平台之一。废话说完了,下面开始正题。

使用需求

在官方Raspbian桌面系统下进行开发有很多局限性:交互界面不友好、趁手的软件不支持、桌面系统占用大量CPU周期……因此,我的使用原则是在本地(Mac)进行开发,远程部署至树莓派运行,同时需要将数据传回本地。整个过程尽可能简洁。

安装Raspbian系统(参考资料)

  • 下载最新的系统镜像。如果桌面系统不是必要,则推荐使用Lite版本。(可以减少不必要的系统中断,使对运行速度要求高的程序更稳定)
  • 解压得到.img文件。
  • Mac插入Micro SD卡。
  • 运行diskutil list,找到SD卡对应的盘位,如/dev/disk2
  • 弹出SD卡diskutil unmountDisk /dev/diskN
    其中N为SD卡的盘位。
  • 烧录sudo dd bs=1m if=path_of_your_image.img of=/dev/rdiskN conv=sync
    其中N为SD卡的盘位。
    其中path_of_your_image.img为系统镜像地址。
    这一步骤需要好几分钟,可以通过Ctrl+T查看进度。
  • 弹出SD卡sudo diskutil eject /dev/rdiskN

配置

新安装的系统配置有4种情况:

有显示器键鼠 无显示器键鼠
有桌面系统 A B
无桌面系统 C D

下面的配置以C情况为例。

安全配置

——2022-12-18-更新——
最新的Raspberry Pi OS在第一次启动时默认要求用户设置个人账户,不会再有pi这种奇怪的账户了,可以忽略本章剩下的内容。

树莓派与显示器键鼠连接,第一次开机后使用默认用户名密码登录。(由于地球人都知道用户名密码,所以这个树莓派不被攻击是不科学的。)登录后首先要做的是删除默认pi用户。

  • 添加用户
    1
    sudo adduser your_username
  • 将新用户添加至sudo组
    1
    sudo adduser your_username sudo
  • 检查是否添加成功,并切换至root用户
    1
    sudo su
  • 更改root密码
    1
    2
    3
    sudo raspi-config // Option 1
    // OR
    passwd // Option 2
  • 删除pi用户

    1
    2
    3
    4
    exit 
    # then log in with your_username
    sudo deluser -remove-home pi
    # the /home/pi will be removed

    注:如果安装的是带桌面系统的镜像,pi无法直接删除,因为默认登陆用户pi始终运行图形界面。一个简单的方法是通过sudo raspi-config关闭桌面系统,重启后登陆新用户,再运行上述命令删除pi用户。此时可以在此打开桌面系统。

  • sudo取消密码输入
    编辑文件/etc/sudoers,添加一行your_username ALL=(ALL:ALL) NOPASSWD:ALL

    1
    sudo nano /etc/sudoers

网络连接(参考资料)

(如果树莓派与路由器通过网线直连,步骤1-3可以跳过。)

  • 通过sudo raspi-config打开SSH通道,如果需要远程登陆桌面系统,则同时打开VNC通道。
  • 通过sudo raspi-config链接wifi。
  • 查看树莓派获得的IP地址
    1
    ifconfig
  • 本地(Mac)通过ssh连接树莓派
    1
    ssh your_username@192.168.0.xxx
  • 如果不想每次ssh都输入密码,可以将本地的ssh公钥传至树莓派(这条命令在本地而不是树莓派上执行)

    1
    ssh-copy-id -i <USERNAME>@<IP-ADDRESS>
  • 如果树莓派重装系统后第一次ssh登陆时有冲突:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    @ 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 ECDSA key sent by the remote host is
    SHA256:8AYVimIa4f5PlRiqxa6E/ylMj8iKQSqq9pmrqJyUFLs.
    Please contact your system administrator.
    Add correct host key in /Users/anmo/.ssh/known_hosts to get rid of this message.
    Offending ECDSA key in /Users/anmo/.ssh/known_hosts:7
    ECDSA host key for 192.168.2.14 has changed and you have requested strict checking.
    Host key verification failed.

    则可以在本地电脑上删除旧的密钥:

    1
    ssh-keygen -R <IP_of_your_Raspberry_Pi>

远程操作

树莓派作为机器人控制系统,需要频繁调试代码,传输至树莓派上编译运行,并将数据取回本地。

代码

VS Code + Remote - SSH Extension

目前最尊贵的方法,没有之一。

如果使用C++ gdb debug需要sudo权限时,

  • 创建一个可执行文件/home/pi/gdb
  • 写入sudo /usr/bin/gdb “$@”`
  • launch.json中设置"miDebuggerPath": "/home/pi/gdb"

Sublime Text 3 + SFTP

我曾今的方案是Sublime Text 3 + SFTP。这个方案可以实现一个快捷键完成代码上传,不需要切换窗口。

  • Sublime Text 3环境下添加package SFTP
  • 在代码目录新建配置文件sftp-config.json
    1
    2
    3
    4
    5
    "host": "your_RPI_IP_address",
    "user": "your_username",
    "password": "your_password",
    //"port": "22",
    "remote_path": "/home/your_username/your_destination/",
  • 编辑代码后,通过快捷键将当前文件传输至树莓派指定的文件夹中
  • ctrl+cmd+(u, f) current file, ctrl+cmd+(u, n) opened files, ctrl+cmd+(u, r) entire folder
  • 最后切换窗口至命令行,ssh登陆树莓派编译运行程序

数据

通常我将树莓派生成的数据保存在树莓派,再通过rsycn同步至本地:

1
rsync -azvP your_username@192.168.0.2:/home/your_username/data/ /Users/anmo/Documents/lso/rawData

如果有调试需要,也可以利用piping将数据引导至本地文件或直接进行后处理:

1
ssh your_username@192.168.0.38 ./a.out | python plot.py

实时操作系统

树莓派系统不是实时操作系统,无法满足确定的(deterministic)低延时响应。目前可以通过安装精简系统、安装RT_Preempt补丁的方式尽可能提高实时性。

  • 以Linux内核版本4.19为例,按照上述配置方式安装精简版Raspbian系统
  • (以下步骤在树莓派上操作)
  • 下载编译好的RT_Preempt补丁(也可以自己编译)并安装
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    cd /tmp
    wget https://github.com/lemariva/RT-Tools-RPi/raw/master/preempt-rt/kernel_4_19_59-rt23-v7l%2B/rt-kernel.tgz
    tar xzf rt-kernel.tgz
    cd boot
    sudo cp -rd * /boot/
    cd ../lib
    sudo cp -dr * /lib/
    cd ../overlays
    sudo cp -d * /boot/overlays
    cd ..
    sudo cp -d bcm* /boot/
  • kernel=kernel7_rt.img添加一行到/boot/config.txt:
    1
    2
    # Add the option: kernel=kernel7_rt.img
    sudo nano /boot/config.txt
  • 重启树莓派,查看补丁是否安装成功
    1
    2
    ~$ uname -r
    # you should see: 4.19.59-rt23-v7l+

超频/锁频

超频可以获得性能提升,代价是功率与散热。锁频可以保证CPU频率不随负荷动态调整,在实时操作系统中有重要意义。

⚠️请使用散热片!
⚠️以下操作将使保修无效!

  • 编辑配置文件
    1
    2
    3
    4
    5
    $ sudo nano /boot/config.txt
    # Add your lines at the end.
    over_voltage = 2
    arm_freq = 1750 # 超频至1750MHz
    force_turbo = 1 # 锁频
  • 重启
    1
    sudo reboot
  • 查看运行状态
    1
    2
    3
    4
    5
    # CPU 频率
    cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
    # CPU 温度
    cat /sys/class/thermal/thermal_zone0/temp
    # 可以自动刷新 watch -n 1 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

安装实用工具

  • GPIO工具:Wiring Pi虽然还不错,但毕竟不再维护了,性能也稍差。我更习惯使用bcm2835
    1
    2
    3
    4
    5
    6
    7
    8
    wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.68.tar.gz
    tar zxvf bcm2835-1.68.tar.gz
    rm bcm2835-1.68.tar.gz
    cd bcm2835-1.68
    ./configure
    make
    sudo make check
    sudo make install