1. 程式人生 > >raspberry pi3B+ 從刷系統到安裝ros1.0-kinetic+遠端連線pc+除錯turtlebot

raspberry pi3B+ 從刷系統到安裝ros1.0-kinetic+遠端連線pc+除錯turtlebot

1    下載raspberry 所支援的系統可以從以下網址下載,注意:因為我們是要最終跑ros系統的的所以我們要儘可能的安裝ros官網對應ros發行版的系統,以避免安裝ros過程中出現的不必要的麻煩。

raspberry 官網:https://www.raspberrypi.org/

linux社群:https://wiki.ubuntu.com/ARM/RaspberryPi

下載系統映象以.img或者.img.xz類似的字尾名,下載時要選擇和你raspberry韌體版本匹配的系統(尤其是在下載第三方提供的映象檔案),raspberry官網推薦使用noods這個超級簡單的方式進行安裝,嘗試過確實很便捷。

2    前期準備工作

2.1    一張大於8g的sd卡,用來燒錄系統,同時相當於你的raspberry機械硬碟,注意sd卡格式必須是FAT/FAT32,容量大於32g的sd卡大多是exfat格式,windows使用者需要通過sd-format軟體將其格式化成fat32,而linux使用者只需要開啟磁碟工具直接格式化成fat32就可以了;

2.2    讀卡器,將tf卡或者sd卡與你的pc機相連;

2.3    如果是windows使用者需要通過win32這個燒錄工具將映象寫入到sd卡;

         如果是linux使用者,開啟磁碟工具就可以直接將系統刻錄到sd卡。

3    燒錄系統

3.1    使用raspberry官網推薦的noods安裝系統,只需要將noods下載下來,讓後解壓到你的sd卡,然後將sd卡插入到樹莓派,就可以了。

3.2    使用第三方的映象包或者linux社群的官方包和第三方包,需要通過刻錄的形式將系統映象檔案寫入到sd卡。

windows使用者可以通過磁碟工具檢視sd卡的狀態,會發現你的sd卡被劃分成了三個區域,空閒區域大約50M左右,fat區域(即boot盤)系統可以開啟,還有一個ext4區域(系統的root盤)這個區域linux使用者可以直接檢視到;還有一個較大的空閒區域,你的系統最終會被安裝到這個位置。如下圖所示,

root盤如下所示,系統版本不同,可能有所差別,我的是ubuntu mate 16.04

boot盤中的內容:

至此你的系統已經燒錄完成了。

4    講解root和boot盤中的內容。

root盤中的內容就是ubuntu(linux)系統的基本結構,可以理解成windows的C盤中的內容。使用過linux系統的應該都很熟悉

boot盤中的內容為驅動內容,包括raspberry的cpu驅動,kernel核心,啟動項,配置檔案等。看boot盤中的內容可以看到很多BCM開頭的內容,這個是與你的raspberry的cpu型號相關的,你看一看這你的cpu型號來核查,這裡是否包括你的raspberry的啟動項,如果沒有,那麼啟動時會出現彩虹屏,無法安裝系統的問題。後面會講到這個內容。還有連個檔案比較重要,就是cmdline.txt和config.txt這裡面存放的是你的raspberry的系統設定。

5     安裝系統配置raspi-config

燒錄完成後,將sd卡插入到raspberry中,接上電源和你的滑鼠鍵盤,開機,一路傻瓜式安裝,正確配置即可。

6     無顯示屏怎麼安裝,網上很多是關於此的內容,大概有三種方法

6.1    將樹莓派通過網線接入到路由器和你的pc在同一個區域網中

6.2    通過串列埠連線你的raspberry和你的pc機

6.3    通過乙太網和你的樹莓派連線

注意,這些方法只適用於你的raspberry已經成功安裝了系統或者已經成功安裝過系統,因為只有這樣,才不會在第一次開啟raspberry時進入raspi-config介面,因此如果很不幸,你的raspberry剛剛拿到手一次都沒有開過機或者安裝過系統配置過raspi-config,那麼你沒法通過這三種方法連線到你的raspberry,這是因為你的raspberry開機時第一次會卡在raspi-config介面,而這個時候你的系統還沒有安裝上,因此,你比系通過連線顯示器來,設定好raspberry的配置。

