安裝好了ROS過后就可以開始下面ROS的工作環(huán)境了
主要參考下面文檔:CSDN ROS入門教程(一)
一陕靠、ROS的工作環(huán)境
1.1 管理ROS環(huán)境
確保ROS的環(huán)境變量已經被設置
# bash 中輸入下面的信息喳坠,會輸出一大串關于ROS的環(huán)境信息
printenv | grep ROS
1.2 創(chuàng)建ROS工作空間
ROS Groovy發(fā)布于2012年鞠评,在這版本以及之后的都使用catkin進行創(chuàng)建ROS工作空間的工作。
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
在工作空間首次運行 catkin_make 命令后壕鹉,它會在 ./src 目錄下創(chuàng)建一個 CMakeLists.txt 文件剃幌。
jet@jet-vm:~/catkin_ws$ ls
# 輸出如下
build devel src
在 devel 文件夾中會有幾個 setup.sh* 文件。source 命令執(zhí)行其中的文件會覆蓋工作空間頂層的環(huán)境晾浴。
source devel/setup.bash
# 因為我這里使用的是默認的bash環(huán)境负乡,如果是zsh則是另外一個
查看是否修改了環(huán)境變量:
$echo $ROS_PACKAGE_PATH
jet@jet-vm:~/catkin_ws$ printenv | grep ROS
通過對比輸出可以發(fā)現(xiàn)環(huán)境變量中 ROS_PACKAGE_PATH 和ROSLISP_PACKAGE_DIRECTORIES 發(fā)生了變化。
二脊凰、ROS文件系統(tǒng)
因為一開始安裝ROS的時候選項是 ros-kinetic-desktop-full 所以下面需要的文件系統(tǒng)已經安裝完畢了抖棘。
2.1 文件系統(tǒng)的概念
Packages:Packages是ROS代碼的軟件單元的一種組織方式,每個Package可以包含庫狸涌,可執(zhí)行程序切省,腳本等。
Manifests(Package.xml):manifest是一個package的描述文件帕胆,它定義了包之間的依賴朝捆,并用來捕獲包的元信息(meta information,元數據是關于數據的組織懒豹、數據域及其關系的信息芙盘,簡言之,元數據就是關于數據的數據脸秽。)儒老,例如版本,維護者豹储,證書等等贷盲。
2.3 文件系統(tǒng)工具
ROS代碼有獨有的包管理命令
-
rospack = ros+package
rospack 可以獲取有關packages的信息,幫助命令是 rospack help
jet@jet-vm:~/catkin_ws$ rospack find roscpp # 會輸出相關信息
-
roscd = ros+cd
roscd 是 rosbash 的一部分剥扣,此命令可以切換到包的相關目錄中巩剖。
jet@jet-vm:~/catkin_ws$ roscd roscpp jet@jet-vm:~/catkin_ws$ pwd
注:ROS工具只尋找 ROS_PACKAGE_PATH 所列出路徑,其中的每個路徑用 ”:“ 進行分隔钠怯。
-
roscd log
此命令會進入ROS的log文件夾佳魔,如果之前沒有運行過ROS程序則會報錯。
rosls = ros+ls
ROS工具中很多都是 ROS+XX組合的命令晦炊。
三鞠鲜、創(chuàng)建ROS Package
此章節(jié)使用 roscreate-pkg 或 catkin 創(chuàng)建一個新的package宁脊,并用rospack列出包的依賴關系。
3.1 一個catkin package的組成
必須包含一個catkin兼容的package.xml文件
必須包含一個使用catkin的CMakeLists.txt
-
每個package必須有自己的文件夾:這意味著沒有嵌套的包贤姆,也沒有共享同一目錄的多個包榆苞。
最簡單的package如下:
my_package/ CMakeLists.txt package.xml
3.2 catkin工作空間中的package
使用catkin packages工作的推薦方式的是使用catkin工作空間,當然也可以單獨建立一個catkin package霞捡。一個普通的工作空間大概如下:
jet@jet-vm:~/catkin_ws$ tree
.
├── build
│ ├── atomic_configure
│ │ ├── env.sh
│ │ ├── local_setup.bash
│ │ ├── local_setup.sh
│ │ ├── local_setup.zsh
│ │ ├── setup.bash
│ │ ├── setup.sh
│ │ ├── _setup_util.py
│ │ └── setup.zsh
│ ├── catkin
│ │ └── catkin_generated
│ │ └── version
│ │ └── package.cmake
│ ├── catkin_generated
│ │ ├── env_cached.sh
│ │ ├── generate_cached_setup.py
│ │ ├── installspace
│ │ │ ├── env.sh
│ │ │ ├── local_setup.bash
│ │ │ ├── local_setup.sh
│ │ │ ├── local_setup.zsh
│ │ │ ├── setup.bash
│ │ │ ├── setup.sh
│ │ │ ├── _setup_util.py
│ │ │ └── setup.zsh
│ │ ├── order_packages.cmake
│ │ ├── order_packages.py
│ │ ├── setup_cached.sh
│ │ └── stamps
│ │ └── Project
│ │ ├── interrogate_setup_dot_py.py.stamp
│ │ ├── order_packages.cmake.em.stamp
│ │ ├── package.xml.stamp
│ │ └── _setup_util.py.stamp
│ ├── CATKIN_IGNORE
│ ├── catkin_make.cache
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ │ ├── 3.5.1
│ │ │ ├── CMakeCCompiler.cmake
│ │ │ ├── CMakeCXXCompiler.cmake
│ │ │ ├── CMakeDetermineCompilerABI_C.bin
│ │ │ ├── CMakeDetermineCompilerABI_CXX.bin
│ │ │ ├── CMakeSystem.cmake
│ │ │ ├── CompilerIdC
│ │ │ │ ├── a.out
│ │ │ │ └── CMakeCCompilerId.c
│ │ │ └── CompilerIdCXX
│ │ │ ├── a.out
│ │ │ └── CMakeCXXCompilerId.cpp
│ │ ├── clean_test_results.dir
│ │ │ ├── build.make
│ │ │ ├── cmake_clean.cmake
│ │ │ ├── DependInfo.cmake
│ │ │ └── progress.make
│ │ ├── cmake.check_cache
│ │ ├── CMakeDirectoryInformation.cmake
│ │ ├── CMakeError.log
│ │ ├── CMakeOutput.log
│ │ ├── CMakeRuleHashes.txt
│ │ ├── CMakeTmp
│ │ ├── download_extra_data.dir
│ │ │ ├── build.make
│ │ │ ├── cmake_clean.cmake
│ │ │ ├── DependInfo.cmake
│ │ │ └── progress.make
│ │ ├── doxygen.dir
│ │ │ ├── build.make
│ │ │ ├── cmake_clean.cmake
│ │ │ ├── DependInfo.cmake
│ │ │ └── progress.make
│ │ ├── feature_tests.bin
│ │ ├── feature_tests.c
│ │ ├── feature_tests.cxx
│ │ ├── Makefile2
│ │ ├── Makefile.cmake
│ │ ├── progress.marks
│ │ ├── run_tests.dir
│ │ │ ├── build.make
│ │ │ ├── cmake_clean.cmake
│ │ │ ├── DependInfo.cmake
│ │ │ └── progress.make
│ │ ├── TargetDirectories.txt
│ │ └── tests.dir
│ │ ├── build.make
│ │ ├── cmake_clean.cmake
│ │ ├── DependInfo.cmake
│ │ └── progress.make
│ ├── cmake_install.cmake
│ ├── CTestConfiguration.ini
│ ├── CTestCustom.cmake
│ ├── CTestTestfile.cmake
│ ├── gtest
│ │ ├── CMakeFiles
│ │ │ ├── CMakeDirectoryInformation.cmake
│ │ │ ├── gmock.dir
│ │ │ │ ├── build.make
│ │ │ │ ├── cmake_clean.cmake
│ │ │ │ ├── DependInfo.cmake
│ │ │ │ ├── depend.make
│ │ │ │ ├── flags.make
│ │ │ │ ├── link.txt
│ │ │ │ ├── progress.make
│ │ │ │ ├── src
│ │ │ │ └── usr
│ │ │ │ └── src
│ │ │ │ └── gtest
│ │ │ │ └── src
│ │ │ ├── gmock_main.dir
│ │ │ │ ├── build.make
│ │ │ │ ├── cmake_clean.cmake
│ │ │ │ ├── DependInfo.cmake
│ │ │ │ ├── depend.make
│ │ │ │ ├── flags.make
│ │ │ │ ├── link.txt
│ │ │ │ ├── progress.make
│ │ │ │ ├── src
│ │ │ │ └── usr
│ │ │ │ └── src
│ │ │ │ └── gtest
│ │ │ │ └── src
│ │ │ └── progress.marks
│ │ ├── cmake_install.cmake
│ │ ├── CTestTestfile.cmake
│ │ ├── gtest
│ │ │ ├── CMakeFiles
│ │ │ │ ├── CMakeDirectoryInformation.cmake
│ │ │ │ ├── gtest.dir
│ │ │ │ │ ├── build.make
│ │ │ │ │ ├── cmake_clean.cmake
│ │ │ │ │ ├── DependInfo.cmake
│ │ │ │ │ ├── depend.make
│ │ │ │ │ ├── flags.make
│ │ │ │ │ ├── link.txt
│ │ │ │ │ ├── progress.make
│ │ │ │ │ └── src
│ │ │ │ ├── gtest_main.dir
│ │ │ │ │ ├── build.make
│ │ │ │ │ ├── cmake_clean.cmake
│ │ │ │ │ ├── DependInfo.cmake
│ │ │ │ │ ├── depend.make
│ │ │ │ │ ├── flags.make
│ │ │ │ │ ├── link.txt
│ │ │ │ │ ├── progress.make
│ │ │ │ │ └── src
│ │ │ │ └── progress.marks
│ │ │ ├── cmake_install.cmake
│ │ │ ├── CTestTestfile.cmake
│ │ │ └── Makefile
│ │ └── Makefile
│ ├── Makefile
│ └── test_results
├── devel
│ ├── cmake.lock
│ ├── env.sh
│ ├── lib
│ ├── local_setup.bash
│ ├── local_setup.sh
│ ├── local_setup.zsh
│ ├── setup.bash
│ ├── setup.sh
│ ├── _setup_util.py
│ └── setup.zsh
└── src
└── CMakeLists.txt -> /opt/ros/kinetic/share/catkin/cmake/toplevel.cmake
43 directories, 123 files
jet@jet-vm:~/catkin_ws$
3.3 創(chuàng)建一個catkin Package
創(chuàng)建工作空間的方法在章節(jié):1.2 創(chuàng)建ROS的工作環(huán)境
-
創(chuàng)建package代碼:
# 示例 catkin_create_pkg <package_name> [depend1][depend2][depend3] #具體命令 $ cd ~/catkin_ws/src jet@jet-vm:~/catkin_ws/src$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp Created file beginner_tutorials/package.xml Created file beginner_tutorials/CMakeLists.txt Created folder beginner_tutorials/include/beginner_tutorials Created folder beginner_tutorials/src Successfully created files in /home/jet/catkin_ws/src/beginner_tutorials. Please adjust the values in package.xml. jet@jet-vm:~/catkin_ws/src$
3.4 編譯catkin工作空間并source
//主要命令如下
$ cd ~/catkin_ws
$ catkin_make
$ . ~/catkin_ws/devel/setup.bash
jet@jet-vm:~/catkin_ws/src$ cd ..
jet@jet-vm:~/catkin_ws$ catkin_make
Base path: /home/jet/catkin_ws
Source space: /home/jet/catkin_ws/src
Build space: /home/jet/catkin_ws/build
Devel space: /home/jet/catkin_ws/devel
Install space: /home/jet/catkin_ws/install
####
#### Running command: "cmake /home/jet/catkin_ws/src -DCATKIN_DEVEL_PREFIX=/home/jet/catkin_ws/devel -DCMAKE_INSTALL_PREFIX=/home/jet/catkin_ws/install -G Unix Makefiles" in "/home/jet/catkin_ws/build"
####
-- Using CATKIN_DEVEL_PREFIX: /home/jet/catkin_ws/devel
-- Using CMAKE_PREFIX_PATH: /opt/ros/kinetic
-- This workspace overlays: /opt/ros/kinetic
-- Using PYTHON_EXECUTABLE: /usr/bin/python
-- Using Debian Python package layout
-- Using empy: /usr/bin/empy
-- Using CATKIN_ENABLE_TESTING: ON
-- Call enable_testing()
-- Using CATKIN_TEST_RESULTS_DIR: /home/jet/catkin_ws/build/test_results
-- Found gmock sources under '/usr/src/gmock': gmock will be built
-- Found gtest sources under '/usr/src/gmock': gtests will be built
-- Using Python nosetests: /usr/bin/nosetests-2.7
-- catkin 0.7.18
-- BUILD_SHARED_LIBS is on
-- BUILD_SHARED_LIBS is on
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- ~~ traversing 1 packages in topological order:
-- ~~ - beginner_tutorials
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- +++ processing catkin package: 'beginner_tutorials'
-- ==> add_subdirectory(beginner_tutorials)
-- Configuring done
-- Generating done
-- Build files have been written to: /home/jet/catkin_ws/build
####
#### Running command: "make -j2 -l2" in "/home/jet/catkin_ws/build"
####
jet@jet-vm:~/catkin_ws$ . ~/catkin_ws/devel/setup.bash
jet@jet-vm:~/catkin_ws$
3.5 package依賴
-
一級依賴
jet@jet-vm:~/catkin_ws$ rospack depends1 beginner_tutorials roscpp rospy std_msgs jet@jet-vm:~/catkin_ws$ # 此命令的輸出與創(chuàng)建package時傳入的參數一致坐漏,這些對packages的依賴存儲在package.xml 中
-
間接依賴
jet@jet-vm:~/catkin_ws$ rospack depends1 rospy genpy roscpp rosgraph rosgraph_msgs roslib std_msgs jet@jet-vm:~/catkin_ws$ #一般情況下,一個依賴項目都有自己的依賴項碧信,rospack可以遞歸檢測所有的嵌套依賴赊琳。
3.6 定制package
-
定制package.xml
包括description,maintainer砰碴,lincense躏筏,dependencies(包括了 buildtool_depend,build_depend,exec_depend)
定制CMakeLists.txt
四、編譯Package
4.1 編譯package
-
catkin_make 可以看做是標準的cmake工作流程:cmake呈枉,make
# In a CMake Project $ mkdir build $ cd build $ cmake .. $ make $ make install #(optionally) # In a catkin workspace $ catkin_make $ catkin_make install #(optionally)
catkin_make 命令將編譯 src 目錄下的所有工程趁尼。對于源碼不再當前目錄下的使用方法為:
# In a catkin workspace $ catkin_make --source my_src $ catkin_make install --source my_src #(optionally)
-
編譯package
在當前工作空間中(~/catkin_ws): catkin_make
五、ROS Nodes
本節(jié)引入ROS Graph的概念碴卧,并探討roscore弱卡,rosnode,rosrun的使用住册。
5.1 Graph的概念
Nodes:一個node表示一個使用ROS來與其他nodes進行通訊的可執(zhí)行程序婶博。
Messages:ROS的數據類型
Topics:Nodes可以向topic發(fā)布消息,也可以訂閱topic來接收消息荧飞。
Master:Name sevice for ROS(幫助節(jié)點找到彼此)
rosout:ROS下的stdout/stderr拍谐。
roscore:Master + rosout + parameter server
5.2 Nodes
在ROS package中狼速,一個Node實際上只不過是一個可執(zhí)行文件。ROS Nodes使用ROS client library與其他nodes進行通信。Nodes可以發(fā)布和訂閱一個Topic褒傅。Nodes也可以提供或使用一個sevice屹培。
5.3 Client Libraries
ROS client library 允許使用不同編程語言寫出來的Nodes進行通信迂苛。
rospy = python client library
roscpp = C plus plus client library
5.4 roscore
roscore 是當你使用ROS時第一個應該運行的核心程序禁悠。
5.5 使用rosnode
rosnode顯示當前正在運行的有關ROS nodes的信息
# 列出活躍狀態(tài)的nodes
jet@jet-vm:~$ rosnode list
/rosout
jet@jet-vm:~$ rosnode info /rosout
--------------------------------------------------------------------------------
Node [/rosout]
Publications:
* /rosout_agg [rosgraph_msgs/Log]
Subscriptions:
* /rosout [unknown type]
Services:
* /rosout/get_loggers
* /rosout/set_logger_level
contacting node http://jet-vm:41897/ ...
Pid: 2381
jet@jet-vm:~$
5.6 使用rosrun
rosrun 允許使用package名來直接運行一個package中的node(不必知道package的路徑)。
# usage : rosrun [package_name] [nodename]
jet@jet-vm:~$ rosrun turtlesim turtlesim_node
[ INFO] [1565093878.731080946]: Starting turtlesim with node name /turtlesim
[ INFO] [1565093878.747198414]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]
# 彈出一個烏龜的窗口
ROS支持為node重新指定名字
$ rosrun turtlesim turtlesim_node __name:=my_turtle
jet@jet-vm: ~ $ rosnode list
/my_turtle
/rosout
可以使用 rosnode 的 ping 參數來測試是否node正常運行睛藻。
jet@jet-vm:~$ rosnode ping turtlesim
rosnode: node is [/turtlesim]
pinging /turtlesim with a timeout of 3.0s
xmlrpc reply from http://jet-vm:36863/ time=0.334024ms
xmlrpc reply from http://jet-vm:36863/ time=2.504826ms
xmlrpc reply from http://jet-vm:36863/ time=1.864910ms
xmlrpc reply from http://jet-vm:36863/ time=1.274824ms
xmlrpc reply from http://jet-vm:36863/ time=1.255035ms
^Cping average: 1.446724ms
jet@jet-vm:~$
如果出現(xiàn)上面的輸出代表已經成功運行了启上。
5.7 總結
roscore 是所有運行的核心 = ros + core: master(prodives name service for ROS) + rosout(stdout/stderr) +parameter server.
rosnode = ros + node : ROS tool to get Information about a node.
rosrun = ros + run: runs a node from a given package
六、ROS Topics
本節(jié)引入ROS topics店印,與此同時使用rostopic和rqt_plot工具
6.1 準備工作
確保roscore在運行冈在,在一個新打開的終端輸入roscore可進行測試。
-
運行如下命令
$ rosrun turtlesim turtlesim_node
-
運行如下命令
$ rosrun turtlesim turtle_teleop_key # 之后可以使用方向按鍵控制烏龜動起來了
6.2 ROS Topics
-
使用 rqt-graph
rqt-graph 創(chuàng)建系統(tǒng)的一個動態(tài)范圍按摘。rqt-graph 是 rqt package 的一部分包券,安裝方法如下:
# 按照正常安裝全部的方法都是已經安裝好了 $ sudo apt-get install ros-kinetic-rqt $ sudo apt-get install ros-kinetic-rqt-common-plugins
在終端中輸入以下命令會出現(xiàn)一個可視化窗口顯示nodes之間的關系纫谅。
$ rosrun rqt_graph rqt_graph
-
引入 rostopic
rostopic 工具用來獲取 ROS topics。
-
使用 rostopic echo
rostopic echo 顯示發(fā)布在一個topic上的數據溅固,只有在運行之后有新的消息發(fā)布到topic上時才會有輸出
# Usage $ rostopic echo [topic] $ rostopic echo /turtle1/cmd_vel
-
使用**rostopic list **
使用 $ rostopic list -v 列出所有的 topics
jet@jet-vm:~$ rostopic list -v Published topics: * /turtle1/color_sensor [turtlesim/Color] 1 publisher * /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher * /rosout [rosgraph_msgs/Log] 3 publishers * /rosout_agg [rosgraph_msgs/Log] 1 publisher * /turtle1/pose [turtlesim/Pose] 1 publisher Subscribed topics: * /turtle1/cmd_vel [geometry_msgs/Twist] 2 subscribers * /rosout [rosgraph_msgs/Log] 1 subscriber jet@jet-vm:~$
6.3 ROS Messages
ropics上的通訊是通過在nodes之間發(fā)送 ROS messages進行的付秕。發(fā)布者和訂閱者必須發(fā)哦是那個和接收同種類型的消息。這意味著发魄,topic的類型是由發(fā)布在其上的message類型定義的盹牧。message的類型可通過 rostopic type [topic] 來查詢±祝可以使用 rosmsg show type 查看信息格式。
jet@jet-vm:~$ rostopic list -v
Published topics:
* /turtle1/color_sensor [turtlesim/Color] 1 publisher
* /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
* /rosout [rosgraph_msgs/Log] 3 publishers
* /rosout_agg [rosgraph_msgs/Log] 1 publisher
* /turtle1/pose [turtlesim/Pose] 1 publisher
Subscribed topics:
* /turtle1/cmd_vel [geometry_msgs/Twist] 2 subscribers
* /rosout [rosgraph_msgs/Log] 1 subscriber
jet@jet-vm:~$ rostopic type /turtle1/cmd_vel
geometry_msgs/Twist
jet@jet-vm:~$ rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
jet@jet-vm:~$
6.4 rostopic 續(xù)
-
rostopic pub可以在一個topic上發(fā)布數據
# Usage: rostopic pub [topic] [msg_type] [args] # 雙短線表示后邊的不是命令選項而是參數 jet@jet-vm:~$ rostopic pub -l /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0,0.0,0.0]' '[0.0,0.0,1.0]' publishing and latching message. Press ctrl-C to terminate # 此時可以看到烏龜動了口柳,幾次執(zhí)行下來可以看到烏龜走了一個純圓苹粟。
- rostopic hz 報告數據發(fā)布速率: $ rostopic hz [topic]
jet@jet-vm:~$ rostopic hz /turtle1/cmd_vel
subscribed to [/turtle1/cmd_vel]
no new messages
no new messages
average rate: 4.828
min: 0.144s max: 0.288s std dev: 0.04833s window: 6
average rate: 5.999
min: 0.099s max: 0.288s std dev: 0.04975s window: 13
average rate: 7.209
min: 0.042s max: 0.298s std dev: 0.06797s window: 23
當有數據變動的時候也就是有數據傳輸。
6.5 使用 rqt_plot
使用指令 $ rosrun rqt_plot rqt_plot 跃闹,添加需要查看的topic嵌削。
七、ROS Services and Parameters
本節(jié)介紹ROS Services and Parameters望艺,與此同時使用使用 rosservice 和 rosparam 命令行工具苛秕。services 是nodes間進行通信的另一種方式,services 允許nodes發(fā)送一個請求(request)和接收一個響應(response)找默。
#Usage:
$ rosservice list [topic] #列出[topic]鎖提供的服務
$ rosservice type [service] # 顯示服務類型
$ rosservice call [service] [args] # 調用服務
# 查看帶參數的示例
rosservice find #find service by service type
rosservice uri #print service ROSRPC uri
jet@jet-vm:~/work$ rosservice type /spawn | rossrv show
float32 x
float32 y
float32 theta
string name
---
string name
jet@jet-vm:~/work$ rosservice call /spawn 2 2 0.2 "" # name field is optional
name: "turtle2"
rosparam 循序我們存儲和操作 ROS parameter Server 上的數據艇劫,Parameter Server
可以存儲整型,浮點型惩激,布爾型店煞,字典,列表风钻。rosparam 使用 YAML 標記語言語法顷蟀。
#Usage:
rosparam set [param_name] #set parameter
# 設置參數過后使用 /clear 服務刷新操作
$ rosservice call /clear
rosparam get [param_name] # get parameter
rosparam load # load parameter from file
rosparam dump # dump parameters to file
rosparam delete # delete parameter
rosparam list # list parameter names
# Usage
rosparam dump [file_name] [namespace]
rosparam load [file_name] [namespace]
# write all the parameters to the file params.yaml
$ rosparam dump params.yaml
# load these yaml files into new namespaces, e.g. copy
$ rosparam load params.yaml copy
$ rosparam get /copy/background_b