第 9 節

其他操作

0瀏覽次數0訪問次數--跳出率--平均停留

工控機如何連wifi

當我們工控機從一個環境移動到另一個環境,且新的環境的wifi我們沒有連接過,我們沒有屏幕如何讓工控機連上網呢?

進入工控機的硬盤目錄,進入/etc/netplan/,底下有很多yaml,找到一個最符合下方格式的yaml:

network: 
  version: 2 
  wifis: 
    NM-6f414fe0-2658-48ff-89ee-c7981b87bc96: 
      renderer: NetworkManager 
      match: 
        name: "wlan0" 
      dhcp4: true 
      dhcp6: true 
      access-points: 
        "EMIS_Vinci_Robocon_5G": 
          auth: 
            key-management: "psk" 
            password: "vinci666" 
          networkmanager: 
            uuid: "6f414fe0-2658-48ff-89ee-c7981b87bc96" 
            name: "EMIS_Vinci_Robocon_5G" 
            passthrough: 
              wifi-security.auth-alg: "open" 
              ipv6.addr-gen-mode: "default" 
              ipv6.ip6-privacy: "-1" 
              proxy._: "" 
      networkmanager: 
        uuid: "6f414fe0-2658-48ff-89ee-c7981b87bc96" 
        name: "EMIS_Vinci_Robocon_5G"

將其改爲新wifi的名和密碼:

network:
  version: 2
  wifis:
    wlan0:
      dhcp4: true
      dhcp6: true
      access-points:
        "EMIS_Vinci_Robocon_5G":
          password: "vinci666"

工控機開機即可連上網。

SSH遠程開發

環境準備

1.硬件準備

首先要有一臺工控機(X86小型電腦,專業工控機,樹莓派等等)。

控制系統的硬件載體是具有多樣性的,常用的多是基於ARM、x86等架構的處理器,比如:PC、工控機、樹莓派、NVIDIA Jetson...。不同的處理器都存在一定的優缺點,PC和工控機,處理器性能強大,但是功耗高、體積大、靈活性差,嵌入式系統則反之。對於我們而言,可以根據機器人平臺的電氣、載重、空間以及用途等諸多要素自主選擇合適的控制系統。

無論選用何種處理器,只要是要進行機器人的開發,安裝了ROS或者ROS2,那麼對於開發人員而言,在使用上,沒有任何本質的區別,或者換言之,作爲軟件工程師,部分場景下無需關注於硬件的選型。

2.設置固定IP

遠程連接時,不管使用何種工具,需要根據IP地址定位到被連接的主機,再通過賬號和密碼登錄該主機,因此,我們需要先獲取該IP地址。並且每次連接時,都需要使用到IP,爲了保證連接的便利性和穩定性,最好將被連接主機的IP地址設置爲固定IP,具體操作如下。

1.進入設置界面

啓動被連接的主機(啓動時需要連接顯示器或使用HDMI採集卡,並且配置完SSH遠程訪問之後,可以不再使用顯示器或HDMI採集卡),並進入設置界面。

2.配置所連接的網絡

3.設置固定IP

查看當前IP地址。

設置固定IP。

至此,IP配置完畢。

環境搭建

概念

SSH(Secure Shell)是一種通用的、功能強大的、基於軟件的網絡安全解決方案。計算機每次向網絡發送數據時,SSH都會自動對其進行加密。數據到達目的地時,SSH自動對加密數據進行解密。整個過程都是透明的,使用OpenSSH工具將會增進你的系統安全性。SSH安裝容易、使用簡單。

實現

SSH實現架構上分爲客戶端和服務器端兩大部分,客戶端是數據的發送方,服務端是數據的接收方,當前場景下,我們需要從本地主機發送數據到遠程主機,那麼本地主機需要安裝並啓動SSH客戶端,而遠程主機則需要安裝並啓動SSH服務端,整個實現具體流程如下:

  1. 本地主機安裝SSH客戶端,遠程主機安裝SSH服務端;
  2. 遠程主機啓動SSH服務;
  3. 本地主機登陸遠程主機;
  4. 實現數據傳輸。

