妙算2G Ubuntu18 零碎记录(一)系统篇

1、风扇配置文件的目录路径:/usr/bin/jetson_clocks.sh

# 间接开启风扇(全速),可以修改/usr/bin/jetson_clocks文件里的fan_speed值,这样就不会全速开启了
sudo jetson_clocks --fan

# 直接开启风扇 数值范围0-255
sudo su
echo "255" > /sys/devices/pwm-fan/target_pwm

2、开机自启风扇,方法很多,这里我只提供我的简便做法

# 步骤示例:

# 1、用vim创建并编辑脚本
vim /home/dji/open_fan.sh

# 脚本内容如下:
if [ -n "$1" ]
then
echo $1 > /sys/devices/pwm-fan/target_pwm
else
echo 127 > /sys/devices/pwm-fan/target_pwm
fi

# 脚本使用方法,传入参数时可修改fan_speed值大小
sudo bash /home/dji/open_fan.sh 255

# 2、将命令放入/etc/rc.local文件,Ubuntu16.04以后的系统都要自己创建这个文件
sudo vim /etc/rc.local

# /etc/rc.local内容如下:
#!/bin/sh -e
#以下命令二选一即可
sudo jetson_clocks --fan
sudo bash /home/dji/open_fan.sh 255
exit 0

# 3、赋予/etc/rc.local文件执行权限
sudo chmod +x /etc/rc.local

# 4、/lib/systemd/system/中已经存在rc-local.serivce,
# 所以只需创建/etc/rc.local就能实现自启了

reboot重启即可

3、开机自启程序(gnome-session-properties、/etc/rc.local、service)

  • gnome-session-properties(推荐)适用于在进入系统后的自启程序,也适用于需要启用gui的程序,缺点是如果系统进入不了图形化桌面,就不会有后面的程序自启了。
  • /etc/rc.local适用于在进入系统前的自启程序,注意程序中不能有存在死循环的可能,否则系统可能会卡在程序中出不来,导致进入不了系统开不了机,步骤2中有应用示例
  • service是etc/rc.local的源头,/etc/rc.local是由/lib/systemd/system/rc-local.service启动的,当然我们也可以创建一个专门用来启动风扇的open-fan.service,该方法也适用于在进入系统前的自启程序,程序中不能存在死循环,service可以在/etc/systemd/system/或/lib/systemd/system/下创建,具体请参考其他博客

 这里只提供gnome-session-properties的应用示例

# 打开终端输入或在菜单中寻找启动
gnome-session-properties


# 打开后添加自启命令即可,这里提供我的做法:
# 1、创建/home/dji/rm-auto-run.sh
vim /home/dji/rm-auto-run.sh

# 输入内容:
#!/bin/bash
gnome-terminal -t "open_fan" -- bash -c "echo "djidji" | sudo -S bash /home/dji/open_fan.sh 255;exec bash;"

# 内容解释:
gnome-terminal 另外打开一个终端
-t 终端窗口标题
-- bash -c 指定要执行的命令
echo "yourpasswd" | sudo -S ... 自动输入密码,适用于需要root权限的命令
exec bash 命令执行完后不自动关闭窗口


# 2、赋予/home/dji/rm-auto-run.sh执行权限
sudo chmod +x /home/dji/rm-auto-run.sh

# 3、在gnome-session-properties中添加命令

/home/dji/rm-auto-run.sh

保存,reboot重启

# 这里解释一下为什么我要在gnome-session-properties和/etc/rc.local里都添加开启风扇的命令,因为这样可以做到即使不进入系统,也能开启风扇的效果,单单只在gnome-session-properties中添加,如果没有进入系统的话,风扇是不会开启的

fbed7ed7ea9d4524b29e3ebf64d91cf2.png

cf1513282f34494fb99bafb66605696b.png

4、系统中文化

对于我这个英语菜鸟来说,中文化确实很有必要

