欢迎来真孝善网,为您提供真孝善正能量书籍故事!

02. ROS 基础:空间布局、文件系统与小乌龟教程

时间:11-18 名人轶事 提交错误

主要参考以下文档: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_PATHROSLISP_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-pkgcatkin创建新包,并使用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 server

5.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 library

5.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-graphrqt 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,与此同时使用使用rosservicerosparam命令行工具。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

用户评论

此生一诺

我要学习一下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位网友表示赞同!

【02. ROS 基础:空间布局、文件系统与小乌龟教程】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活