Jetson Nano
Jetson Nano系统安装
系统安装参考Jetson nano (4GB B01) 系统安装
基本配置
首先SD卡扩容,一般只有32G及以上的卡才能装上Nano系统,打开disk选择resize将剩下的空间补上。
安装基础依赖
sudo apt install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl git
输入法
nano没有中文输入法,国内网络搜索会有很大的阻碍,因此安装fcitx-googlepinyin输入法:
sudo apt-get install fcitx fcitx-tools fcitx-config* fcitx-frontend* fcitx-module* fcitx-ui-* presage fcitx-googlepinyin
在语言支持language support当中的键盘输入方法系统keyboard input method system当中选择fcitx
然后再输入下列指令重启:
sudo reboot
重启后在右上角键盘设置当中选择配置Fcitx
在输入方法配置选择框当中按左下角加号添加google pinyin后即可
同时在全局配置选项当中可以设置中英切换按键,默认是ctrl加空格
基础软件
Jetson nano相当于一台小电脑,为了方便开发需要一部分好用的软件帮助我们达成目的。
远程桌面
nano开发板其中一个好处在于其便携性,但不可能每次都带一个nano加显示屏幕,安装一款远程桌面可以方便我们控制nano
option1:Todesk
利用todesk可以跨平台控制,只要连接上任意的网络就可以实现远程桌面控制,控制的方便程度和网络传输相关,但同时需要注意的是todesk只支持gnome-desktop的桌面,部分系统如果没有连接显示屏幕那么就不会输出显示画面,导致todesk显示的是黑屏。解决方法通常有修改系统配置或者购买一个显卡欺骗器
我们只需要在Jetson当中打开浏览器搜索todesk然后下载:
选择arm64架构并在下载目录打开终端按照界面内的安装指令输入即可
登录自己的账号,然后在任意其他平台设备上下载todesk便可以远控各种设备了:
option2:nomachine或者VNC
VNC或者nomachine都是利用jetson nano连接的网络的IP来连接控制的,因此需要控制设备和Jetson nano连接在同一个网络下,通过IP访问。
以Nomachine为例:
网络浏览器搜索Nomachine进入官网并选择linux操作平台arm64,网址:NoMachine - NoMachine for Arm
安装后会自动在右上角显示NoMachine Services,它自己会设置一个开机自启服务用于开启NoMachine服务,服务口能够显示IP地址。同样可以在终端输入:
ifconfig
会显示如下界面:
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:14:7c:d1:0b txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 48:b0:2d:c1:27:3c txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 151 base 0x7000
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 8548 bytes 664893 (664.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8548 bytes 664893 (664.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
rndis0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 4a:4c:3a:fd:ea:e9 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
usb0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether ##:##:##:##:##:## txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet ###.###.###.### netmask 255.255.255.0 broadcast ###.###.###.###
inet6 fe80::### prefixlen ## scopeid 0x##<link>
ether ##:##:##:c0:5e:e7 txqueuelen 1000 (Ethernet)
RX packets 111615 bytes 40187332 (40.1 MB)
RX errors 0 dropped 1584 overruns 0 frame 0
TX packets 260908 bytes 198071760 (198.0 MB)
TX errors 0 dropped 6 overruns 0 carrier 0 collisions 0
根据你的nano连接的网络类型选择,例如你连接的是wifi那么就从wlan0或者wlan1当中找ip,一般wlan当中连接的是inet后的ip地址,如果是usb网络共享或者RJ45网口则可能需要从usb或者eth当中寻找ip,详见:使用 ifconfig 查看本机 ip_终端怎么查看本地ip
通过在其他设备上安装Nomachine连接查看远程桌面,点击Add添加设备,名字任意取,Host当中输入对应的IP地址即可
编程开发
VScode或者VScode-OSS
VScode支持多种编程语言,还可以添加插件,相当好用。因此在nano上面安装VScode可以极大提高开发效率
由于老版本的ubuntu可能不一定支持最新版本的VScode,可以安装旧版本的VScode或者直接安装VScode-OSS
我们前往网址Visual Studio Code September 2023点击Linux:后的deb便可以下载安装包
安装方式(注意jetson应该安装arm版本,由于我在x86-64设备上下载的安装包成了AMD,下载时注意即可,下面的指令当中也要将amd改为arm):
sudo dpkg -i code_1.83.1-1696982868_amd64.deb
安装完成后在开始菜单当中搜索code便可以找到VScode,可以将其Pin到左侧菜单栏当中
可以在extension拓展插件,必要插件有Python、C/C++等。
以python为例,在vscode界面右下角点击python可以选择对应版本的python的解释器
文件下载
例如迅雷等软件,直接前往网址【免费】WPS、迅雷等软件的arm64linux版本deb直接安装所有软件包
安装方式:
sudo dpkg -i #对应的安装包名字#
工作空间
输入下列指令创建ROS1工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
catkin_make
source devel/setup.bash
然后可以参考机器人Rviz+matlab仿真详细步骤,从solidworks到urdf以及机器人编程控制,以ER50-C20为例-优快云博客
正文部分并利用此环境开发机器人仿真以及运动学分析
外接设备
PWM风扇
Jetson nano的功耗还是较大的,为了及时散热需要使用PWM风扇连接主板上的PWM风扇口,然后我们在系统终端输入:
sudo apt install lm-sensors
sudo -H pip3 install -U jetson-stats
sudo sh -c 'echo 100 > /sys/devices/pwm-fan/target_pwm'
就可以控制风扇转到到正常转速,同时我们需要让转速和温度正相关,编写下列函数:
import os
import time
def get_cpu_temp():
temp = os.popen("cat /sys/devices/virtual/thermal/thermal_zone0/temp").readline()
return int(temp) / 1000
def set_fan_speed(pwm_value):
pwm_value = max(0, min(255, pwm_value))
os.system(f"sudo sh -c 'echo {pwm_value} > /sys/devices/pwm-fan/target_pwm'")
def adjust_fan_speed():
temp = get_cpu_temp()
if temp < 40:
pwm_value = 0
else:
pwm_value = int((temp - 40) * 6.375)
set_fan_speed(pwm_value)
print(f"Current CPU Temp: {temp}°C, Fan Speed PWM: {pwm_value}")
if __name__ == "__main__":
while True:
adjust_fan_speed()
time.sleep(10)
上述代码可以实现温控PWM风扇,其中get_cpu_temp函数主要用于读取CPU温度并转化为一个数值,并设置一个函数adjust_fan_speed将PWM的0到255和CPU温度数值对应起来,如果温度低于40PWM为0,如果温度大于40则建立线性表达式pwm_value = int((temp - 40) * 6.375),最后将这个对应的PWM数值利用set_fan_speed函数控制风扇转动。
注意有些PWM风扇刚好逻辑是反的,例如此处0是不转,但是有些是255不转,只需要在set_fan_speed函数开头添加一句代码即可:
pwm_value = 255 - pwm_value
将上述代码命名为fanctrl.py然后输入下列指令:
crontab -e
选择nano或者vim来显示内部代码,然后在最后加入下列指令,其中“/home/jetson/Workspace/Startup/”代表的是你的fanctrl.py所在的路径,注意路径不要输入错误
@reboot python3 /home/jetson/Workspace/Startup/fanctrl.py
这样就可以在每次开机的时候自启动该程序实现自动风扇控制。同时我们也可以使用系统自带的服务来实现开机自启,详见:Jetson Nano开机自动启动Python程序
OLED
OLED是许多嵌入式板子都支持的显示模块,有SPI协议和IIC协议两种。此处利用IIC协议的OLED为例显示NANO的部分信息。
首先是准备工作,在终端输入下列指令安装必要的库:
sudo apt-get install python3-tk
sudo apt-get install python3-pip
sudo apt-get install python3-dev
sudo pip3 install psutil smbus requests datetime Jetson.GPIO eyed3 adafruit-circuitpython-ssd1306 board adafruit-blinka adafruit-circuitpython-typing
引用对应库并设置显示OLED的分辨率,一般OLED设置有128*64和128*32这两种。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import time
import smbus
import board
import busio
import psutil
import subprocess
from adafruit_ssd1306 import SSD1306_I2C
from datetime import datetime
from PIL import Image, ImageDraw, ImageFont
i2c = busio.I2C(board.SCL, board.SDA)
disp = SSD1306_I2C(128, 32, i2c)
width = disp.width
height = disp.height
image = Image.new("1", (width, height))
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
padding = -2
top = padding
bot