Skip to content

NanoPI 部署指南

本文档介绍如何在 NanoPI 嵌入式开发板上部署和运行 LeBot 控制系统。NanoPI 是 LeBot 的主要硬件平台,具有良好的性能和成本比。

1. NanoPI 硬件介绍

1.1 NanoPI 系列概览

NanoPI 是友善电子推出的开源硬件平台,专为嵌入式应用优化。

常见型号对比

型号CPURAM存储网络推荐用途
NanoPI NeoARM Cortex-A7512MB8GB100M轻量应用
NanoPI Neo2Cortex-A53512MB/1GB8GB100M一般应用
NanoPI Neo Plus2Cortex-A531GB8GB/16GB100M/WiFi中等应用
NanoPI M1Cortex-A7×41GB8GB100M多任务
NanoPI M4Cortex-A72×2+A53×42GB/4GB16GB/32GB1000M高性能

LeBot 推荐配置

  • 基础版:NanoPI Neo Plus2(512MB RAM,WiFi)
  • 标准版:NanoPI M4(2GB RAM,1000M 网络)
  • 高性能版:NanoPI M4V2(4GB RAM)

1.2 NanoPI 的引脚分布

NanoPI Neo Plus2 引脚图:

┌─────────────────────────────┐
│ USB    UART   GPIO  GND    │
│ (5V)   (RX)   (D+)  (0V)   │
│ (GND)  (TX)   (D-)        │
│ (D+)          (D+)        │
│ (D-)   BOOT   (D-)        │
│              POWER        │
└─────────────────────────────┘

主要接口:
- USB 供电:5V 2A
- UART 串口:115200 波特率
- GPIO:多个通用 IO 引脚
- I2C/SPI:用于传感器

1.3 性能指标

指标NanoPI M4备注
CPU 主频2.0 GHz可超频至 2.4 GHz
内存带宽12.8 GB/s支持 LPDDR4
性能~40 GFLOPS单精度浮点
TDP5-10W正常工作功耗
启动时间~20-30s从上电到系统就绪

2. 系统安装与配置

2.1 准备工作

需要的工具和材料

  1. 硬件

    • NanoPI 开发板
    • 电源适配器(5V 2A 或以上)
    • MicroSD 卡(≥8GB,推荐 Class 10)
    • USB 转串口模块(调试用)
    • 网线或 WiFi(联网用)
  2. 软件

    • 刻录工具:Etcher、dd 或 Win32DiskImager
    • 系统镜像:官方 Debian/Ubuntu 镜像
    • SSH 客户端:PuTTY、OpenSSH 等

2.2 系统镜像下载

访问友善电子官网下载最新镜像:

bash
# 下载 NanoPI M4 Debian 10 镜像
wget http://download.friendlyarm.com/nanopi-m4/images-for-eflasher/nanopi-m4-debian-10.3-cd-focal-arm64-20200610.zip

# 解压镜像
unzip nanopi-m4-debian-10.3-cd-focal-arm64-20200610.zip

# 得到 .img 文件

2.3 刻录系统镜像

在 Linux 上刻录

bash
# 查看 SD 卡设备
lsblk

# 假设 SD 卡为 /dev/sdb(注意不要选错!)
sudo dd if=nanopi-m4-debian-10.3.img of=/dev/sdb bs=4M
sudo sync

# 弹出 SD 卡
sudo eject /dev/sdb

在 Windows 上刻录

  1. 下载 Win32DiskImager
  2. 选择镜像文件
  3. 选择 SD 卡驱动器
  4. 点击 Write(写入)

在 macOS 上刻录

bash
# 查找 SD 卡
diskutil list

# 卸载 SD 卡(假设为 /dev/disk2)
diskutil unmountDisk /dev/disk2

# 写入镜像
sudo dd if=nanopi-m4-debian-10.3.img of=/dev/rdisk2 bs=4m

# 弹出
diskutil eject /dev/disk2

2.4 首次启动配置

硬件连接

  1. 将 MicroSD 卡插入 NanoPI
  2. 连接电源(系统会自动启动)
  3. 连接网线或 WiFi
  4. 连接 HDMI 显示器(可选)

通过串口连接

bash
# 使用 minicom 或 screen
screen /dev/ttyUSB0 115200