1.安裝SSH客戶端與服務端

默認情況下,Ubuntu系統已經安裝了SSH客戶端,因此只需要在遠程主機安裝SSH服務端即可,安裝命令如下:

 sudo apt install openssh-server

如果SSH客戶端需要自行安裝,那麼調用如下命令:

sudo apt install openssh-client

2.遠程主機啓動SSH服務

遠程主機啓動 ssh 服務命令如下:

sudo /etc/init.d/ssh start

啓動後可使用如下命令查看服務是否正常運行:

ps -e | grep ssh

如果啓動成功,會包含 sshd 程序。

以後需要頻繁的使用ssh遠程登錄,爲了簡化實現,可以將遠程主機的ssh服務設置爲開機自啓動,命令如下:

sudo systemctl enable ssh

3.本地遠程登錄

登錄遠程主機可以調用如下命令:

ssh -X 用户名@ip地址

然後根據提示,錄入登陸密碼,即可成功登錄。

如果退出,可以調用exit命令:

exit

4.實現數據傳輸

通過SSH在本地主機只需調用相關指令,便可方便的實現與遠程主機的數據上傳或下載,指令格式如下所示:

上傳文件指令格式如下:

scp 本地文件路径 账号@ip:路径

上傳文件夾指令格式如下:

scp -r 本地文件夹路径 账号@ip:路径

下載文件指令格式如下:

scp 账号@ip:路径 本地文件夹路径

下載文件夾指令格式如下:

scp -r 账号@ip:路径 本地文件夹路径

優化

每次遠程登錄時,都需要輸入密碼,使用不方便,可以藉助密鑰簡化登錄過程,實現免密登錄,提高操作效率。實現思想是:生成一對公鑰私鑰,私鑰存儲在本地,公鑰上傳至服務器,每次登錄時,本地直接上傳私鑰到服務器,服務器有匹配的公鑰就認爲是合法用戶,直接創建SSH連接即可。具體實現步驟只有兩步:

  1. 本地生成密鑰對;
  2. 將公鑰上傳至遠程主機。

1.生成密鑰對

本地客戶端生成公私鑰:(一路回車默認即可)

ssh-keygen

上面這個命令會在用戶目錄.ssh文件夾下創建公私鑰:

  1. id_rsa (私鑰);
  2. id_rsa.pub (公鑰)。

2.公鑰上傳

上傳指令如下:

ssh-copy-id -i ~/.ssh/id_rsa.pub 账号@ip

上面這條指令是將本地公鑰上傳到遠程主機的ssh目錄下,該目錄下有文件authorized_keys保存了公鑰內容。

以後再遠程登錄就無需錄入密碼了。

使用VScode優化

上一節,我們介紹了ssh遠程連接的使用,但是如果只是純粹使用ssh也存在一些不足,比如:編輯文件內容時,需要使用vi編輯器,且在一個終端內,無法同時編輯多個文件。本節將介紹一更爲實用的功能——VSCode結合插件實現遠程開發,這使我們可以以圖形化的方式實現遠程開發,比ssh的使用更方便快捷,可以大大的提高程序開發效率。

1.準備工作

VScode遠程開發依賴於ssh,請首先按照上一節內容配置ssh遠程連接。

2.爲VScode安裝遠程開發插件

啓動VScode,首先點擊側邊欄的擴展按鈕,然後在扩展:商店的搜索欄輸入Remote Development並點擊同名插件,最後在右側顯示區中點擊安装

3.配置遠程連接

步驟1:使用快捷鍵ctrl + shift + p打開命令輸入窗口,並輸入Remote-SSH:Connect to Host...,彈出列表中選擇與之同名的選項。

步驟2:步驟1完成將彈出一個新的命令窗口如下,選擇下拉列表中的 Add New SSH Host

步驟3:步驟2完成又將彈出一個新的命令窗口,在其中輸入:ssh -X ubuntu@192.168.43.164,其中,ubuntu需要替換爲你的登錄用戶名,192.18.43.164 則替換爲被遠程連接主機的ip地址。