# 一、语言支持设置
1、打开设置>语言支持,此时可能会弹出要下载完整语言支持的窗口,点击下载即可
2、下载完后,将汉语(中国)拉到最顶,然后点击应用到整个系统
3、重启后,可能会弹出一个文件夹更换为中文的窗口,点击否,路径中出现中文,问题很大

# 二、安装并设置拼音输入法
1、安装输入法,这里提供四种输入法,四选一即可。我选的是IBus
IBus:sudo apt-get install ibus-pinyin
SCIM:sudo apt-get install scim-chinese
谷歌:sudo apt-get install ibus-googlepinyin
Sun:sudo apt-get install ibus-sunpinyin

2、重启一下

3、配置输入法
打开设置>文本输入,添加汉语,选择拼音输入法即可。
快捷键配置,第一个空配为shift+ctrl,第二个用退格键禁用了。

4、再重启一下就已经完成了

5c10b749f026475382ae7ae397a8786b.png

5、安装jtop

jtop能够用来查看很多系统相关信息,而且能实时监测系统状态,非常有用

# 用python2.7安装jtop,也可以任意指定其他python,命令更换成对应的pip即可
sudo -H pip2 install -U jetson-stats

# 重启
reboot

# 打开终端输入
jtop

# 没有安装pip2的可以用下面命令安装
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
sudo python2 get-pip.py
sudo rm get-pip.py

效果如下: 

bc8af1e5231247109c794b81696bbe76.png838b30a2e2514bb6a119b151e4fff4e3.png

6、安装支持cuda加速的opencv

OpenCV支持传统的图像处理的CUDA加速,从OpenCV4.2开始支持深度神经网络的CUDA加速,因此在OpenCV4.4中,CUDA是既可以加速传统的图像处理,特征与对象检测;又可以支持深度神经网络的CUDA加速

从上面的jtop展示图可知,系统默认的opencv是不支持cuda加速的,这里我选择的版本是4.5.3,因为4.1.1版本编译时似乎找不到cudnn路径,导致无法正常编译

# 安装cmake-gui,cmake版本可以是本机自带的3.10版本
sudo apt install cmake-gui

# 安装依赖
sudo apt install -y build-essential checkinstall cmake pkg-config yasm git gfortran
sudo apt update
sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
sudo apt install -y libjpeg8-dev libjasper-dev libpng12-dev libtiff5-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libxine2-dev libv4l-dev
sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgtk2.0-dev libtbb-dev libatlas-base-dev libfaac-dev libmp3lame-dev libtheora-dev libvorbis-dev libxvidcore-dev libopencore-amrnb-dev libopencore-amrwb-dev x264 v4l-utils
sudo apt install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

# 若遇到无法定位libjasper-dev软件包,执行如下命令即可安装
sudo add-apt-repository "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe"
sudo apt update
sudo apt install libjasper1 libjasper-dev

# 换源,可使用鱼香ros的一键安装工具换源,首选中科大源,建议安装完以上依赖后再换源,怕出现版本冲突
wget http://fishros.com/install -O fishros && . fishros

# 下载cv资源包,这里如果没有梯子可能会失败,所以建议搭完梯子再执行,或者在window上下载好再传到妙算
wget -O opencv.zip https://github.com/opencv/opencv/archive/refs/tags/4.5.3.zip
wget -O opencv_contrib.zip https://github.com/opencv/opencv_contrib/archive/refs/tags/4.5.3.zip

# 解压,并将opencv_contrib-4.5.3放到opencv-4.5.3目录下
unzip opencv.zip
unzip opencv_contrib.zip
mv opencv_contrib-4.5.3 opencv-4.5.3

在编译安装前,可以先把自带的opencv给卸了,可能会连带将ros也卸了,所以这步最好是在装完系统后立马进行,确定好用哪些工具就得全部提前配好

# 列出已安装的所有软件包
sudo dpkg -l

# 搜索软件包
sudo apt-cache search opencv*

# 删除软件包
sudo apt-get --purge remove libopencv*
sudo apt-get --purge remove opencv*