# 或使用 minicom
minicom -s

# 默认用户名:root,密码:root

首次启动脚本

bash
# 系统首次启动会运行配置脚本
# 按照提示完成设置:
# 1. 设置新用户密码
# 2. 配置时区
# 3. 配置网络
# 4. 设置 root 密码

2.5 网络配置

查看网络状态

bash
# 查看网络接口
ifconfig

# 查看 IP 地址
ip addr

# 查看路由
route -n

配置静态 IP(编辑 /etc/network/interfaces):

bash
sudo nano /etc/network/interfaces

# 配置示例:
auto eth0
iface eth0 inet static
    address 192.168.1.100
    netmask 255.255.255.0
    gateway 192.168.1.1
    dns-nameservers 8.8.8.8 8.8.4.4

# 重启网络
sudo systemctl restart networking

配置 WiFi(如果有 WiFi 模块):

bash
# 编辑 wpa_supplicant 配置
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

# 添加网络配置:
network={
    ssid="YourSSID"
    psk="YourPassword"
    key_mgmt=WPA-PSK
}

# 启用 WiFi
sudo ifup wlan0

3. 系统优化与配置

3.1 系统更新

bash
# 更新软件包列表
sudo apt-get update

# 升级系统
sudo apt-get upgrade

# 安装必要工具
sudo apt-get install -y \
    build-essential \
    git \
    wget \
    curl \
    vim \
    htop \
    gcc \
    g++ \
    cmake

3.2 性能优化

超频配置(谨慎操作):

bash
# 编辑 U-Boot 环境
sudo fw_setenv cpufreq 2400

# 查看当前频率
cat /proc/cpuinfo | grep "cpu MHz"

# 调整 CPU 频率
echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo 2000000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed

内存优化

bash
# 清理缓存
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

# 查看内存使用
free -h

# 查看交换分区
swapon -s

# 增加交换分区
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

磁盘优化

bash
# 查看磁盘使用情况
df -h

# 扩展文件系统(第一次启动通常自动扩展)
sudo resize2fs /dev/mmcblk0p2

# 优化 SD 卡性能
sudo sh -c 'echo 16 > /sys/block/mmcblk0/queue/read_ahead_kb'

3.3 GPIO 和硬件接口

GPIO 访问(使用 sysfs):

bash
# 导出 GPIO 脚
echo 97 > /sys/class/gpio/export

# 设置方向
echo out > /sys/class/gpio/gpio97/direction

# 写入高电平
echo 1 > /sys/class/gpio/gpio97/value

# 读取引脚状态
cat /sys/class/gpio/gpio97/value

# 取消导出
echo 97 > /sys/class/gpio/unexport

使用 Python 访问 GPIO

python
import RPi.GPIO as GPIO
import time

# 使用 BCM 编号
GPIO.setmode(GPIO.BCM)

# 设置 GPIO 17 为输出
GPIO.setup(17, GPIO.OUT)

# 输出高电平
GPIO.output(17, GPIO.HIGH)

# 等待 1 秒
time.sleep(1)

# 输出低电平
GPIO.output(17, GPIO.LOW)

# 清理
GPIO.cleanup()

I2C 通信

bash
# 检测 I2C 设备
sudo i2cdetect -y 0

# 使用 i2ctools 与 I2C 设备通信
sudo i2cget -y 0 0x50 0x00  # 读取地址
sudo i2cset -y 0 0x50 0x00 0xFF  # 写入数据

3.4 系统服务配置

创建 LeBot 服务(自动启动控制程序):

bash
# 创建服务文件
sudo nano /etc/systemd/system/lebot.service

服务文件内容

ini
[Unit]
Description=LeBot Robot Control System
After=network.target
Wants=network-online.target

[Service]
Type=simple
User=root
WorkingDirectory=/home/lebot
ExecStart=/usr/bin/python3 /home/lebot/control_system.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

启用和管理服务

bash
# 启用开机自启动
sudo systemctl enable lebot

# 启动服务
sudo systemctl start lebot

# 查看服务状态
sudo systemctl status lebot

# 查看服务日志
sudo journalctl -u lebot -f

# 停止服务
sudo systemctl stop lebot