步驟4:選擇步驟3完成後的彈窗列表中的第一個選項(或直接回車),即可完成配置,配置成功後會有提示信息。

4.使用

步驟1:繼續使用快捷鍵ctrl + shift + p打開命令輸入窗口,並輸入Remote-SSH:Connect to Host...,此時列表中將顯示步驟3中配置的ip地址,直接選擇,選擇後,VScode將打開一個新的窗口。

或者,也可以點擊側邊欄的远程资源管理器,在彈出的服務器列表中選擇要連接的服務器,並右擊,選擇在本窗口或新窗口中實現遠程連接。

步驟2:選擇菜單欄的文件下的打开文件夹,在彈窗列表中選擇需要打開的文件夾並點擊確定即可。

最終,我們就可以像操作本地文件一樣實現遠程開發了。

遠程桌面

因爲用X11轉發效率太低太低,所以還是要選用遠程訪問桌面的形式來看Rviz2和Gazebo等等(如果有需求的話)

我們選擇使用VNC來看。

  1. 安裝VNC服務器:

這裏以TigerVNC爲例進行安裝:

sudo apt install tigervnc-standalone-server tigervnc-common
  1. 設置VNC密碼:

爲VNC用戶設置密碼,運行以下命令:

vncpasswd
  1. 配置VNC啓動腳本:

創建VNC配置文件,在用戶家目錄內的.vnc文件夾中創建啓動文件:

mkdir -p ~/.vnc
nano ~/.vnc/xstartup

在打開的編輯器裏面輸入以下內容(以GNOME爲例):

#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
gnome-session

保存並退出(在nano中按Ctrl + O保存,然後按Ctrl + X退出)。

  1. 給予執行權限:

爲xstartup文件設置執行權限:

chmod +x ~/.vnc/xstartup
  1. 啓動VNC服務器:
vncserver -geometry 1920x1080 -localhost=0

geometry 選項指定窗口大小,localhost 選項設爲 0 以開放連接。(設爲1是隻允許本地連接)

你將看到類似於:1的輸出,這表示VNC會話的顯示編號。例如,如果輸出爲:1,則VNC監聽的端口爲5901(5900 + 顯示編號)。

  1. 查看已開啓的VNC服務器:
vncserver -list

  1. 連接到VNC服務器:

使用VNC客戶端(如vncviewer)連接到VNC服務器,輸入你的服務器IP和端口。例如,如果服務器IP爲192.168.31.10,且顯示編號爲1,你應該連接到192.168.31.10:1,或者直接輸入192.168.31.10:5901。

  1. 停止VNC服務器:

如果需要停止VNC服務器,可以使用以下命令:

vncserver -kill :1

將:1替換爲你實際使用的顯示編號。

USB端口設置

首先先配置好權限


# 将用户权限提高
sudo usermod -aG dialout $USER
newgrp dialout

# 查看下面命令是否输出dialout(若输出才正常)
groups

因爲我們插拔USB設備,他的端口號可能會一直變,所以我們要給他的tty起一個固定的別名。

根據USB設備綁定端口(多個不同設備)

需求: Ubuntu系統中現接入雷達和智能小車,請爲二者綁定端口。

實現原理: 可以通過USB設備本身的“標識”實現端口綁定。

流程如下:

(1).查找設備idVendor和idProduct

接入兩個USB設備,在終端調用指令lsusb查看顯示系統中以及連接到系統的USB設備信息。

如上圖所示,紅色方框內數據爲USB設備,ID後面的1a86:7523分別爲USB的idVendor和idProduct(兩個參數之間使用”:“分隔)。

另外:可以通過重新插拔比較的方式確定哪些數據對應接入的USB設備。

(2).編寫映射規則

/etc/udev/rules.d目錄下新建文件xxx.rules(文件名自定義)

sudo vim /etc/udev/rules.d/xxx.rules

輸入如下內容:

KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0777", SYMLINK+="mylidar"
KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="mycar"

代碼解釋:

  • KERNEL是內核固定名稱,這裏統一是“ttyUSB*”;
  • MODE是節點權限,通常改爲“0777”,表示可讀寫可運行;
  • SYMLINK是符號連接,即綁定的別名;
  • ATTRS是設備廠商的唯一標識,idVendor和idProduct正好組成上面通過lsusb查找到的設備ID。

***小提示:***一般的USB設備供應商都會提供類似的腳本文件,對於調用者而言,直接複製該文件到/etc/udev/rule.d目錄即可。

設備類型內核名稱示例說明
USB 串口設備ttyUSB*USB 轉串口設備,如 /dev/ttyUSB0
串口設備ttyS*物理串口設備,如 /dev/ttyS0
存儲設備sd*SCSI 磁盤設備,如 /dev/sda
網絡設備eth*以太網設備,如 /dev/eth0
輸入設備event*輸入事件設備,如 /dev/input/event0
藍牙設備rfcomm*藍牙串口設備,如 /dev/rfcomm0

(3).使規則生效

在終端下輸入如下指令:


# Ubuntu用下方命令
sudo service udev reload
sudo service udev restart

#Fedora用下方命令
sudo udevadm control --reload
sudo udevadm trigger

再重新插拔設備即可。

(4).測試

終端下輸入如下指令

ll /dev | grep ttyUSB

運行結果如下:

也可以多次插拔USB設備,會發現設備端口ttyUSBn中的n編號會變動,但是別名是始終可以指向對應的USB設備的。至此,就可以使用別名來關聯所需使用的USB設備了。

缺點:

上述實現也存在一定的侷限性,當Ubuntu接入兩臺或多臺相同型號的USB設備時,由於設備ID是一樣的,該種實現方式只會對其中的一臺設備生效,這種情況下,就需要通過第二種策略來實現端口的綁定了。

根據主機硬件綁定端口(多個相同設備)

需求: 無人車中現接入一前一後兩臺相同型號的雷達,請爲二者綁定端口。

實現原理: USB設備所連接主機的USB接口也是有其“標識”的,可以通過這個標識實現端口綁定。

流程如下:

(1).查看所連接的主機USB接口的KERNELS

調用如下指令查看第一臺雷達的USB信息:

udevadm info --attribute-walk --name=/dev/ttyUSB0 | grep KERNELS
udevadm info --attribute-walk --name=/dev/ttyACM0 | grep KERNELS

調用如下指令查看第二臺雷達的USB信息:

udevadm info --attribute-walk --name=/dev/ttyUSB1 | grep KERNELS

運行結果相比較不同的KERNELS,第一臺雷達端口地址爲KERNELS==1-1.3:1.0,第二個雷達端口地址爲KERNELS==1-1.4:1.0。可以使用此數據作爲不同端口的“唯一性標識”。

(2).編寫映射規則

/etc/udev/rules.d目錄下新建文件xxx.rules(文件名自定義),輸入如下內容:

sudo vim /etc/udev/rules.d/xxx.rules
KERNEL=="ttyUSB*", KERNELS=="1-1.3:1.0", MODE:="0777", SYMLINK+="rplidar_front"
KERNEL=="ttyUSB*", KERNELS=="1-1.4:1.0", MODE:="0777", SYMLINK+="rplidar_back"

(3).使規則生效

在終端下輸入如下指令:


# Ubuntu用下方命令
sudo service udev reload
sudo service udev restart

#Fedora用下方命令
sudo udevadm control --reload
sudo udevadm trigger

再重新插拔設備即可。

(4).測試

終端下輸入如下指令,運行結果如下:

ll /dev | grep ttyUSB

至此,就可以使用別名來關聯所需使用的USB設備了。

缺點: USB設備必須連接在主機的指定端口上,否則,會導致端口綁定失敗,或產生邏輯錯誤。(而且增加新設備可能會導致端口改變)

根據其他屬性綁定端口