# 删除相关依赖
sudo apt-get autoremove

# 清除已下载的软件包和旧软件包
sudo apt-get autoclean

# 删除相关文件
sudo rm -r /usr/local/include/opencv2 /usr/local/include/opencv /usr/include/opencv /usr/include/opencv2 /usr/local/share/opencv /usr/local/share/OpenCV /usr/share/opencv /usr/share/OpenCV /usr/local/bin/opencv* /usr/local/lib/libopencv*

# 更新安装源
sudo apt-get update

# 更新已安装的软件包
sudo apt-get upgrade

在用cmake-gui编译时可能会下载一些欠缺的文件,可以点击下载,或者复制cmake给的欠缺文件的链接一个一个到浏览器上下载下来放到对应的文件目录下,或者将这些选项去掉,例如BUILD_opencv_xfeatures2d、BUILD_opencv_wechat_qrcode、BUILD_opencv_face

https://pan.xunlei.com/s/VNdjHWhpjbTUyw5AWGMxijtxA1?pwd=c97r#

解压后将以下文件名的源码,放在opencv_contrib_xxx/modules/xfeatures2d/src/ 路径下

boostdesc_bgm.i
boostdesc_bgm_bi.i
boostdesc_bgm_hd.i
boostdesc_lbgm.i
boostdesc_binboost_064.i
boostdesc_binboost_128.i
boostdesc_binboost_256.i
vgg_generated_120.i
vgg_generated_64.i
vgg_generated_80.i
vgg_generated_48.i

可能还会有一些欠缺文件,可以另想办法,我这里用了ladder,连接成功后,打开cmake-gui

sudo cmake-gui

# 要自己创建build文件夹

 22e377b12d574014a7f97d5bcc3d4dc9.png

点击configure,配置各选项,下面信息仅作参考,不可完全照搬,我这里的CUDA_ARCH_BIN为6.2,有些选项没出来是因为要先选一部分选项后,再点击configure后才会有的,完全确认选项后点击generate即可。

a9cbb55eb64f42c685588ac61e5e2777.jpeg

编译之前须检查一下以下内容:

--   NVIDIA CUDA:                 YES (ver 10.2, CUFFT CUBLAS FAST_MATH)
--   NVIDIA GPU arch:             62
--   NVIDIA PTX archs:
-- 
--   cuDNN:                         YES (ver 8.0.0)

以上完成后,打开终端

# 进入build目录

cd /home/dji/workspace/sources/opencv-4.5.3/build/

# 编译安装

sudo make -j4

sudo make install

成功后的效果如下:

33a878847c3b41a5967c7b96f952d74a.png

7、设置不休眠不锁屏模式

127b763a0cf74997ba306b4f69db2d0f.png

8、设置自动登录或免密登录

注意,两者是有区别的,自动登录相当于跳过登录界面直接进入桌面,而免密登录就是不需要输入密码,点击头像即可进入桌面,也就是说,免密登录还比自动登录多了一步操作,参考wiki

正常情况下,自动登录在用户账户里设置就可以了,但对于内测版镜像来说,这个设置却没有作用,只能在用户账户设置完后再按照下面的内容设置才可能起作用

# 免密登录

sudo vim /etc/pam.d/gdm-password

# 在第一行添加

auth sufficient pam_succeed_if.so user ingroup dji

# 自动登录,用户账户里设置的就是这个文件和/etc/lightdm/lightdm.conf

sudo vim /etc/gdm3/custom.conf

# 取消以下内容注释,延迟自动登录

[daemon]

TimedLoginEnable=true

TimedLogin=dji

TimedLoginDelay=1

9 、解决每次执行sudo命令时都要输入密码的问题

这里提供两种方法。

第一种就是像本文第3步所演示的那样,使用 echo "密码" | sudo -S 执行的命令 但这种做法没有解决到根本问题;

第二种是直接将用户添加到root下,从而实现每次的sudo命令都会直接执行,以下是设置步骤。

