主要参考以下文档:CSDN ROS入门教程(一)
一、ROS的工作环境
1.1 管理ROS环境
确保ROS 环境变量已设置
# 在bash中输入以下信息,就会输出一大串ROS的环境信息。
打印环境| grep ROS
1.2 创建ROS工作空间
ROS Groovy 于2012 年发布。在此版本及更高版本中,catkin 用于创建ROS 工作区。
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make在工作空间中第一次运行catkin_make命令后,会在./src目录下创建一个CMakeLists.txt文件。
jet@jet-vm:~/catkin_ws$ ls
#输出如下
构建开发src 将在devel文件夹中包含多个setup.sh* 文件。source命令中的文件将覆盖工作区的顶层环境。
源开发/setup.bash
# 因为我这里使用的是默认的bash环境,如果是zsh,还有一个方法可以检查环境变量是否被修改:
$回显$ROS_PACKAGE_PATH
jet@jet-vm:~/catkin_ws$ printenv | grep ROS 通过对比输出结果,可以发现环境变量中ROS_PACKAGE_PATH和ROSLISP_PACKAGE_DIRECTORIES发生了变化。
二、ROS文件系统
因为一开始安装ROS时选项是ros-kinetic-desktop-full,所以下面需要的文件系统已经安装好了。
2.1 文件系统的概念
包:包是ROS 代码软件单元的一种组织方法。每个包可以包含库、可执行程序、脚本等。
Manifests(Package.xml):Manifest是包描述文件,定义了包之间的依赖关系,用于捕获包的元信息。元数据是有关数据组织、数据域及其关系的信息。简单来说,元数据就是关于数据的数据),比如版本、维护者、证书等。
2.3 文件系统工具
ROS代码具有独特的包管理命令
rospack=ros+包
rospack 可以获取有关包的信息。帮助命令为rospack helpjet@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列出的路径,每个路径以”:“分隔。
罗斯德日志
该命令将进入ROS日志文件夹。如果之前没有运行过ROS程序,就会报错。
rosls=ros+ls
很多ROS工具都是ROS+XX组合的命令。
三、创建ROS Package
本章使用roscreate-pkg或catkin创建新包,并使用rospack列出包的依赖项。
3.1 一个catkin package的组成
必须包含catkin兼容的package.xml文件
必须包含使用catkin的CMakeLists.txt
每个包必须有自己的文件夹:这意味着没有嵌套的包,也没有多个包共享同一目录。
最简单的封装如下:
我的包/
CMakeLists.txt
package.xml
3.2 catkin工作空间中的package
使用catkin 包的推荐方法是使用catkin 工作区。当然,你也可以创建一个单独的catkin包。常见的工作空间可能如下所示:
jet@jet-vm:~/catkin_ws$ 树。
建造
原子配置
env.sh
local_setup.bash
local_setup.sh
local_setup.zsh
setup.bash
setup.sh
_setup_util.py
setup.zsh
柳絮
catkin_generate
版本
package.cmake
catkin_generate
env_cached.sh
generate_cached_setup.py
安装空间
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
邮票
项目
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
进度.make
cmake.check_cache
CMakeDirectoryInformation.cmake
CMakeError.log
CMakeOutput.log
CMakeRuleHashes.txt
CMakeTmp
download_extra_data.dir
build.make
cmake_clean.cmake
DependInfo.cmake
进度.make
doxygen.dir
build.make
cmake_clean.cmake
DependInfo.cmake
进度.make
feature_tests.bin
feature_tests.c
feature_tests.cxx
Makefile2
Makefile.cmake
进度.marks
run_tests.dir
build.make
cmake_clean.cmake
DependInfo.cmake
进度.make
TargetDirectories.txt
测试目录
构建.make
cmake_clean.cmake
DependInfo.cmake
进度.make
cmake_install.cmake
CTestConfiguration.ini
CTestCustom.cmake
CTestTestfile.cmake
测试
CMakeFiles
CMakeDirectoryInformation.cmake
gmock.dir
build.make
cmake_clean.cmake
DependInfo.cmake
dependent.make
flags.make
link.txt
Progress.make
src
usr
src
gtest
src
gmock_main.dir
build.make
cmake_clean.cmake
DependInfo.cmake
dependent.make
flags.make
link.txt
Progress.make
src
usr
src
gtest
src
进度.marks
cmake_install.cmake
CTestTestfile.cmake
gtest
CMakeFiles
CMakeDirectoryInformation.cmake
gtest.dir
build.make
cmake_clean.cmake
DependInfo.cmake
dependent.make
flags.make
link.txt
Progress.make
src
gtest_main.dir
build.make
cmake_clean.cmake
DependInfo.cmake
dependent.make
flags.make
link.txt
Progress.make
src
进度.marks
cmake_install.cmake
CTestTestfile.cmake
Makefile
Makefile
Makefile
测试结果
开发
cmake.lock
env.sh
库
local_setup.bash
local_setup.sh
local_setup.zsh
setup.bash
setup.sh
_setup_util.py
setup.zsh
来源
CMakeLists.txt -/opt/ros/kinetic/share/catkin/cmake/toplevel.cmake
43个目录,123个文件
jet@jet-vm:~/catkin_ws$
3.3 创建一个catkin Package
创建工作空间的方法在章节:1.2 创建ROS的工作环境创建包代码:
例子
catkin_create_pkg[依赖1][依赖2][依赖3]
#具体命令
$ cd ~/catkin_ws/src
jet@jet-vm:~/catkin_ws/src$ catkin_create_pkg Beginner_tutorials std_msgs rospy roscpp
创建文件Beginner_tutorials/package.xml
创建文件beginer_tutorials/CMakeLists.txt
创建文件夹Beginner_tutorials/include/beginner_tutorials
创建文件夹Beginner_tutorials/src
已成功在/home/jet/catkin_ws/src/beginner_tutorials 中创建文件。请调整package.xml中的值。
jet@jet-vm:~/catkin_ws/src$
3.4 编译catkin工作空间并source
//主要命令如下
$ cd ~/catkin_ws
$catkin_make
$。 /catkin_ws/devel/setup.bashjet@jet-vm:/catkin_ws/src$ cd .
jet@jet-vm:~/catkin_ws$ catkin_make
基本路径: /home/jet/catkin_ws
源空间: /home/jet/catkin_ws/src
构建空间: /home/jet/catkin_ws/build
开发空间: /home/jet/catkin_ws/devel
安装space: /home/jet/catkin_ws/install
####
#### 运行命令: "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/构建"
####
-- 使用CATKIN_DEVEL_PREFIX: /home/jet/catkin_ws/devel
-- 使用CMAKE_PREFIX_PATH: /opt/ros/kinetic
-- 此工作区覆盖: /opt/ros/kinetic
-- 使用PYTHON_EXECUTABLE: /usr/bin/python
-- 使用Debian Python 包布局
-- 使用empy: /usr/bin/empy
-- 使用CATKIN_ENABLE_TESTING: ON
-- 调用enable_testing()
-- 使用CATKIN_TEST_RESULTS_DIR: /home/jet/catkin_ws/build/test_results
-- 在"/usr/src/gmock" 下找到gmock 源: gmock 将被构建
-- 在"/usr/src/gmock" 下找到gtest 源: 将构建gtest
-- 使用Python Nosetests: /usr/bin/nosetests-2.7
--柔荑花序0.7.18
-- BUILD_SHARED_LIBS 已打开
-- BUILD_SHARED_LIBS 已打开
--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- ~~ 按拓扑顺序遍历1个包:
-- ~~ - 初学者教程
--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- +++ 处理catkin package: "beginner_tutorials"
--==add_subdirectory(beginner_tutorials)
--配置完成
-- 生成完成
-- 构建文件已写入: /home/jet/catkin_ws/build
####
#### 在"/home/jet/catkin_ws/build" 中运行command: "make -j2 -l2"
####
jet@jet-vm:~/catkin_ws$ 。 /catkin_ws/devel/setup.bash
jet@jet-vm:~/catkin_ws$
3.5 package依赖
一级依赖
jet@jet-vm:~/catkin_ws$ rospack依赖于1初学者_教程
罗斯普
罗斯皮
标准消息
jet@jet-vm:~/catkin_ws$
# 该命令的输出与创建包时传入的参数一致。这些对包的依赖关系作为间接依赖关系存储在package.xml 中。
jet@jet-vm:~/catkin_ws$ rospack 取决于1 rospy
根皮
罗斯普
罗斯图
rosgraph_msgs
罗斯库
标准消息
jet@jet-vm:~/catkin_ws$
#一般情况下,一个依赖的项目都有自己的依赖关系,rospack可以递归地检测所有嵌套的依赖关系。
3.6 定制package
定制package.xml
包括description、maintainer、lincense、dependency(包括buildtool_depend、build_depend、exec_depend)
自定义CMakeLists.txt
四、编译Package
4.1 编译package
catkin_make 可以看作是标准的cmake工作流程:cmake、make
# 在CMake 项目中
t $ 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
本节引入ROS Graph的概念,并探讨roscore,rosnode,rosrun的使用。5.1 Graph的概念
Nodes:一个node表示一个使用ROS来与其他nodes进行通讯的可执行程序。 Messages:ROS的数据类型 Topics:Nodes可以向topic发布消息,也可以订阅topic来接收消息。 Master:Name sevice for ROS(帮助节点找到彼此) rosout:ROS下的stdout/stderr。 roscore:Master + rosout + parameter server5.2 Nodes
在ROS package中,一个Node实际上只不过是一个可执行文件。ROS Nodes使用ROS client library与其他nodes进行通信。Nodes可以发布和订阅一个Topic。Nodes也可以提供或使用一个sevice。5.3 Client Libraries
ROS client library 允许使用不同编程语言写出来的Nodes进行通信。 rospy = python client library roscpp = C plus plus client library5.4 roscore
roscore 是当你使用ROS时第一个应该运行的核心程序。5.5 使用rosnode
rosnode显示当前正在运行的有关ROS nodes的信息 # 列出活跃状态的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:~$如果出现上面的输出代表已经成功运行了。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
本节引入ROS topics,与此同时使用rostopic和rqt_plot工具6.1 准备工作
确保roscore在运行,在一个新打开的终端输入roscore可进行测试。 运行如下命令 $ rosrun turtlesim turtlesim_node运行如下命令 $ rosrun turtlesim turtle_teleop_key # 之后可以使用方向按键控制乌龟动起来了6.2 ROS Topics
使用rqt-graphrqt-graph创建系统的一个动态范围。rqt-graph是rqt package的一部分,安装方法如下: # 按照正常安装全部的方法都是已经安装好了 $ sudo apt-get install ros-kinetic-rqt $ sudo apt-get install ros-kinetic-rqt-common-plugins在终端中输入以下命令会出现一个可视化窗口显示nodes之间的关系。 $ rosrun rqt_graph rqt_graph引入rostopicrostopic工具用来获取 ROS topics。 使用rostopic echorostopic echo显示发布在一个topic上的数据,只有在运行之后有新的消息发布到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之间发送 ROS messages进行的。发布者和订阅者必须发哦是那个和接收同种类型的消息。这意味着,topic的类型是由发布在其上的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 续
rostopic pub可以在一个topic上发布数据 # 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 # 此时可以看到乌龟动了,几次执行下来可以看到乌龟走了一个纯圆。1565098084483.pngrostopic hz报告数据发布速率:$ 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
本节介绍ROS Services and Parameters,与此同时使用使用rosservice和rosparam命令行工具。services是nodes间进行通信的另一种方式,services允许nodes发送一个请求(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【02. ROS 基础:空间布局、文件系统与小乌龟教程】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
我要学习一下ROS空间管理!
有18位网友表示赞同!
不知道这篇文章会介绍哪些常用的文件?
有7位网友表示赞同!
希望能够学习到如何使用小乌龟来进行程序调试!
有13位网友表示赞同!
最近在研究ROS,感觉文件系统是比较重要的部分!
有9位网友表示赞同!
搞懂ROS的空间管理,才能更好地利用机器人资源吧?
有9位网友表示赞同!
的小乌龟听起来很有趣,是个不错的开发工具。
有12位网友表示赞同!
之前遇到过一些ROS空间配置的问题,希望能在这篇文章里找到答案!
有11位网友表示赞同!
学习ROS文件系统,能更清晰地了解工程结构啊!
有7位网友表示赞同!
对机器人平台来说,空间管理和文件系统至关重要!
有16位网友表示赞同!
想要探索一下ROS中使用小乌龟开发的可能性!
有11位网友表示赞同!
文章的主题很有吸引力!期待深入学习。
有16位网友表示赞同!
ROS的空间组织方式会影响程序的效率和可维护性吗?
有17位网友表示赞同!
如何合理规划ROS文件系统,才是高效编程的关键吧?
有7位网友表示赞同!
看了标题,感觉这篇文章可以帮助我进一步理解ROS的工作机制!
有17位网友表示赞同!
学习ROS小乌龟的使用技巧,能让我开发机器人程序更加方便快捷!
有15位网友表示赞同!
空间管理和文件系统对于大型机器人项目来说尤其重要吧?
有16位网友表示赞同!
希望这篇文章能够讲解一些实际的案例,让理解更具体!
有19位网友表示赞同!
我要找一篇深入浅出讲解ROS空间、文件系统的文章,看来这篇不错!
有13位网友表示赞同!
看了标题,感觉这篇文章很有潜力!期待它的深入分析和实践指导!
有13位网友表示赞同!