(1).查看所連接的主機USB接口的信息

udevadm info -a -p $(udevadm info -q path -n /dev/ttyACM0)
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)

這些數據都是不會變的,所以可以拿這些數據來做標識

(2).編寫映射規則

/etc/udev/rules.d目錄下新建文件xxx.rules(文件名自定義),輸入如下內容:

sudo vim /etc/udev/rules.d/xxx.rules
KERNEL=="ttyACM*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d4", ATTRS{serial}=="0001", MODE:="0777", SYMLINK+="ttyACM_Lidar"
KERNEL=="ttyACM*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="55d4", ATTRS{serial}=="0002", MODE:="0777", SYMLINK+="ttyACM_MCU"
KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", SYMLINK+="ttyUSB_IMU"

(3).使規則生效

在終端下輸入如下指令:


# Ubuntu用下方命令
sudo service udev reload
sudo service udev restart

#Fedora用下方命令
sudo udevadm control --reload
sudo udevadm trigger

再重新插拔設備即可,或者 直接重啓系統。

(4).測試

終端下輸入如下指令ll /dev | grep ttyUSB,運行結果如下:

至此,就可以使用別名來關聯所需使用的USB設備了。

缺點: 一些設備可能沒有串口號等。

其他注意事項

並非所有的USB設備端口號都是ttyUSBn的格式,比如Arduino的端口號可能是ttyACMn,而對於USB攝像頭而言,一臺設備則對應兩個端口號,分別是videonvideo(n+1),並且啓用攝像頭設備一般使用的是videon端口,綁定時需要關聯的也是該接口。

但是無論是外接何種USB設備,也不管採用上述兩種方案的哪一種進行端口綁定,其原理都是類似的,只是實現細節不同而已。如果是外接的Arduino設備,那麼需要在rules文件中的將KERNEL=="ttyUSB*"修改爲KERNEL=="ttyACM*",如果外接的是USB攝像頭,那麼則需要在rules文件中的將KERNEL=="ttyUSB*"修改爲類似於KERNEL=="video[0,2,4,6]"的格式,其中video[0,2,4,6]表示可以綁定的端口爲video0video2video4video6

Linux分區Gui工具

sudo apt install gparted
sudo dnf install gparted

掛載內網網頁

可以把本地的網頁掛載到路由器端,或者同內網段其他設備上,甚至可以掛載在本地。

下面以安卓設備爲例子,由於安卓設備暫時不能直接打開html,所以我們可以把html掛載到本地服務器,再通過瀏覽器查看。

由於安卓系統基於Linux內核,所以我們可以下載一個叫termux的app來敲一些Linux命令:

https://github.com/termux/termux-app

首先打開app後,先更新軟件緩存:

pkg update

然後換源

nano $PREFIX/etc/apt/sources.list

將該文件內容替換爲下面:

deb https://mirrors.bfsu.edu.cn/termux/termux-packages-24 stable main
  • 如果你使用的是nano編輯器:
    • Ctrl+O 保存文件。
    • Enter 確認文件名。
    • Ctrl+X 退出編輯器。
  • 如果你使用的是vim編輯器:
    • Esc 退出編輯模式。
    • 輸入 :wq 保存並退出。

接下來重新更新軟件源:

pkg update && pkg upgrade

安裝python:

pkg install python3

通過Termux訪問設備存儲

如果文件在安卓設備上,可以使用Termux的文件管理器訪問設備的存儲:

termux-setup-storage
  1. 進入HTML文件所在的目錄
    1. 使用cd命令進入HTML文件所在的目錄:
cd ~/your_html_folder
  1. 啓動Python HTTP服務器
    1. 運行以下命令啓動一個簡單的HTTP服務器:
    python3 -m http.server 8000
    
    1. 這會在端口8000上啓動一個Web服務器。
  • 啓動服務器後,Termux會顯示日誌信息,例如:
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
  • 這表示服務器已成功啓動。

