從零開始搭二維激光SLAM --- 零基礎(chǔ)如何入門激光SLAM
最近有幾個(gè)人加我,都說是剛開始學(xué)激光slam,基本都是研一,也有一些大四的(大四的都開始學(xué)SLAM了!)。
情況也都差不多,有的是課題組里只有自己做slam,有的是完全沒人帶,有的是完全沒基礎(chǔ),c++都沒學(xué)過的那種。
這些小白都不知道怎么進(jìn)行學(xué)習(xí),問了我好多相同的問題,所以我就將我自己的思路整理了一下,也就是這篇文章的由來.
第一部分是我自己的SLAM接觸史,第二部分是為碩士小白入門寫的推薦學(xué)習(xí)路線,第三部分是為了SLAM愛好者入門寫的推薦學(xué)習(xí)路線.
長文,無圖,做好準(zhǔn)備.以下內(nèi)容僅為我自己的觀點(diǎn),有可能有錯(cuò)誤及不足,望見諒.
1 我的SLAM接觸史
1.1 c++
我也是研一的時(shí)候知道自己課題是SLAM相關(guān)的。
所以就在2016年10月份的時(shí)候開始看 c++ prime plus。之前我沒接觸過編程,就大一時(shí)候上過c語言的課,學(xué)完了也沒記得什么,之后也沒再碰過代碼。
這時(shí)候還不知道咋編代碼,咋運(yùn)行程序,所以 c++ prime plus 就是光看,沒去實(shí)際編代碼。
1.2 ubuntu
到了2017年3月,課題正式確定,《基于SLAM的室內(nèi)移動機(jī)器人導(dǎo)航技術(shù)研究》。
經(jīng)過同學(xué)的幫助,幫我裝了人生第一個(gè)雙系統(tǒng),ubuntu1404,開始正式接觸linux系統(tǒng)。
1.3 ROS
之后邊學(xué)ubuntu的命令行(簡單教程),邊去學(xué)ROS ,ROS的wiki地址為 wiki.ros.org。
ROS的wiki上的知識實(shí)在是太多了,有太多太多的網(wǎng)頁跳轉(zhuǎn),導(dǎo)致我花了太多的時(shí)間用在逛wiki上,當(dāng)時(shí)存了30多個(gè)書簽等著我一個(gè)一個(gè)的去看。
其實(shí)只要學(xué)完 Beginner Level 的教程就可以了,這個(gè)之后詳細(xì)說明。
1.4 ROS By Example 1
之后去看了這本書《ros by example 1》,這本書對我來說真的非常重要,讓我跑通了第一個(gè)ros的demo,十分有成就感。
這本書有配套的代碼,可以直接運(yùn)行,照著書中的步驟一步一步運(yùn)行即可。學(xué)了這么久,通過這本書里的例子,終于在rviz中看到了turtlebot,并讓機(jī)器人成功的動起來了,真是非常有成就感的一件事。
1.4 概率機(jī)器人
忘記了看這本書的具體時(shí)間了,只記得實(shí)驗(yàn)室里有這本書,然后我實(shí)習(xí)的時(shí)候借去看了一遍。這本書真的是很厲害,里邊有關(guān)于機(jī)器人定位與建圖的所有概念和公式。
強(qiáng)烈建議入門的時(shí)候不要讀這本書,不要讀,不要讀。
因?yàn)楫?dāng)時(shí)我看完了一遍,真是一點(diǎn)都沒理解,也一點(diǎn)沒記住。這本書就是現(xiàn)在的我來看,也有很多不理解,讀不懂的地方,更別說剛?cè)腴T的小白了。
1.5 小強(qiáng)機(jī)器人
之后,我去公司實(shí)習(xí),實(shí)習(xí)的時(shí)候有個(gè)機(jī)器人可以讓我玩,小強(qiáng)機(jī)器人。這是第一次弄機(jī)器人,也是第一次在機(jī)器人上操作ROS。
實(shí)踐ROS與操作機(jī)器人大概花費(fèi)了我至少2個(gè)月的時(shí)間。時(shí)間很長,因?yàn)榭赡芡蝗怀霈F(xiàn)有些問題導(dǎo)致你卡住,進(jìn)行不下去了。
記得很清楚,在筆記本上rviz點(diǎn)擊下發(fā)move_base的目標(biāo)點(diǎn),機(jī)器人始終不動,這個(gè)問題卡了我2周的時(shí)間。原因是沒有在機(jī)器人里的/etc/hosts里添加筆記本的ip。。。
所以,如果你課題組里只有自己做SLAM或者機(jī)器人相關(guān),一定要多加幾個(gè)社群,qq群也好,微信群也好,一定不要自己一個(gè)人去研究.有很多小問題在別人那只是一句話就能解決的事,自己研究可能就要耽誤2周甚至更長的時(shí)間。而且,現(xiàn)在做社群的有很多,搜索也很容易找到。
1.6 cartographer
再之后,17年12月份開始,到18年1月份,弄了將近1個(gè)月如何使用carographer。弄懂如何跑demo之后,又開始學(xué)如何修改launch文件,如何寫urdf。
再之后,就是做導(dǎo)航相關(guān)的了。
回顧這一年的時(shí)間,由于沒人帶真是走了挺多彎路,學(xué)習(xí)也沒有抓住重點(diǎn)。當(dāng)然,學(xué)過的所有知識都不是無用的,只是沒到需要用的時(shí)間而已。同時(shí),由于之前基礎(chǔ)打的牢,學(xué)的多,所以現(xiàn)在我對ROS相關(guān)的理解非常深刻,操作也很流暢。
接下來,我將我認(rèn)為的入門需要學(xué)的最重要的東西以及流程寫下來,希望可以幫助小白們知道如何學(xué)習(xí)SLAM,以及如何做SLAM相關(guān)的科研。
2 碩士小白做激光SLAM相關(guān)課題的學(xué)習(xí)路線
碩士同學(xué)如果課題是SLAM相關(guān)的,該如何盡快入門呢?課題組只有自己一個(gè)做SLAM的該怎么辦呢?
不要慌。目前大部分做SLAM的幾乎都是自學(xué)的,即使是課題組有其他做SLAM的也只能是讓自學(xué)的速度更快一點(diǎn)而已,因?yàn)橹R始終是要自己理解了之后才能成為自己的。多加幾個(gè)社群多交流,也是一樣的.
2.1 第一步:雙系統(tǒng)
我認(rèn)為的第一步就是先要裝個(gè)雙系統(tǒng),windows+ubuntu ,不建議使用虛擬機(jī),虛擬機(jī)本身會有很多問題,小白根本不知道出現(xiàn)的問題是虛擬機(jī)本身的問題還是環(huán)境沒弄好導(dǎo)致的問題。相信每個(gè)做SLAM的都自己裝過不下1遍的雙系統(tǒng)。
因?yàn)閡buntu系統(tǒng)不是十分健壯,有時(shí)候裝環(huán)境,裝驅(qū)動尤其是顯卡驅(qū)動,很可能就把系統(tǒng)弄壞了。有時(shí)候強(qiáng)制關(guān)機(jī)也會導(dǎo)致進(jìn)不去系統(tǒng)。
由于每個(gè)人的電腦配置不一樣,導(dǎo)致裝雙系統(tǒng)的時(shí)候會出現(xiàn)各種小問題,花時(shí)間都是可以解決的。
裝雙系統(tǒng)這一階段大概花費(fèi) 1天到2周 不等的時(shí)間。
2.2 第二步:ubuntu的基礎(chǔ)指令
這一步很簡單,只要稍微學(xué)習(xí)下ubuntu的最基礎(chǔ)的指令就可以了,可以照著這個(gè)簡單教程進(jìn)行學(xué)習(xí),也可以在b站中找視頻進(jìn)行學(xué)習(xí)。
一定要記住,剛開始只需要學(xué)習(xí)最基礎(chǔ)的指令就夠了,如 如何打開終端,如何復(fù)制移動文件,如何新建文件夾等等。
不要學(xué)的太多,像shell編程,腳本編寫執(zhí)行等等。很多知識是會在以后的使用中,邊學(xué)邊查就夠了,不要第一時(shí)間全都去學(xué),基礎(chǔ)不夠的情況學(xué)了再多也不一定能理解和記住。
這一階段會花費(fèi) 1天到1周 不等的時(shí)間。
2.3 第三步:學(xué)習(xí)ROS
2.3.1 為什么要學(xué)ROS
ROS最大的貢獻(xiàn)就是為機(jī)器人相關(guān)的開發(fā)者,統(tǒng)一了接口與操作方式。讓開發(fā)者可以聚焦于上層的算法設(shè)計(jì),不用每個(gè)人都去重復(fù)的去做通訊,驅(qū)動等底層的搭建。同時(shí),ros中也提供了能讓各種傳感器數(shù)據(jù)可視化的軟件Rviz,以及查看各個(gè)節(jié)點(diǎn)的關(guān)系可視化圖等特別好用的工具。
而且,目前的激光SLAM,不管是二維的還是三維的,幾乎都是使用ROS的接口編寫的,不會用ROS你就不會啟動SLAM。所以,ROS是必須要學(xué)的。
2.3.2 安裝ROS
安裝ROS網(wǎng)上有太多的教程,這里就不再說明了,一般照著ROS wiki的 安裝教程 一步一步安裝都會成功的。
2.3.3 怎么學(xué)ROS
ROS的wiki網(wǎng)站(ros.wiki.org)里有幾乎所有關(guān)于ROS的教程與信息,在學(xué)習(xí)ROS的時(shí)候,最好直接看wiki上的內(nèi)容,不要去找一些其他網(wǎng)站翻譯之后的內(nèi)容,這里的英文很簡單,一般都能直接看懂。
能找到的翻譯過的文章大都只是簡單的進(jìn)行翻譯與復(fù)制,不一定準(zhǔn)確不說,往往都是只翻譯一個(gè)章節(jié)或者一小部分,會讓人學(xué)的不夠全面與透徹。
2.3.3.1 ROS Tutorials Beginner Level
首先要照著ROS的官方教學(xué)內(nèi)容進(jìn)行學(xué)習(xí),也就是 ROS Tutorials 的 Beginner Level 內(nèi)容進(jìn)行學(xué)習(xí),一定要保證每個(gè)章節(jié)都弄懂,保證每個(gè)章節(jié)的內(nèi)容都自己跟著實(shí)踐過不止1次。只有自己實(shí)際操作之后,才能真正的理解,光看是看不會的!
這20個(gè)章節(jié)真的非常重要,有的時(shí)候我也會去再重溫一下這20個(gè)章節(jié)的內(nèi)容,這真的是使用ROS的最核心的內(nèi)容,一定要好好學(xué)習(xí),要真正的學(xué)會,理解。
這一階段大概花費(fèi) 2周到3周 的時(shí)間。
2.3.3.2 launch文件
學(xué)完了初級教程之后,先不要去學(xué)中級教程以及其他的教程,因?yàn)槠渌慕坛淌嵌虝r(shí)間內(nèi)用不到的。ROS Tutorials中有2個(gè)常用的知識點(diǎn)沒有說,一個(gè)是用于啟動多個(gè)節(jié)點(diǎn)的roslaunch命令與launch文件,另一個(gè)是URDF模型。
launch文件的語法可以去wiki上學(xué)一下http://wiki.ros.org/roslaunch.
wiki上的內(nèi)容很多,可以不用全部學(xué),要學(xué)的只有2個(gè),一個(gè)是如果使用roslaunch命令啟動launch文件,命令的格式如下所示
roslaunch package_name file.launch另一個(gè)是launch文件的XML語法 http://wiki.ros.org/roslaunch/XML。
launch文件的具體教學(xué)可以在百度里搜一搜,也可以在任意一個(gè)ros的包中查看launch文件的具體內(nèi)容。
這一階段最多花費(fèi) 1天 的時(shí)間。
2.3.3.3 URDF
URDF是用來描述傳感器坐標(biāo)系與機(jī)器人坐標(biāo)系間的物理關(guān)系的,也就是坐標(biāo)變換。
wiki上有更詳細(xì)的介紹:http://wiki.ros.org/urdf ,也有對應(yīng)的教程 http://wiki.ros.org/urdf/Tutorials.
這個(gè)文件可能第一次看感覺很復(fù)雜,又是一種新的語言格式,但是其內(nèi)容模式是固定的,只需要大段的復(fù)制,簡單的更改其中的坐標(biāo)系名字與對應(yīng)的坐標(biāo)變換的具體數(shù)值,即可完成自己機(jī)器人的URDF模型的搭建。
如果沒看明白完全沒有關(guān)系,因?yàn)榇蟛糠諷LAM算法已經(jīng)編寫好了對應(yīng)的URDF模型,你理解了URDF的概念也是完全可以的,以后再來弄清楚。
這其中可能涉及到一些TF的知識,可以暫時(shí)不用管他,只要知道這是ROS幫助我們管理傳感器坐標(biāo)系與機(jī)器人坐標(biāo)系間坐標(biāo)變換關(guān)系的即可。TF也是十分必要的,是之后的必學(xué)項(xiàng)
這一階段最多花費(fèi) 1天 的時(shí)間。
2.4 第四步:試著跑通現(xiàn)有的SLAM算法
如果一切順利的話,學(xué)到這差不多花費(fèi)一個(gè)月的時(shí)間,如果你學(xué)的快的甚至不需要一個(gè)月的時(shí)間。
下一階段為嘗試在ROS下跑通現(xiàn)有的SLAM算法。
如果你是做二維的激光SLAM,建議優(yōu)先跑通 gmapping ,因?yàn)檫@個(gè)SLAM算法網(wǎng)上能找到的教程非常多。對應(yīng)的數(shù)據(jù)bag文件(bag會在 ROSTutorials 中學(xué)到)可以在 http://download.ros.org/data/gmapping/ 中獲取。
如果是做三維的激光SLAM,建議優(yōu)先跑通LOAM,這個(gè)SLAM的數(shù)據(jù)包及如何運(yùn)行的教程網(wǎng)上也是非常多。
在跑demo的過程中,你會體驗(yàn)到如何運(yùn)行l(wèi)aunch文件,如何在launch文件中修改訂閱的話題的名稱,以及如何播放bag文件。同時(shí),也要體會激光雷達(dá)的數(shù)據(jù)是什么樣的,構(gòu)建出的二維地圖或者三維地圖是什么樣的。
這一階段大概花費(fèi) 1周到3周 的時(shí)間。
2.5 第五步:理解SLAM各個(gè)模塊的理論概念以及調(diào)研SLAM
經(jīng)過上面的步驟,相信你大致知道SLAM是干什么的了,就是為了構(gòu)建地圖用的,這個(gè)地圖可以保存下來,用于后續(xù)的定位及導(dǎo)航避障中。也有一些SLAM作為里程計(jì)在使用,始終提供估計(jì)的位姿.
現(xiàn)在,我們可以更深入的學(xué)習(xí)下SLAM的概念了。我是覺得,只有先實(shí)際跑了下SLAM,再去看理論,才能理解SLAM到底是要干什么.要不然直接學(xué)習(xí)SLAM的各個(gè)理論概念,可能等你學(xué)完了也沒有理解,過一陣時(shí)間就忘了.
目前,主流SLAM的結(jié)構(gòu)基本都差不過,分為前端里程計(jì),后端優(yōu)化,回環(huán)檢測三個(gè)大模塊.前端的目的是始終累加位姿,作為里程計(jì)使用;后端使用圖的結(jié)構(gòu)模型,優(yōu)化整體位姿,減小前端里程計(jì)產(chǎn)生的累計(jì)誤差;回環(huán)檢測可以提供一個(gè)更強(qiáng)烈的圖結(jié)構(gòu)的約束,能夠更好的減小累計(jì)誤差.
這一階段就是理解SLAM的概念,可以在網(wǎng)上搜下相關(guān)的文章,也可以去看下論文,如中文的博士論文,國外的論文;推薦優(yōu)先看博士論文的綜述章節(jié),以及SLAM綜述相關(guān)的文章,這可以讓你很快的理解SLAM各個(gè)模塊的概念.
調(diào)研主流SLAM算法
理解了SLAM概念的時(shí)候,相信綜述里會列舉很多SLAM算法,可以順便調(diào)研下目前的主流SLAM算法方案有哪些,每個(gè)SLAM算法的框架是什么樣的.
一些傳統(tǒng)的SLAM算法如下所示.
二維激光SLAM:hector,gmapping,karto,cartographer等等.
三維激光SLAM:LOAM,Lego-LOAM,LIO-SAM,HDL graph SLAM,cartographer等等.
還有些語義的SLAM我不太懂這里就不說了.
這一階段大概花費(fèi) 1周到2周 的時(shí)間。
2.6 第六步:閱讀文獻(xiàn)找創(chuàng)新點(diǎn)
完成以上步驟大概已經(jīng)過去至少2個(gè)月了,相信這時(shí)的你已經(jīng)對SLAM有了一定的理解.接下來就是要為了做課題而改進(jìn)SLAM.
既然是找創(chuàng)新點(diǎn),首先就要了解最新SLAM論文的改進(jìn)點(diǎn),也就是要瘋狂看論文了.我是覺得,只有先理解了SLAM各個(gè)模塊的理論概念,再看論文才能真正理解論文說的是啥,才能理解論文的創(chuàng)新點(diǎn)在哪.
看論文是為了找創(chuàng)新點(diǎn),同時(shí)也要選擇一個(gè)現(xiàn)有的SLAM框架,因?yàn)閺牧愦钜粋€(gè)SLAM算法是非常難的,所以只能在現(xiàn)有SLAM框架上做改進(jìn).
這一階段可能花費(fèi) 1個(gè)月到2個(gè)月 的時(shí)間。
2.7 第七步:跑通選定的SLAM框架
將選定的SLAM算法跑通.
如果沒有硬件的同學(xué)可以直接下載網(wǎng)上的數(shù)據(jù)集,將數(shù)據(jù)集和選定的SLAM算法調(diào)通.
如果是有機(jī)器人以及激光雷達(dá)的同學(xué)這一步還要多花費(fèi)一些時(shí)間將選定的SLAM算法與自己的硬件及機(jī)器人調(diào)通,做好心里準(zhǔn)備,這一步可能會出現(xiàn)各種問題導(dǎo)致你卡住.
針對自己的硬件,首先要學(xué)會如何啟動雷達(dá),如何配置雷達(dá);如果是要做移動機(jī)器人的,還要學(xué)習(xí)一下移動機(jī)器人如何操作,也就是如何用ROS操作機(jī)器人;再之后是如何將自己的硬件與SLAM算法調(diào)通,這步網(wǎng)上的教程很多,一定要注意下話題的名字對不對的上.
跑通選定的SLAM算法的意思是 將數(shù)據(jù)集或者實(shí)際的傳感器接入到SLAM中,并啟動成功,以及保存地圖.之后,要再試著改一改這個(gè)SLAM的參數(shù),看看不同的參數(shù)更改了會帶來什么影響.
這一階段可能花費(fèi) 1周到2個(gè)月 的時(shí)間。
2.8 第八步:學(xué)習(xí)C++
如果你已經(jīng)找到了想要做的創(chuàng)新點(diǎn),接下來的步驟就是要將想法通過代碼實(shí)現(xiàn)出來.
之前的步驟并沒有涉及到編程語言,因?yàn)樽铋_始真的是用不到自己編寫代碼.由于ROS社區(qū)的貢獻(xiàn),導(dǎo)致機(jī)器人開發(fā)人員的編寫代碼量驟降,能想到的功能基本開源社區(qū)里都有,只需要跑通調(diào)參就可以了.
現(xiàn)在要自己實(shí)現(xiàn)新功能,需要自己寫代碼,所以這一階段才開始學(xué)習(xí)編程語言.
語言推薦C++,因?yàn)榇蟛糠諷LAM是用c++編寫的.優(yōu)先推薦閱讀 c++ prime plus ,也可以在網(wǎng)上找一些其他的教程.
不管通過什么方式學(xué)習(xí) C++ ,一定多多進(jìn)行編程練習(xí),學(xué)習(xí)編程只通過看書是永遠(yuǎn)也學(xué)不會的,只有自己多編,多練,才能讓自己熟練準(zhǔn)確的編程.
這一階段可能花費(fèi) 1個(gè)月 的時(shí)間,也可以在之前的步驟當(dāng)中抽空學(xué)一下。
2.9 第九步:閱讀SLAM源碼
學(xué)完了C++,并不意味著你能夠編寫SLAM以及自己的想法了.因?yàn)榫帉慡LAM是一件挺工程,挺需要經(jīng)驗(yàn)的事情.
這時(shí)的你,可能會陷入到想要實(shí)現(xiàn)某些功能,但是完全不知道該怎么寫代碼的階段.
這時(shí)候就需要你去閱讀想要改進(jìn)的SLAM的代碼了.看代碼的目的是為了學(xué)習(xí)如何將實(shí)現(xiàn)自己想法實(shí)現(xiàn),以及自己的功能添加到SLAM的哪里.可以只看自己想要改進(jìn)模塊的代碼,也可以將整個(gè)SLAM的代碼全看了,只要知道了自己的功能如何實(shí)現(xiàn)了就可以.
C++ 11
由于一般的SLAM的實(shí)現(xiàn)都用到了很多C++ 11的新特性,所以看代碼的時(shí)候也可以簡單學(xué)一學(xué) C++ 11 相關(guān)的知識,以便更好的閱讀代碼.
參數(shù)
看代碼的時(shí)候要將每個(gè)參數(shù)在哪里使用的,這個(gè)參數(shù)具體代表什么意思弄懂,這樣可以讓你更好更準(zhǔn)確的調(diào)參.
同時(shí),也要學(xué)習(xí)下SLAM的具體實(shí)現(xiàn)該怎么寫代碼,思考自己想要實(shí)現(xiàn)的功能該如何寫代碼,該添加到SLAM的哪部分代碼中,要帶著問題去讀代碼.
這一階段可能花費(fèi) 1個(gè)月到2個(gè)月 的時(shí)間。
2.10 第十步:編寫代碼,驗(yàn)證想法
知道了代碼怎么寫,在SLAM的哪個(gè)部分添加,就可以上手寫代碼了.
新手寫代碼,調(diào)試代碼,這一階段的時(shí)間可能花費(fèi)的要久一點(diǎn).
寫完了代碼之后,就是要通過與之前的SLAM算法對比軌跡精度,地圖精度等等.輸出圖片,表格,曲線,證明你的算法更加優(yōu)秀.
再之后就是寫論文,發(fā)論文,寫碩士論文,畢業(yè).
有些學(xué)校要求工作量,這一點(diǎn)一定提前考慮好.SLAM相關(guān)功能的改進(jìn),撐死了一個(gè)改進(jìn)點(diǎn)一個(gè)大章節(jié),編程是不算工作量的,能算在論文里的工作只有改進(jìn)之后的對比圖,對比曲線.
一篇碩士論文大概4-5個(gè)大章節(jié),其他章節(jié)的內(nèi)容怎么寫,一定要提前考慮好.不要編程編了2年,最后寫論文發(fā)現(xiàn)只能算1個(gè)大章節(jié),那就尷尬了.
3 單純的喜歡激光SLAM,非科研,零基礎(chǔ)如何入門
對于想轉(zhuǎn)行的同學(xué),或者是單純的喜歡激光SLAM同學(xué),不需要寫論文,該怎么入門呢?
基本上是一樣的,只是第六步可以忽略,可以不用讀論文.如果不需要改代碼的話第十步也是可以忽略的.而第九步,閱讀源碼,這一部分可以進(jìn)行擴(kuò)展,多閱讀幾個(gè)SLAM算法的源碼與實(shí)現(xiàn),將有助于幫你更好的理解SLAM的實(shí)現(xiàn).
總結(jié)
這一路走下來真是不容易啊,涉及到了很多元的知識,也需要花挺長的時(shí)間來探索,來入門.如果沒人帶路的話可能要花更久的時(shí)間來找到正確的路,希望上邊的步驟可以幫到你們.
這只是我的一點(diǎn)建議,不一定正確,只是給各位小白們提供個(gè)參考.
上邊的步驟有很多是可以同時(shí)進(jìn)行的,您可以自己選擇如何組合.
上邊的路線還有很多知識點(diǎn)沒有提到,如 ROS 中的TF,這是所有SLAM中都會用到的;如 SLAM的理論求解算法,像高斯牛頓,LM等等.這篇文章沒有講太多理論算法方面的東西,以對小白更加友好.
其他原創(chuàng)文章可以戳:
文章將在 CSDN: 李太白lx 與 知乎:李想 進(jìn)行同步更新,可以更方便的看代碼,歡迎大家關(guān)注。
如果您對我寫的文章有什么建議,或者想要看哪方面功能如何實(shí)現(xiàn)的,請直接在公眾號中聯(lián)系我,我將認(rèn)真考慮您的建議。
同時(shí),也希望您將這個(gè)公眾號推薦給您身邊做激光SLAM的人們,大家共同進(jìn)步。
【您的在看與轉(zhuǎn)發(fā),是對我莫大鼓勵(lì)】