1、命令行sudo su进入root模式

2、输入sudo visudo,在文末添加以下内容

用户名    ALL=(ALL)NOPASSWD:ALL

# 我的用户名是dji,所以我添加的是:
dji      ALL=(ALL)NOPASSWD:ALL

3、Esc,:,wq!,回车即可

10、关于妙算不接显示器无法进入桌面的问题

此时应该考虑的是显示管理器的问题。该问题很严重,如果不解决的话,后面的自启程序就直接失效了,解决方法是更换显示管理器,妙算默认的界面管理器是gdm3,问题就出在这个gdm3上,将其更换为lightdm即可,执行下面的第三条命令进行lightdm的安装,lightdm是个人选择,可以根据喜好选择下面的图形管理器。安装完lightdm后会立马让你在gdm3和lightdm做出选择,选择lightdm即可。使用lightdm的前提是完成了本文第8步自动登录的设置,否则无法进入桌面,第8步针对的是使用gdm3的情况,但后面发现gdm3在不接显示器的情况下无法进入桌面。更换成lightdm后,直接在用户账户里设置就能实现自动登录了,并不需要做第8步的多余步骤。

  • Gnome系列图形管理器:gdm、gdm3
# Ubuntu默认界面管理器:gdm3
sudo apt-get install gdm3
  • KDE系列图形管理器:KDM、SDDM
# LUbuntu默认界面管理器:sddm
sudo apt-get install sddm
  • Canonical公司系列图形管理器:Lightdm
# XUbuntu默认界面管理器:lightdm
sudo apt-get install lightdm
  • Linux可切换其他界面系统
sudo dpkg-reconfigure lightdm
  • 查看当前使用的显示管理器
cat /etc/X11/default-display-manager
  • 卸载示例
sudo apt-get remove lightdm
  • 服务启动 
sudo systemctl start lightdm

11、命令行模式与图形化模式的切换方法

  • 查看当前启动模式
systemctl get-default
  • 更改模式命令:
# 由命令行模式更改为图形界面模式
systemctl set-default graphical.target

# 由图形界面模式更改为命令行模式
systemctl set-default multi-user.target
  • 命令行界面下启动图形界面,执行startx命令
  • 图形界面下切换为命令行界面,Ctrl+Alt+F1~F8

 12、给定tty*串口永久读写权限

sudo usermod -aG dialout dji

或者,创建文件/etc/udev/rules.d/70-ttyusb.rules,写入
KERNEL==“ttyUSB[0-9]*", MODE="0777"

13、绑定tty*串口

 插入ch34x设备,终端输入lsusb,得

 其中,1a86是idVendor,7523是idProduct,编写/etc/udev/rules.d/ch34x.rules,写入

KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", GROUP:="dialout", SYMLINK+="ttyCH34x"

 其中ttyCH34x是ttyUSB*产生的新别名,然后使规则生效

sudo udevadm trigger

ls -l /dev/tty*,查看绑定是否成功 ,可知下图已经软链接成功

14、 jetson tx2开启最大性能

jetson tx2默认只开启了4个cpu核,隔离和禁用了DENVER2处理器,即cpu1和cpu2,下面将演示如何开启这两个cpu,参考博客

1、用jtop查看NV Power的模式,系统的默认mode3,即MAXP_CORE_ARM模式

2、NV Power对应表

3、NVP modes切换,鼠标点击即可切换,也可以用命令sudo nvpmodel -m [0-3]来切换

4、切换至最大功耗模式,即MAXN,对应mode为0,也可以通过jtop切换

sudo nvpmodel -m0

5、cpu1和cpu2虽然开启了,但不运作,原因在第2步对应的图里有解释

6、取消DENVER2处理器的隔离状态

# 常规,系统未迁移至固态硬盘
1、输入cat /proc/cmdline,找到isolcpus=1-2,这就是默认隔离核心的代码
2、打开配置文件:sudo vim /boot/extlinux/extlinux.conf
3、找到配置文件里的isolcpus=1-2,将1-2删除即可