4. LeBot 软件部署

4.1 安装依赖

bash
# 安装 Python 3 和 pip
sudo apt-get install -y \
    python3 \
    python3-dev \
    python3-pip

# 升级 pip
sudo pip3 install --upgrade pip

# 安装 ROS(可选,用于高级功能)
# 详见 ROS 官方文档

# 安装常用 Python 库
sudo pip3 install \
    numpy \
    scipy \
    opencv-python \
    paramiko \
    requests

4.2 部署控制程序

bash
# 创建应用目录
mkdir -p /home/lebot/lebot_control
cd /home/lebot/lebot_control

# 从 Git 克隆源代码
git clone https://github.com/yourusername/lebot_control.git .

# 或者上传本地文件
scp -r ./lebot_control root@192.168.1.100:/home/lebot/

控制程序结构

/home/lebot/lebot_control/
├── main.py                 # 主程序入口
├── config.yaml            # 配置文件
├── motor_control.py       # 电机控制模块
├── sensor_fusion.py       # 传感器融合
├── path_planning.py       # 路径规划
├── trajectory_control.py  # 轨迹跟踪
├── communication.py       # 通信模块
├── logs/                  # 日志目录
└── data/                  # 数据目录

4.3 配置文件示例

config.yaml

yaml
# LeBot 控制系统配置文件

robot:
  name: "LeBot-001"
  type: "wheeled_legged"
  wheelbase: 0.5
  track: 0.4

hardware:
  motor_count: 4
  motor_type: "brushless_dc"

  motors:
    - id: 0
      port: "/dev/ttyUSB0"
      baudrate: 115200
    - id: 1
      port: "/dev/ttyUSB1"
      baudrate: 115200
    - id: 2
      port: "/dev/ttyUSB2"
      baudrate: 115200
    - id: 3
      port: "/dev/ttyUSB3"
      baudrate: 115200

sensors:
  imu:
    type: "MPU6050"
    i2c_bus: 0
    i2c_address: 0x68

  camera:
    type: "USB"
    device: "/dev/video0"
    resolution: [640, 480]
    fps: 30

control:
  loop_rate: 50  # Hz
  max_velocity: 2.0  # m/s
  max_angular_velocity: 3.0  # rad/s

network:
  ros_master: "localhost"
  ros_port: 11311
  mqtt_broker: "192.168.1.1"
  mqtt_port: 1883

4.4 运行和测试

bash
# 进入应用目录
cd /home/lebot/lebot_control

# 运行主程序
python3 main.py

# 或者使用 nohup 后台运行
nohup python3 main.py > lebot.log 2>&1 &

# 查看运行日志
tail -f lebot.log

5. 交叉编译部署

对于 C/C++ 程序,使用交叉编译提高效率。

5.1 设置交叉编译工具链

bash
# 安装 ARM 交叉编译工具
sudo apt-get install -y arm-linux-gnueabihf-gcc arm-linux-gnueabihf-g++

# 或者 64 位
sudo apt-get install -y aarch64-linux-gnu-gcc aarch64-linux-gnu-g++

# 验证安装
arm-linux-gnueabihf-gcc --version

5.2 CMake 交叉编译配置

创建 toolchain.cmake

cmake
# NanoPI M4 交叉编译工具链配置

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)

# 交叉编译器路径
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)

# 查找库和头文件的路径
set(CMAKE_FIND_ROOT_PATH /usr/aarch64-linux-gnu)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

# 编译优化
set(CMAKE_CXX_FLAGS "-O2 -march=armv8-a")

构建示例

bash
# 创建构建目录
mkdir build
cd build

# 使用工具链进行交叉编译
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake ..
make

# 部署到 NanoPI
scp lebot_control root@192.168.1.100:/home/lebot/

5.3 使用 cargo-zigbuild 编译 Rust

bash
# 安装 zigbuild
cargo install cargo-zigbuild

# 设置目标
rustup target add aarch64-unknown-linux-gnu

# 交叉编译
cargo zigbuild --release --target aarch64-unknown-linux-gnu

# 二进制文件位于
# target/aarch64-unknown-linux-gnu/release/lebot_control

6. 调试与故障排除

6.1 常见问题

问题 1:系统启动慢