這個事情卡了我很久,最終也驗證了我的想法。

7    如果你正常安裝了你的系統,那麼只需要將你的raspberry和你的pc連線到同意區域網就可以遠端控制你的raspberry了,推薦通過ssh的方式。

7.1    連線在同一個區域網環境,pc連線路由,raspberry連線路由,那麼你只要找到raspberry的ip地址通過

ssh [email protected]

就可以連線他了,然後輸入raspberry的密碼就可以了

7.2    通過Ethernet連線到同一個區域網環境。這時候你需要你的pc通過wifi連線網路(win下的教程很多,就不說了,主要說ubuntu下的配置),然後將網線連線pc和raspberry,同時給raspberry上電,這是你可以在ubuntu設定中看到一個network的tag標籤,你點開後,選擇ipv4,選擇手動設定,手動設定好你的pc機ip地之後,將raspberry shutdown斷電,取出sd卡,通過讀卡器連線你的電腦,在boot盤下的cmdline.txt中末尾,新增ip=xxx.xxx.xxx.xxx即可,設定你的raspberry和你電腦連線時的ip address。如下圖所示:

這時候將sd卡插回到你的電腦,這樣就可以正常連線了,注意仍然是通過ssh指令進行連線。

8    安裝ros系統到你的raspberry

以上步驟都完成之後,可以參考ros官網通過的raspberry pi安裝ros的教程,親測可用。

link:http://wiki.ros.org/ROSberryPi

注意要根據你的raspberry系統選擇對應的ros系統。

9    截止2018年09月05日 raspberry pi 3B+的三方映象包還沒有正式可以使用的,不過參考linux社群的連線,之前我列出的那個連線地址,在這個位置

                             

可以看到官方映象說,對於3/3B+是可以使用2的映象包的,只需要做出如下修改,點開below我們可以看到

 

找到上圖顯示的位置,我們可以按照要求來做。我是用的是ubuntu mate為raspberry pi 3製作的映象包,我嘗試按照上面的方式做出改變,這也確實解決了缺少3B+的驅動從而導致的開機彩虹屏的問題,但是進入安裝介面時,我的滑鼠鍵盤無法使用,因此最終也沒法繼續安裝。檢視網上的回答,大多認為是移植kernel的問題,因此最終我還是決定等待3B+的定製ubuntu mate,因此我現在安裝了raspberry推薦的raspbian debian stretch系統。

10    給raspberry安裝ros-kinetic系統(從源的方式安裝)

開啟上面貼出的ros官網的raspberry安裝ros的連結,如下圖

因為我的raspberry系統是基於debian stretch的linux系統,檢視ros發行版,我其實只能安裝melodic和lunar版本的ros,但是我想安裝kinetic版本的ros,而且教程中只提供了kinetic的而沒有melodic和lunar因此,點開kinetic的教程,按照步驟進行安裝,最終成功的實現了在raspdebian上安裝ros-kinetic,注意編譯構建的時間會很長,耐心等待。

update......2018年09月07日

11    接著第9節,我遇到的滑鼠鍵盤不能使用的問題,可以用如下的方法解決:

滑鼠鍵盤:用最新的驅動覆蓋原來的舊驅動 在資料夾 /lib/modules/4.*-v7

這樣成功解決了滑鼠鍵盤不能使用的辦法,系統正常安裝了。

這個4.*-v7的驅動包,可以使用noods安裝raspbian系統後,在命令列使用

sudo rpi-update

獲得最新的驅動,然後拷到你ubuntu mate16.04的包/lib/modules的位置,刪除舊的驅動包。

如果你沒有成功解決這個問題,可以聯絡我傳送一份raspberry pi3B+可以之間安裝ubuntu mate16.04修改後的映象檔案

[email protected]

當然你也可以參考這個地址,來解決你的問題,link:https://www.raspberrypi.org/forums/viewtopic.php?p=1301856

12    第10節我嘗試從源的方式安裝ros系統,雖然成功了,但是如果要自己建立新的包,或者配置依賴關係會很麻煩,而且會花費大量的時間在構建編譯上,這絕不是我所想要的,因此,我通過9,11兩節的方式,裝回了ubuntu mate16.04,然後按照ros官網的kinrtic教程順利完成了了ros的安裝,這樣在raspberry上使用ros和在pc機上使用是一模一樣的,而且安裝起依賴包以簡單的多。

