學(xué)習(xí)資料推薦
ROS官方教程(中文版):http://wiki.ros.org/cn/ROS/Tutorials
ROS學(xué)習(xí)筆記系列:https://blog.csdn.net/mountzf/article/details/51931806
ROS學(xué)習(xí)之路的整理:https://blog.csdn.net/zhanshen112/article/details/82792467
古月居:http://www.guyuehome.com/
本篇的內(nèi)容也參考了以上學(xué)習(xí)資料献丑。ROS的安裝
ROS不能再詳細(xì)的安裝教程16.04+kinetic:http://www.cnblogs.com/liu-fa/p/5779206.htmlu
安裝過(guò)程中若是報(bào)錯(cuò)的話(huà)彤恶,建議用以下指令:
sudo apt update
sudo apt full-update
重新更新一遍系統(tǒng)后边坤,再按照教程中的過(guò)程進(jìn)行ROS的安裝。
- 基本概念
3.1 ROS
ROS(Robot Operating System)是一個(gè)適用于機(jī)器人的開(kāi)源的元操作系統(tǒng)。它提供了操作系統(tǒng)應(yīng)有的服務(wù)界阁,包括硬件抽象儡率,底層設(shè)備控制挂据,常用函數(shù)的實(shí)現(xiàn),進(jìn)程間消息傳遞儿普,以及包管理崎逃。它也提供用于獲取、編譯眉孩、編寫(xiě)个绍、和跨計(jì)算機(jī)運(yùn)行代碼所需的工具和庫(kù)函數(shù)。主要可以從以下四個(gè)方面去理解:
1.通道:ROS提供了一種發(fā)布-訂閱式的通信框架用以簡(jiǎn)單浪汪、快速地構(gòu)建分布式計(jì)算系巴柿。
2.工具:ROS提供了大量的工具組合用以配置、啟動(dòng)死遭、自檢广恢、調(diào)試、可視化呀潭、登錄钉迷、測(cè)試、終止分布式計(jì)算系統(tǒng)钠署。
3.強(qiáng)大的庫(kù):ROS提供了廣泛的庫(kù)文件實(shí)現(xiàn)以機(jī)動(dòng)性篷牌、操作控制、感知為主的機(jī)器人功能踏幻。
4.生態(tài)系統(tǒng):ROS的支持與發(fā)展依托著一個(gè)強(qiáng)大的社區(qū)枷颊。ros.org尤其關(guān)注兼容性和支持文檔,提供了一套“一站式”的方案使得用戶(hù)得以搜索并學(xué)習(xí)來(lái)自全球開(kāi)發(fā)者數(shù)以千計(jì)的ROS程序包。
簡(jiǎn)單來(lái)說(shuō)夭苗,ROS提供了一些開(kāi)源的可調(diào)用的功能庫(kù)和通信手段供我們使用信卡。
3.2 工作空間
工作空間(workspace)是ROS里面最小環(huán)境配置單位,可以把workspace看成是一個(gè)有結(jié)構(gòu)的文件夾题造,它包含多個(gè)package以及一些結(jié)構(gòu)性質(zhì)文件傍菇。一次將一個(gè)workspace配置進(jìn)環(huán)境變量里面,才能使用ROS命令執(zhí)行與這個(gè)workspace里面的package相關(guān)的操作界赔。
3.3 功能包
功能包(package)是ROS應(yīng)用程序代碼的組織單元丢习,每個(gè)軟件包都可以包含程序庫(kù)、可執(zhí)行文件淮悼、腳本或者其它手動(dòng)創(chuàng)建的東西咐低。 創(chuàng)建了相應(yīng)的軟件包才能實(shí)現(xiàn)相應(yīng)的功能。
3.4 清單
清單(Manifest)是對(duì)于功能包相關(guān)信息的描述袜腥,用于定義軟件包相關(guān)元信息之間的依賴(lài)關(guān)系见擦,這些信息包括版本、維護(hù)者和許可協(xié)議等羹令。 也就是 package.xml文件鲤屡。
3.5 腳本文件
CMakeLists.txt是一個(gè)Cmake的腳本文件,Cmake是一個(gè)符合工業(yè)標(biāo)準(zhǔn)的跨平臺(tái)編譯系統(tǒng)福侈。這個(gè)文件包含了一系列的編譯指令酒来,包括應(yīng)該生成哪種可執(zhí)行文件,需要哪些源文件肪凛,以及在哪里可以找到所需的頭文件和鏈接庫(kù)役首。
3.6 節(jié)點(diǎn)
節(jié)點(diǎn)(Node)是 ROS 功能包中的一個(gè)可執(zhí)行文件,節(jié)點(diǎn)之間可以通過(guò) ROS 客戶(hù)端庫(kù)(如roscpp 显拜、 rospy )相互通信。一個(gè)機(jī)器人控制系統(tǒng)由許多節(jié)點(diǎn)組成,這些節(jié)點(diǎn)各司其職,如,一個(gè)節(jié)點(diǎn)控制激光距離傳感器爹袁,一個(gè)節(jié)點(diǎn)控制輪子的馬達(dá)远荠,一個(gè)節(jié)點(diǎn)執(zhí)行定位,一個(gè)節(jié)點(diǎn)執(zhí)行路徑規(guī)劃失息,一個(gè)節(jié)點(diǎn)提供系統(tǒng)的整個(gè)視圖等譬淳。也就是能夠執(zhí)行特定工作任務(wù)的工作單元。
3.7 節(jié)點(diǎn)管理器
節(jié)點(diǎn)管理器(Master)是 ROS 名稱(chēng)服務(wù),能夠幫助節(jié)點(diǎn)找到彼此盹兢。節(jié)點(diǎn)通過(guò)與節(jié)點(diǎn)管理器通信來(lái)報(bào)告他們的注冊(cè)信息邻梆。值得注意的是,當(dāng)這些節(jié)點(diǎn)和節(jié)點(diǎn)管理器通信時(shí),它們可以接受其他注冊(cè)節(jié)點(diǎn)的信息,并能保持通信正常绎秒。當(dāng)這些注冊(cè)信息改變時(shí)浦妄,節(jié)點(diǎn)管理器也會(huì)回調(diào)這些節(jié)點(diǎn)。所以,沒(méi)有節(jié)點(diǎn)管理器剂娄,節(jié)點(diǎn)將不能相互找到,也不能進(jìn)行消息交換或者調(diào)用服務(wù)蠢涝。
3.8 參數(shù)管理器
參數(shù)管理器( Parameter Server )是節(jié)點(diǎn)管理器的一部分,是一個(gè)可通過(guò)網(wǎng)絡(luò)訪(fǎng)問(wèn)的共享的多變量字典阅懦。節(jié)點(diǎn)使用此服務(wù)器來(lái)存儲(chǔ)和檢索運(yùn)行時(shí)參數(shù)和二。
3.9 消息
消息(Message)是一種ROS數(shù)據(jù)類(lèi)型。一個(gè)節(jié)點(diǎn)向特定主題發(fā)布消息耳胎,從而將數(shù)據(jù)發(fā)送到另一個(gè)節(jié)點(diǎn)惯吕。消息具有一定的類(lèi)型和數(shù)據(jù)結(jié)構(gòu),包括ROS提供的標(biāo)準(zhǔn)類(lèi)型和用戶(hù)自定義類(lèi)型怕午。消息與話(huà)題(發(fā)布 / 訂閱模式)是緊密聯(lián)系在一起的废登,msg文件實(shí)質(zhì)上就是一個(gè)從結(jié)構(gòu)上描述ROS中所使用消息類(lèi)型的簡(jiǎn)單文本,描述的是消息的數(shù)據(jù)類(lèi)型诗轻。
3.10 話(huà)題
話(huà)題( Topic )是節(jié)點(diǎn)間用來(lái)傳輸數(shù)據(jù)的總線(xiàn)钳宪,通過(guò)主題進(jìn)行消息路由不需要節(jié)點(diǎn)之間直接連接。節(jié)點(diǎn)可以發(fā)布消息到話(huà)題扳炬,也可以訂閱話(huà)題以接收消息吏颖。一個(gè)話(huà)題可能對(duì)應(yīng)有許多節(jié)點(diǎn)作為話(huà)題發(fā)布者和話(huà)題訂閱者。當(dāng)然,一個(gè)節(jié)點(diǎn)可以發(fā)布和訂閱許多話(huà)題恨樟。一個(gè)節(jié)點(diǎn)對(duì)某一類(lèi)型的數(shù)據(jù)感興趣,它只需訂閱相關(guān)話(huà)題即可半醉。一般來(lái)說(shuō)。話(huà)題發(fā)布者和話(huà)題訂閱者不知道對(duì)方的存在劝术。發(fā)布者將信息發(fā)布在一個(gè)全局的工作區(qū)內(nèi)缩多,當(dāng)訂閱者發(fā)現(xiàn)該信息是它所訂閱的,就可以接收到這個(gè)信息养晋。
3.11 服務(wù)
當(dāng)需要直接與節(jié)點(diǎn)通信并獲得應(yīng)答時(shí)衬吆,將無(wú)法通過(guò)話(huà)題來(lái)實(shí)現(xiàn),而需要服務(wù)(Service)绳泉。我們可以看出逊抡,發(fā)布 / 訂閱模式是一種多對(duì)多的傳輸方式,顯然這種傳輸方式不適用于請(qǐng)求 / 回復(fù)的交互方式零酪。請(qǐng)求 / 回復(fù)交互方式經(jīng)常被用于分布式系統(tǒng)中冒嫡。請(qǐng)求服務(wù)通過(guò) Service 來(lái)進(jìn)行,Service 被定義為一對(duì)消息結(jié)構(gòu):一個(gè)用于請(qǐng)求四苇,一個(gè)用于回復(fù)孝凌。一個(gè)客戶(hù)通過(guò)發(fā)送請(qǐng)求信息并等待響應(yīng)來(lái)使用服務(wù)( ROS中的請(qǐng)求 / 回復(fù)交互方式類(lèi)似于一個(gè)遠(yuǎn)程函數(shù)調(diào)用,srv文件類(lèi)似于函數(shù)參數(shù)和返回值的定義)月腋。
3.12 消息記錄包
消息記錄包(Bag)是一種用于保存和回放 ROS 消息數(shù)據(jù)的格式蟀架。消息記錄包是檢索傳感器數(shù)據(jù)的重要機(jī)制,這些數(shù)據(jù)雖然很難收集,但是對(duì)于發(fā)展和測(cè)試算法很有必要瓣赂。
- 常用命令
4.1 ROS Shell命令
命令 功能
roscd 移動(dòng)到指定的ROS軟件包目錄
rosls 顯示ROS軟件包的文件與目錄
rosed 編輯ROS軟件包的文件
roscp 復(fù)制ROS軟件包的文件
rospd 添加目錄至ROS目錄索引
rosd 顯示ROS目錄索引中的目錄
roscd [功能包名稱(chēng)] 。使用它辜窑,無(wú)需再使用cd一層層到查找钩述,進(jìn)入功能包里。
rosls [功能包名稱(chēng)] 穆碎。等價(jià)與roscd+ls牙勘。查看ROS功能包的文件列表更方便,快捷所禀。
rosed[功能包名稱(chēng)][文件名稱(chēng)]方面。 用于編輯功能包中的特定文件,優(yōu)點(diǎn)也是快捷色徘,修改容易恭金。
4.2 ROS執(zhí)行命令
命令 功能
roscore 開(kāi)啟Master(ROS名稱(chēng)服務(wù))
rosrun 運(yùn)行單個(gè)節(jié)點(diǎn)
roslaunch 運(yùn)行多個(gè)節(jié)點(diǎn)及設(shè)置運(yùn)行選項(xiàng)
rosclean 檢查或刪除ROS日志文件
roscore [選項(xiàng)]。運(yùn)行主節(jié)點(diǎn)褂策,主節(jié)點(diǎn)管理節(jié)點(diǎn)之間的消息通信中的連接信息横腿。關(guān)于主節(jié)點(diǎn)的具體作用就不累述了。
rosrun [功能包名稱(chēng)] [節(jié)點(diǎn)名稱(chēng)]斤寂。執(zhí)行指定的功能包中的一個(gè)節(jié)點(diǎn)的命令(rosrun rqt_graph rqt_graph 可查看當(dāng)前系統(tǒng)的運(yùn)行情況)耿焊。
roslaunch [功能包名稱(chēng)] [launch文件名]。 類(lèi)似dat批命令遍搞,是運(yùn)行指定功能包中一個(gè)或設(shè)置執(zhí)行選項(xiàng)的命令罗侯。
rosclean [選項(xiàng)]。運(yùn)行roscore時(shí)溪猿,對(duì)所有節(jié)點(diǎn)的記錄都會(huì)寫(xiě)入日志文件钩杰,隨著時(shí)間的推移,需要定期使用rosclean命令刪除這些記錄.
4.3 ROS信息命令
命令 功能
rostopic 查看ROS話(huà)題信息
rosservice 查看ROS服務(wù)信息
rosnode 查看ROS節(jié)點(diǎn)信息
rosparam 確認(rèn)和修改ROS參數(shù)信息
rosbag 記錄和回放ROS消息
rosmsg 顯示ROS消息類(lèi)型
rossrv 顯示ROS服務(wù)類(lèi)型
rosversion 顯示ROS功能包的版本信息
roswtf 檢查ROS系統(tǒng)
rostopic [選項(xiàng)]
list - 列出活動(dòng)話(huà)題
echo [話(huà)題名稱(chēng)] - 實(shí)時(shí)顯示指定話(huà)題的消息內(nèi)容
find [類(lèi)型名稱(chēng)] - 顯示使用指定類(lèi)型的消息的話(huà)題
type [話(huà)題名稱(chēng)] - 顯示指定話(huà)題的消息類(lèi)型
bw [話(huà)題名稱(chēng)] - 顯示指定話(huà)題的消息類(lèi)型
hz [話(huà)題名稱(chēng)] - 顯示指定話(huà)題的消息數(shù)據(jù)發(fā)布周期
info [話(huà)題名稱(chēng)] - 顯示指定話(huà)題的消息
pub [話(huà)題名稱(chēng)] [消息類(lèi)型] [參數(shù)] - 用指定的話(huà)題名稱(chēng)發(fā)布消息诊县,許多時(shí)候另開(kāi)一個(gè)終端操作 例:rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist – ‘[2.0, 0.0, 0.0]”[0.0, 0.0, 0.0]’
rosservice [選項(xiàng)]
list - 顯示活動(dòng)的服務(wù)信息
info [服務(wù)名稱(chēng)] - 顯示指定服務(wù)的信息
type [服務(wù)名稱(chēng)] - 顯示服務(wù)類(lèi)型
find [服務(wù)類(lèi)型] - 查找指定服務(wù)類(lèi)型的服務(wù)
uri [服務(wù)名稱(chēng)] - 顯示ROSRPC URI服務(wù)
args [服務(wù)名稱(chēng)] - 顯示服務(wù)參數(shù)
call [服務(wù)名稱(chēng)] [參數(shù)] - 用輸入的參數(shù)請(qǐng)求服務(wù)讲弄,通常用于測(cè)試服務(wù)
rosnode [選項(xiàng)]
list - 查看活動(dòng)的節(jié)點(diǎn)列表
ping [節(jié)點(diǎn)名稱(chēng)] - 與指定的節(jié)點(diǎn)進(jìn)行連接測(cè)試
info [節(jié)點(diǎn)名稱(chēng)] - 查看指定節(jié)點(diǎn)的信息
machine [PC名稱(chēng)或IP] - 查看該P(yáng)C中運(yùn)行的節(jié)點(diǎn)列表
kill [節(jié)點(diǎn)名稱(chēng)] - 停止指定節(jié)點(diǎn)的運(yùn)行
cleanup - 刪除失連節(jié)點(diǎn)的注冊(cè)信息
rosparam [參數(shù)]
list - 查看參數(shù)列表
get [參數(shù)名稱(chēng)] - 獲取參數(shù)值
set [參數(shù)名稱(chēng)] - 設(shè)置參數(shù)值
dump [文件名稱(chēng)] - 將參數(shù)保存到指定文件
load [文件名稱(chēng)] - 獲取保存在指定文件中的參數(shù),經(jīng)常使用依痊。
delete [參數(shù)名稱(chēng)] - 刪除參數(shù)
rosmsg [參數(shù)]
list - 顯示所有消息
show [消息名稱(chēng)] - 顯示指定消息
md5 [消息名稱(chēng)] - 顯示md5sum
package [功能包名稱(chēng)] - 顯示用于指定功能包的所有消息
packages - 顯示使用消息的所有功能包
rossrv [參數(shù)]
list -顯示所以服務(wù)
show [服務(wù)名稱(chēng)] - 顯示指定的服務(wù)信息
md5 [服務(wù)名稱(chēng)] - 顯示md5sum
package [功能包名稱(chēng)] - 顯示指定的功能包中用到的所有服務(wù)
packages - 顯示使用服務(wù)的所有功能包
rosbag [參數(shù)]
record [選項(xiàng)] [話(huà)題名稱(chēng)] - 將指定話(huà)題的消息記錄到bag文件
info [文件名稱(chēng)] - 查看bag文件的信息
play [文件名稱(chēng)] - 回放指定的bag文件避除,這個(gè)使用玩的也多。
compress [文件名稱(chēng)] - 壓縮指定的bag文件
decompress [文件名稱(chēng)] - 解壓指定的bag文件
filter [輸入文件] [輸出文件] [選項(xiàng)] - 生成一個(gè)刪除了指定內(nèi)容的新的bag文件
reindex bag [文件名稱(chēng)] - 刷新索引
check bag [文件名稱(chēng)] - 檢查指定的bag文件是否能在當(dāng)前系統(tǒng)中回放
fix [輸入文件] [輸出文件] [選項(xiàng)] - 將由于版本不同而無(wú)法回放的bag文件修改可以回放的文件
4.4 ROS catkin命令
catkin_create_pkg - 自動(dòng)生成功能包(示例命令:catkin_create_pkg [功能包名稱(chēng)] [依賴(lài)性功能包1] [依賴(lài)性功能包2]….)抗悍。
catkin_make - 基于catkin構(gòu)建系統(tǒng)的構(gòu)建 (示例:catkin_make –pkg [包名] 只構(gòu)建一部分功能包)。
catkin_eclipse - 對(duì)于用catkin構(gòu)建系統(tǒng)生成的功能包進(jìn)行修改钳枕,使其能在Eclipse環(huán)境中使用缴渊。
catkin_prepare_release - 在發(fā)布時(shí)用到的日志整理和版本標(biāo)記。
catkin_generate_changelog - 在發(fā)布時(shí)生成或更新CHANGLOG.rst文件鱼炒。
catkin_init_workspace - 初始化catkin構(gòu)建系統(tǒng)的工作目錄衔沼。
catkin_find - 搜素catkin,找到并顯示工作空間。
4.5 ROS功能包命令
rospack [選項(xiàng)] [功能包名稱(chēng)] - 查看與ROS功能包相關(guān)的信息(可以使用find, list, depend-on, depends和profile等選項(xiàng))指蚁。
rosinstall - 安裝ROS附加功能包菩佑。
rosdep [選項(xiàng)] - 安裝該功能包的依賴(lài)性文件(check, install, init, update)。
roslocate [選項(xiàng)] [功能包名稱(chēng)] - ROS功能包信息相關(guān)命令(可用的選項(xiàng)是info, vcs, type, uri和repo等)凝化。 - 基本操作
5.1 創(chuàng)建ROS工作空間
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
其中catkin_ws是自定義的工作空間名稍坯,也就是文件夾名。
5.2 將工作空間配置進(jìn)環(huán)境變量
可通過(guò)以下的命令來(lái)配置:
source devel/setup.bash
也可直接在.bashrc里寫(xiě)入:
source ~/catkin_ws/devel/setup.bash
5.3 創(chuàng)建一個(gè)功能包
首先切換到工作空間的src目錄下:
cd ~/catkin_ws/src
再使用catkin_create_pkg命令來(lái)創(chuàng)建功能包:
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
其中搓劫,beginner_tutorials是創(chuàng)建的功能包名瞧哟,后面是該功能包依賴(lài)的三個(gè)功能包。運(yùn)行完后可以看出在beginner_tutorials目錄下創(chuàng)建了package.xml和CMakeLists.txt兩個(gè)文件枪向。
5.4 配置package.xml文件
接下來(lái)對(duì)package.xml文件進(jìn)行配置勤揩。package.xml文件主要由4個(gè)標(biāo)簽組成,分別為描述標(biāo)簽秘蛔、維護(hù)者標(biāo)簽陨亡、許可證標(biāo)簽、依賴(lài)項(xiàng)標(biāo)簽深员。
<?xml version="1.0"?>
<package format="2">
<name>beginner_tutorials</name>
<version>0.1.0</version>
<description>The beginner_tutorials package</description>
<maintainer email="you@yourdomain.tld">Your Name</maintainer>
<license>BSD</license>
<url type="website">http://wiki.ros.org/beginner_tutorials</url>
<author email="you@yourdomain.tld">Jane Doe</author>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>rospy</exec_depend>
<exec_depend>std_msgs</exec_depend>
</package>
5.5 編寫(xiě)ROS程序
在 ~/工作空間/src/功能包名 目錄下负蠕,創(chuàng)建并編輯cpp程序文件(以hello.cpp為例)。運(yùn)行如下命令:
cd ~/catkin_ws/src/beginner_tutorials
touch hello.cpp
gedit hello.cpp
hello.cpp代碼如下:
#include <ros/ros.h>
int main ( int argc , char ** argv)
{
ros::init ( argc , argv , "hello");
ros::NodeHandle nh;
ROS_INFO_STREAM( "Hello , ROS! ");
}
5.6 編譯ROS程序
5.6.1 聲明依賴(lài)庫(kù)
首先辨液,我們需要聲明程序所依賴(lài)的其他功能包虐急。對(duì)于C++程序而言,此步驟是必要的滔迈,以確保catkin能夠向C++編譯器提供合適的標(biāo)記來(lái)定位編譯功能包所需的頭文件和鏈接庫(kù)止吁。
為了給出依賴(lài)庫(kù),我們需要編輯CMakeLists.txt文件燎悍。即修改find_package如下:
find_package(catkin REQUIRED COMPONENTS
依次寫(xiě)上所依賴(lài)的功能包
roscpp
)
同樣敬惦,我們也需要在package.xml文件中列出依賴(lài)庫(kù),由于hello程序在編譯時(shí)和運(yùn)行時(shí)都需要roscpp庫(kù)谈山,故將roscpp添加至build_depend(編譯依賴(lài))和exec_depend(運(yùn)行依賴(lài))俄删。如下:
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_export_depend>roscpp</build_export_depend>
<exec_depend>roscpp</exec_depend>
5.6.2 聲明可執(zhí)行文件
接下來(lái),我們需要在CMakeLists.txt中添加兩行奏路,來(lái)聲明我們需要?jiǎng)?chuàng)建的可執(zhí)行文件畴椰。
第一行:
add_executable(hello hello.cpp)
其中,hello是我們想要生成的可執(zhí)行文件的文件名鸽粉,hello.cpp是生成此可執(zhí)行文件所需的源文件列表斜脂。如果有多個(gè)源文件,把它們列在此處触机,并用空格將其區(qū)分開(kāi)帚戳。
第二行:
target_link_libraries(hello ${catkin_LIBRARIES})
該行告訴Cmake當(dāng)鏈接此可執(zhí)行文件時(shí)需要鏈接哪些庫(kù)(在上面的find_package中已經(jīng)定義了)玷或。
5.6.3 編譯工作區(qū)
首先返回工作空間目錄,然后使用catkin_make命令進(jìn)行編譯:
cd ~/catkin_ws
catkin_make
完成編譯后片任,將會(huì)在工作區(qū)中創(chuàng)建devel(開(kāi)發(fā)空間偏友,用來(lái)放置編譯生成的可執(zhí)行文件)和build(編譯空間,用來(lái)儲(chǔ)存工作空間編譯過(guò)程中產(chǎn)生的緩存信息和中間文件)兩個(gè)子目錄对供。
5.7 運(yùn)行ROS程序
hello 程序是一個(gè)節(jié)點(diǎn)(Node)位他,需要節(jié)點(diǎn)管理器才可以正常運(yùn)行,啟動(dòng)節(jié)點(diǎn)管理器后犁钟,用rosrun命令運(yùn)行程序:
roscore
rosrun beginner_tutorials hello
至此棱诱,完成了創(chuàng)建工作空間、功能包涝动、編寫(xiě)迈勋、編譯、運(yùn)行簡(jiǎn)單的ROS程序醋粟。