bash
# 查看启动时间
systemd-analyze

# 查看各服务启动时间
systemd-analyze blame

# 禁用不必要的服务
sudo systemctl disable service_name

问题 2:内存不足

bash
# 查看内存使用
free -h

# 查看进程内存占用
ps aux --sort=-%mem | head -20

# 增加交换分区(见 3.2)

问题 3:GPIO 无法访问

bash
# 检查 GPIO 导出
ls /sys/class/gpio/

# 重新导出
echo 97 > /sys/class/gpio/export

# 检查权限
ls -la /sys/class/gpio/gpio97/

问题 4:无法连接 NanoPI

bash
# 检查网络连接
ping 192.168.1.100

# 查看 SSH 状态
sudo systemctl status ssh

# 启用 SSH
sudo systemctl start ssh
sudo systemctl enable ssh

6.2 性能监控

bash
# 监控 CPU 和内存
htop

# 查看实时进程信息
top

# 查看磁盘 IO
iostat -x 1

# 查看网络流量
iftop

# 查看温度(如果支持)
cat /sys/class/thermal/thermal_zone0/temp

6.3 日志分析

bash
# 查看系统日志
journalctl -n 100

# 查看特定服务日志
journalctl -u lebot.service -n 50

# 实时查看日志
journalctl -f

# 查看启动日志
dmesg | tail -20

7. 安全加固

7.1 用户管理

bash
# 创建专用用户
sudo useradd -m -s /bin/bash lebot

# 设置密码
sudo passwd lebot

# 给予 sudo 权限
sudo usermod -aG sudo lebot

# 删除默认 root 密码登录
sudo usermod -L root

7.2 防火墙配置

bash
# 安装防火墙
sudo apt-get install -y ufw

# 启用防火墙
sudo ufw enable

# 允许 SSH
sudo ufw allow 22/tcp

# 允许特定端口
sudo ufw allow 8080/tcp

# 查看规则
sudo ufw status

7.3 SSH 安全

bash
# 编辑 SSH 配置
sudo nano /etc/ssh/sshd_config

# 修改项:
# Port 2222              # 改变 SSH 端口
# PermitRootLogin no     # 禁止 root 登录
# PasswordAuthentication no  # 禁用密码认证
# PubkeyAuthentication yes   # 启用密钥认证

# 重启 SSH
sudo systemctl restart ssh

# 生成密钥对(客户端)
ssh-keygen -t rsa -b 4096

# 上传公钥到 NanoPI
ssh-copy-id -i ~/.ssh/id_rsa.pub lebot@192.168.1.100

8. 定期维护

8.1 备份和恢复

bash
# 备份系统
sudo dd if=/dev/mmcblk0 of=nanopi-backup.img bs=4M

# 恢复系统
sudo dd if=nanopi-backup.img of=/dev/sdb bs=4M

# 增量备份
rsync -avz lebot@192.168.1.100:/home/lebot ./backup/

8.2 定期更新

bash
# 创建定期更新脚本
cat > update.sh << 'EOF'
#!/bin/bash
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get autoremove -y
EOF

# 设置 cron 任务(每周更新)
crontab -e

# 添加行:
0 2 * * 0 /home/lebot/update.sh

8.3 监控和告警

bash
# 监控磁盘空间
df -h / | tail -1

# 监控温度
cat /sys/class/thermal/thermal_zone*/temp

# 创建监控脚本
cat > monitor.py << 'EOF'
#!/usr/bin/env python3
import os
import subprocess

def check_disk():
    result = os.popen("df -h / | tail -1").read()
    usage = float(result.split()[4].rstrip('%'))
    if usage > 80:
        print("Warning: Disk usage is high!")

def check_cpu():
    result = os.popen("top -bn1 | grep 'Cpu'").read()
    print(f"CPU: {result}")

check_disk()
check_cpu()
EOF

9. 参考资源

10. 快速参考

操作命令
连接 SSHssh root@192.168.1.100
查看温度cat /sys/class/thermal/thermal_zone0/temp
查看频率cat /proc/cpuinfo | grep MHz
重启系统sudo reboot
关机sudo shutdown -h now
文件传输scp file root@192.168.1.100:/path/

由 LeBot 开发团队编写