13    在執行rpi-update更新raspberry的核心時總是遇到EOF的問題,這是因為網路不好導致的壓縮包下載不完全,因此,查閱了很長時間後,發現解決辦法是,等你網路好的時候在執行,只有當網路流暢時,才能正常update,在多次嘗試後,最終也成功的update kernel了。

14   解決開機出現[Failed] Failed to start Load Kernel Modules. 的問題

這是因為預設載入的kernel,其實在路徑中並不存在的問題,解決辦法

sudo vim /etc/modules-load.d/cup*.conf

檔案中的內容為

# Parallel printer driver modules loading for cups
# LOAD_LP_MODULE was 'yes' in /etc/default/cups
lp
ppdev
parport_pc

 

將剩下的內容全部註釋掉,如下所示

# Parallel printer driver modules loading for cups
# LOAD_LP_MODULE was 'yes' in /etc/default/cups
# lp
# ppdev
# parport_pc

重啟reboot,問題就不會再出現了。

upadting......2018年09月08日

15    結束了以上14節內容的配置,發現raspberry的開機時間很長,通過系統檢視工具發現,startup需要2min多,這絕不是我們想要的,因此決定cut掉一些不用的service來加快開機時間。

關於ubuntu系統工具的詳細介紹,請檢視link:https://www.freedesktop.org/software/systemd/man/systemd-analyze.html

關於可關閉的一些啟動項,可以參考link:https://www.linux.com/learn/cleaning-your-linux-startup-process

另外通過安裝sysv-rc-conf這個工具可以有效的幫助你決定什麼啟動項可以被cut,安裝方法

sudo aot-get install sysv-rc-conf

#啟動命令
sudo sysv-rc-conf

用方向鍵移動游標,1,2,3,4,5,6,S是優先順序等級,帶交叉符號的為允許的啟動項,可以通過空格可以關閉啟動項。

通過指令,檢視開機時間(我這個已經被我優化過了,現在只要14s開機)

$ systemd-analyze time
Startup finished in 6.081s (kernel) + 7.858s (userspace) = 13.939s

通過指令,檢視有哪些服務參與了開機啟動

$ systemd-analyze blame 
          3.197s networking.service
          2.980s dev-mmcblk0p2.device
          2.685s ondemand.service
          2.680s speech-dispatcher.service
          2.387s triggerhappy.service
          2.093s snapd.service
          1.784s NetworkManager.service
          1.512s hciuart.service
          1.060s systemd-modules-load.service
          1.017s console-setup.service
           823ms sshguard.service
           807ms systemd-logind.service
           573ms sshdgenkeys.service
           565ms grub-common.service
           564ms prefer-timesyncd.service
           560ms systemd-user-sessions.service
           548ms rng-tools.service
           525ms pppd-dns.service
           494ms rsyslog.service
           447ms keyboard-setup.service
           435ms avahi-daemon.service
           433ms redis-server.service
           375ms systemd-udev-trigger.service
           308ms systemd-journald.service
           303ms systemd-udevd.service
           236ms systemd-fsck-root.service
           208ms resolvconf.service
           203ms apparmor.service
           198ms bluetooth.service
           194ms raspi-config.service
           168ms snapd.seeded.service
           168ms [email protected]
           163ms systemd-journal-flush.service
           149ms dev-mqueue.mount
           137ms polkitd.service
           136ms hddtemp.service
           198ms bluetooth.service
           194ms raspi-config.service
           168ms snapd.seeded.service
           168ms [email protected]
           163ms systemd-journal-flush.service
           149ms dev-mqueue.mount
           137ms polkitd.service
           136ms hddtemp.service
           133ms wpa_supplicant.service
           129ms ssh.service
           126ms binfmt-support.service
           123ms systemd-update-utmp.service
           116ms alsa-restore.service
           105ms systemd-tmpfiles-setup-dev.service
           103ms sys-kernel-debug.mount
            95ms kmod-static-nodes.service
            92ms ufw.service
            87ms systemd-timesyncd.service
            77ms plymouth-start.service
            75ms systemd-random-seed.service
            70ms systemd-tmpfiles-setup.service
            60ms [email protected]
            54ms plymouth-quit.service
            53ms plymouth-quit-wait.service
            53ms proc-sys-fs-binfmt_misc.mount
            49ms systemd-sysctl.service
            42ms systemd-update-utmp-runlevel.service
            39ms boot.mount
            39ms ureadahead-stop.service
            34ms plymouth-read-write.service
            30ms systemd-remount-fs.service
            30ms systemd-rfkill.service
            29ms sys-kernel-config.mount
            26ms setvtrgb.service
            22ms rc-local.service
             8ms snapd.socket