在瀏覽器中訪問HTML文件

  1. 在同一設備上訪問
    1. 打開安卓設備上的瀏覽器(如Chrome),輸入以下地址:
    http://localhost:8000
    
    1. 如果HTML文件中有index.html,它會自動加載;否則,你需要手動點擊文件鏈接。

RustDesk

RustDesk無人值守遠程控制

目前rustdesk還沒辦法進行無人值守在wayland下,所以我們需要把登陸密碼,鎖屏和休眠待機全部關掉.

設置 KDE6 自動登錄
  1. 可以先查自己的sddm類型
ls /usr/share/xsessions/
ls /usr/share/wayland-sessions/

看哪個會輸出東西,輸出東西的文件夾就是你擁有的sddm,比如xsessions輸出內容的話,那就是x11的sddm,如果wayland-sessions輸出內容的話你就是wayland的sddm.

  1. 編輯 SDDM 配置:
sudo nano /etc/sddm.conf

在文件最上面有個Autologin,在這個底下加入下面的內容:

[Autologin]
User=你的用户名
Session=plasma.desktop   # 或 plasma.desktop(X11),方案一可用 Wayland
  1. 保存退出後重啓 SDDM:
sudo systemctl restart sddm

✅ 開機後自動進入桌面,無需輸入密碼

關閉鎖屏在 KDE6 系統設置裏:

打開 系統設置 → 屏幕鎖定(Screen Locking) 關閉自動鎖定 關閉屏幕關閉 / 屏幕保護鎖定 這樣 RustDesk 可以開機後直接控制桌面,不會被鎖屏阻擋

關閉休眠系統設置 → 電源管理(Power Managerment)

禁用“休眠”或“自動掛起” 保證電腦開機一直在線,RustDesk 可隨時遠控 如果必須休眠,可在 BIOS 設置裏禁用休眠,保證開機即聯網

RustDesk自建服務器

在服務器端安裝
命令行方式
  1. 打開官網:https://rustdesk.com/docs/zh-cn/self-host/

alt text

  1. 用ssh訪問你需要安裝RustDesk的服務器
ssh tungchiahui@10.0.0.4

alt text

  1. 使用方法二的命令

alt text

wget https://raw.githubusercontent.com/techahold/rustdeskinstall/master/install.sh
chmod +x install.sh
./install.sh

./install.sh的設置看下一節

  1. 配置與查看KEY

這裏如果你是想直接用公網ip則選擇1)IP,如果你是DDNS等用域名綁定了IP地址,則選擇2).

alt text

這個選2)No

alt text

這個是KEY,要複製下來,等後面軟件配置的時候要用.

alt text

  1. 配置防火牆
    1. 如果你是Debian系 安裝防火牆
    sudo apt install ufw
    

    配置防火牆
    sudo ufw allow 22
    
    ufw allow 21114:21119/tcp
    ufw allow 21116/udp
    sudo ufw enable
    
    1. 如果你是RHEL系 安裝防火牆
    # 如果你是RHEL系
    sudo dnf install firewalld
    sudo systemctl enable --now firewalld
    

    配置防火牆
    sudo firewall-cmd --add-port=22/tcp --permanent
    sudo firewall-cmd --reload
    
    sudo firewall-cmd --add-port=21114-21119/tcp --permanent
    sudo firewall-cmd --reload
    
    sudo firewall-cmd --add-port=21116/udp --permanent
    sudo firewall-cmd --reload
    
    sudo systemctl enable --now firewalld
    
1Panel方式
  1. 在面板裏搜RustDesk並安裝

alt text

  1. 配置防火牆

alt text

添加幾個端口 alt textalt textalt text

  1. 查看KEY alt text

複製KEY

alt text

自建服務器後配置RustDesk軟件
  1. PC端

alt text

alt text

出現就緒就是配置成功了 alt text

  1. 移動端

alt text

alt text

注意的問題

如果你是家庭的內網服務器,則需要讓路由器也放行對應端口

找到openwrt防火牆設置,點擊添加 alt text

alt text

alt text

這樣纔可以讓你的服務器端口被真正成功放行.

音乐页