# 非常规,系统迁移到了固态硬盘
# 由于我将妙算的系统迁移到了SSD上,所以跟常规的操作略有不同
1、输入cat /proc/cmdline,找到isolcpus=1-2,这就是默认隔离核心的代码
2、打开文件管理器,找到30GB板载的磁盘,打开里面的boot目录,先备份后修改/extlinux/extlinux.conf为以下内容,不要全抄,APPEND后面的内容是参考了SSD盘上的/boot/extlinux/extlinux.conf文件的,只不过是删除了1-2

TIMEOUT 30
DEFAULT satassd

MENU TITLE L4T boot options

LABEL satassd
      MENU LABEL primary SATA SSD
      LINUX /boot/Image
      INITRD /boot/initrd
      APPEND usbcore.usbfs_memory_mb=1000 ${cbootargs} quiet root=/dev/sda1 rw rootwait rootfstype=ext4 console=ttyS0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0 isolcpus=

3、不用修改SSD上的/boot/extlinux/extlinux.conf文件

重启

7、压力测试

# 安装stress-ng压力测试工具
sudo apt install stress-ng

# 开启6核压力测试
stress-ng --cpu 6 --timeout 5m --cpu-method bitops

# 用jtop或top查看cpu情况,如果使用top的话,top后按1即可

end

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python珠玑妙算是一道猜数字游戏,游戏规则如下:系统随机生成一个长度为4的字符串,字符串由RGBY四个字符组成,且字符可以重复。玩家需要在10次机会内猜出系统生成的字符串,每次猜测后系统会给出两个数字,分别表示猜对了几个字符且位置正确(称为A),以及猜对了几个字符但位置不正确(称为B)。玩家需要根据系统给出的A和B来推测系统生成的字符串。 以下是一个Python珠玑妙算的实现,其中引用和引用分别提供了两种不同的实现方式: ```python # 引入必要的库 import random from typing import List # 实现珠玑妙算游戏 class Solution: def masterMind(self, solution: str, guess: str) -> List[int]: # 初始化变量 j = 0 answer = [0, 0] # 遍历solution字符串 for _ in solution: # 如果当前字符与guess字符串中对应位置的字符相同 if _ == guess[j]: # A加1 answer[0] += 1 # 将guess和solution中对应位置的字符都替换为空 guess = guess.replace(_, "", 1) solution = solution.replace(_, "", 1) else: # 否则j加1 j += 1 # 遍历guess字符串 for _ in guess: # 如果当前字符不为空 if _ != "": # 计算guess和solution中当前字符的出现次数 count1 = guess.count(_) count2 = solution.count(_) # 如果guess中当前字符出现次数大于1,将guess中所有当前字符都替换为空 if count1 > 1: guess = list(filter(lambda x: x != _, guess)) # B加上guess和solution中当前字符出现次数的最小值 answer[1] += min(count2, count1) # 返回结果 return answer # 生成随机字符串 def generate_random_string(): colors = ['R', 'G', 'B', 'Y'] return ''.join(random.choices(colors, k=4)) # 主函数 if __name__ == '__main__': # 初始化变量 solution = generate_random_string() guess = '' count = 0 # 循环10次 while count < 10: # 获取用户输入 guess = input('请输入你猜测的字符串(由RGBY四个字符组成,且字符可以重复):') # 判断用户输入是否合法 if len(guess) != 4 or not all(c in 'RGBY' for c in guess): print('输入不合法,请重新输入!') continue # 调用珠玑妙算函数 result = Solution().masterMind(solution, guess) # 输出结果 print('A:{}, B:{}'.format(result[0], result[1])) # 如果猜对了,退出循环 if result[0] == 4: print('恭喜你猜对了!') break # 否则次数加1 count += 1 # 如果次数用完了,输出答案 if count == 10: print('很遗憾,你没有在规定次数内猜对,答案是:{}'.format(solution)) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值