命令列關閉/開啟service的命令為:

sudo systemctl disable/enable xxxx.service

service的部分開機時間較長的服務功能,如下解釋

          2.533s snapd.service          //Tool to interact with Ubuntu Core Snappy
          2.506s triggerhappy.service  //global hotkey daemon for Linux
          2.427s hciuart.service        //something connect to blueteeth
          2.423s ondemand.service       //frequency scale
          2.383s speech-dispatcher.service      \\It's a daemon that programs can use to output speech about language.
          2.141s NetworkManager-wait-online.service  \\sudo systemctl disable NetworkManager-wait-online.service
          2.012s ModemManager.service               \\ is a DBus-activated daemon 
          1.905s NetworkManager.service              
          1.304s accounts-daemon.service            \\allows programs to get and manipulate user account information.
          1.224s sshguard.service       \\protects hosts from brute-force  attacks  against  SSH  and  other  services.
          1.119s upower.service         \\service on the system message bus.
          1.085s systemd-modules-load.service   \\is an early boot service that loads kernel modules based on

16    ROS是支援分散式的,所以在同一個區域網下,我們可以設定一個主機作為主節點,執行roscore,其他的從機ROS_MASTER_URI地址只要與主機保持一致,就可以實現的分散式操作。舉個例子,我用我的PC作為主節點,執行roscore,我的raspberry作為從機1號,執行一個節點,通過rostopic檢視他們之間是否正常通訊。參考自ROS官網,

link:http://wiki.ros.org/ROS/Tutorials/MultipleMachines

link:https://github.com/mktk1117/six_wheel_robot/wiki/Communication-between-Raspberry-Pi-and-PC-(ROS)

16.1    在我的PC上

現將 PC的IP地址和raspberry的IP地址寫入到/etc/hosts中

sudo vim /etc/hosts

在末尾加上如下兩行:

#pc and raspi communication base on ROS
192.168.1.91 whpi
192.168.1.88 whpc

這個IP地址在前面幾節已經講過了怎麼設定了,根據個人不同做出修改,通過ifconfig指令檢視。

主機與raspberry從機1號建立連線,通過ssh指令

ssh [email protected]
或
ssh [email protected]

然後輸入設定好的密碼就行了。

16.2    設定主機(我的PC)ROS資訊

export ROS_HOSTNAME=whpc
export ROS_MASTER_URI=http://whpc:11311

執行roscore。

16.3    設定從機1號(我的raspberry)ROS資訊,注意其他的從機ROS_MASTER_URI地址只要與主機保持一致

export ROS_HOSTNAME=whpi
export ROS_MASTER_URI=http://whpc:11311

11311為埠號,每個人可以是不同的。

因為我已經在主機(我的pc)運行了roscore指令,因此可以通過rostopic list檢視話題資訊。如下圖所示,

左邊為我的電腦,右邊為我的raspberry,他們的資訊一致,說明分散式交流建立成功。

16.4    通過一個演示來驗證。

從機(我的raspberry)執行,顯示如下內容

rosrun rospy_tutorials listener.py

從機什麼也沒有接受到,因為主機沒有執行talker,現在主機執行talker,如下所示,

rosrun rospy_tutorials talker.py 

可以看到,主機(我的PC)一執行talker,從機(raspberry)就接收到了資訊----(為了防止刷屏太快我手動終止了talker的程序)。我們確實做到了。

如果你有更多的從機,只需要:

1、將他們和你的主機連線到同一個區域網;

2、設定好主機的ROS_HOSTNAME,和ROS_MASTER_URI;

3、設定好從記得ROS_HOSTNAME(這個是每個從機都不相同的),和ROS_MASTER_URI(這個是每個從機都和主機相同)

 

17    通過遠端控制raspberry跑kobuki-turtlebot小車

updating......