参考:http://wiki.ros.org/cn/ROS/Tutorials
1.安装并配置ROS环境
1.1 安装ROS :apt安装无权限
1.2管理环境 :
ROS是依赖组合空间的概念,配置脚本环境。
安装ROS期间,你会看到提示说需要 source 多个setup.*sh文件中的某一个,或者甚至提示添加这条'source'命令到你的启动脚本里面。
检查配置的环境变量:
export | grep ROS
$ source /opt/ros/hydro/setup.bash
事先在.bashrc文件(初学者请注意:该文件是在当前系统用户的home目录下。)中添加这条命令,这样当你每次登录后系统已经帮你执行这些命令配置好环境。
1.3 创建工作空间 catkin_make
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
编译
$ cd ~/catkin_ws/
$ catkin_make
看到'build'和'devel'这两个文件夹
source这些文件中的任何一个setup.*sh文件都可以将当前工作空间设置在ROS工作环境的最顶层。
$ source devel/setup.bash
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2.ROS文件系统介绍:命令行工具roscd、rosls和rospack
2.1 文件系统概念
Packages: 软件包,是ROS应用程序代码的组织单元,每个软件包都可以包含程序库、可执行文件、脚本或者其它手动创建的东西。
Manifest (package.xml): 清单,是对于'软件包'相关信息的描述,用于定义软件包相关元信息之间的依赖关系,这些信息包括版本、维护者和许可协议等。
2.2 文件系统工具
2.2.1 rospack
# rospack find [包名称] $ rospack find roscpp
2.2.2 roscd
# roscd [本地包名称[/子目录]] $ roscd roscpp
roscd只能切换到那些路径已经包含在ROS_PACKAGE_PATH环境变量中的软件包
查看ROS_PACKAGE_PATH中包含的路径 (用冒号隔开) $ echo $ROS_PACKAGE_PATH
子目录 $ roscd roscpp/cmake $ pwd
2.2.3 roscd log 切换到ROS保存日记文件的目录下
$ roscd log
2.2.4 rosls 罗列目录
# rosls [本地包名称[/子目录]] $ rosls roscpp_tutorials
2.2.5 Tab 自动完成输入
# roscd roscpp_tut<<< 现在请按TAB键 >>>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3创建ROS程序包
使用roscreate-pkg或catkin创建一个新程序包,并使用rospack查看程序包的依赖关系
3.1 catkin包的组成
catkin程序包必须包含 package.xml文件(提供有关程序包的元信息。)
CMakeLists.txt文件
每个目录下只能有一个程序包。(同一个目录下不能有嵌套的或者多个程序包存在)
3.2 catkin空间包
文件结构如下
workspace_folder/ -- WORKSPACE
src/ -- SOURCE SPACE
CMakeLists.txt -- 'Toplevel' CMake file, provided by catkin
package_1/
CMakeLists.txt -- CMakeLists.txt file for package_1
package.xml -- Package manifest for package_1
...
package_n/
CMakeLists.txt -- CMakeLists.txt file for package_n
package.xml -- Package manifest for package_n
3.3创建一个catkin程序包: catkin_create_pkg命令来创建一个新的catkin程序包
3.3.1 切换到之前通过创建catkin工作空间教程创建的catkin工作空间中的src目录下
$ cd ~/catkin_ws/src
3.3.2 使用catkin_create_pkg命令来创建一个名为'beginner_tutorials'的新程序包,这个程序包依赖于std_msgs、roscpp和rospy
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
# catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
依赖包随后保存在package.xml文件中
3.4 程序包依赖关系:
3.4.1 使用rospack命令工具查看一级依赖包
$ rospack depends1 beginner_tutorials
$ roscd beginner_tutorials
$ cat package.xml (查看依赖关系)
3.4.2 间接依赖
rospack可以递归检测出所有的依赖包。
$ rospack depends beginner_tutorials
3.5自定义你的程序包
剖析catkin_create_pkg命令生成的每个文件并详细描述这些文件的组成部分以及如何自定义这些文件
3.5.1自定义 package.xml
描述标签 <description>The beginner_tutorials package</description>
维护者标签 <maintainer email="
[email protected]">user</maintainer>
许可标签 <license>BSD</license>
常见的开源许可协议有BSD、MIT、Boost Software License、GPLv2、GPLv3、LGPLv2.1和LGPLv3。
依赖项标签 (依赖项分为build_depend、buildtool_depend、run_depend、test_depend)
catkin中默认提供的buildtool_depend ;build_depend标签 ;run_depend标签
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<run_depend>roscpp</run_depend>
<run_depend>rospy</run_depend>
<run_depend>std_msgs</run_depend>
最后完成的 package.xml
<?xml version="1.0"?>
<package>
<name>beginner_tutorials</name>
<version>0.1.0</version>
<description>The beginner_tutorials package</description>
<maintainer email="
[email protected]">Your Name</maintainer>
<license>BSD</license>
<url type="website">http://wiki.ros.org/beginner_tutorials</url>
<author email="
[email protected]">Jane Doe</author>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<run_depend>roscpp</run_depend>
<run_depend>rospy</run_depend>
<run_depend>std_msgs</run_depend>
</package>
3.5.2 自定义 CMakeLists.txt
包含程序包元信息的package.xml文件已经按照需要完成了裁剪整理
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
4.编译ROS程序包
4.1 编译程序包
先source你的环境配置(setup)文件
$ source /opt/ros/groovy/setup.bash
4.1.1 使用 catkin_make:
你可以认为catkin_make是在CMake标准工作流程中依次调用了cmake 和 make。
# 在catkin工作空间下
$ catkin_make [make_targets] [-DCMAKE_VARIABLES=...]
————————————————————————————————————————————————————————————————————————————
CMake标准工作流程主要可以分为以下几个步骤:
# 在一个CMake项目里
$ mkdir build
$ cd build
$ cmake ..
$ make
$ make install # (可选)
——————————————————————————————————————————————————————————————————————————————
# In a catkin workspace 多个catkin项目可以放在工作空间中一起编译
$ catkin_make
$ catkin_make install # (可选)
上述命令会编译src文件夹下的所有catkin工程。
如果你的源代码不在默认工作空间中(~/catkin_ws/src),比如在了my_src中,使用catkin_make:
$ catkin_make --source my_src
$ catkin_make install --source my_src # (optionally)
————————————————————————————————————————————————————————————————————————————————————
4.1.2 开始编译你的程序包
现在切换到catkin workspace 并查看src文件夹
$ cd ~/catkin_ws/
$ ls src
编译
$ catkin_make
catkin_make首先输出它所使用到的每个空间所在的路径。这些空间存在默认配置的原因,有几个文件夹已经在catkin工作空间自动生成
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5 理解 ROS节点::ROS 图(graph)概念 并讨论roscore、rosnode和 rosrun 命令行工具
5.1 模拟器安装
$ sudo apt-get install ros-<distro>-ros-tutorials
5.2 图概念概述
Nodes:节点,一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信。
Messages:消息,消息是一种ROS数据类型,用于订阅或发布到一个话题。
Topics:话题,节点可以发布消息到话题,也可以订阅话题以接收消息。
Master:节点管理器,ROS名称服务 (比如帮助节点找到彼此)。
rosout: ROS中相当于stdout/stderr。
roscore: 主机+ rosout + 参数服务器 (参数服务器会在后面介绍)。
5.3 节点
一个节点其实只不过是ROS程序包中的一个可执行文件。ROS节点可以使用ROS客户库与其他节点通信。 节点可以发布或接收一个话题。节点也可以提供或使用某种服务。
5.4 客户端库
ROS客户端库允许使用不同编程语言编写的节点之间互相通信:
rospy = python 客户端库
roscpp = c++ 客户端库
5.5 roscore
roscore 是你在运行所有ROS程序前首先要运行的命令。
$ roscore
————————————————————————————————————————
如果 roscore 运行后无法正常初始化,很有可能是存在网络配置问题
If you just want to run tests on your local machine (like to run the ROS Tutorials), set these environment variables:
$ export ROS_HOSTNAME=localhost
$ export ROS_MASTER_URI=http://localhost:11311
Then roscore should initialize correctly.
—— ——-------------------------------------------------------
如果 roscore 不能初始化并提示缺少权限,这可能是因为~/.ros文件夹
归属于root用户(只有root用户才能访问),修改该文件夹的用户归属关系:
$ sudo chown -R <your_username> ~/.ros
————————————————————————————————————————————————————————
5.6使用rosnode
-------------------------------------------
当打开一个新的终端时,你的运行环境会复位,同时你的~/.bashrc
文件会复原。如果你在运行类似于rosnode的指令时出现一些问题,也许你需要添加
一些环境设置文件到你的~/.bashrc或者手动重新配置他们。
----------------------------------------------------------
rosnode 显示当前运行的ROS节点信息。rosnode list 指令列出活跃的节点:
$ rosnode list
/rosout 节点用于收集和记录节点调试输出信息
rosnode info 命令返回的是关于一个特定节点的信息。
$ rosnode info /rosout
5.7 使用 rosrun
rosrun 允许你使用包名直接运行一个包内的节点(而不需要知道这个包的路径
$ rosrun [package_name] [node_name]
在一个 新的终端:
$ rosrun turtlesim turtlesim_node
在一个 新的终端:
$ rosrun turtlesim turtlesim_node
使用`ctrl+-C 可以关闭运行
改变节点名称:
$ rosrun turtlesim turtlesim_node __name:=my_turtle
-------------------------------------------------------
清除rosnode
列表,通过: $ rosnode cleanup
---------------------------------------------------------
ping, 测试:
$ rosnode ping my_turtle
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6理解ROS话题::介绍ROS话题(topics)以及如何使用rostopic 和 rxplot 命令行工具
6.1 开始
$ roscore
$ rosrun turtlesim turtlesim_node
通过键盘远程控制turtle
$ rosrun turtlesim turtle_teleop_key
------------------------------------------------------
选中turtle_teleop_key所在的终端窗口以确保你的按键输入能够被捕获。
---------------------------------------------------------------------
6.2 ROS Topics:
turtlesim_node节点和turtle_teleop_key节点之间是通过一个ROS话题来互相通信的。turtle_teleop_key在一个话题上发布按键输入消息,而turtlesim则订阅该话题以接收该消息。
6.2.1 使用 rqt_graph
rqt_graph能够创建一个显示当前系统运行情况的动态图形。rqt_graph是rqt程序包中的一部分。
安装:
$ sudo apt-get install ros-<distro>-rqt
$ sudo apt-get install ros-<distro>-rqt-common-plugins
在一个新终端中运行:
$ rosrun rqt_graph rqt_graph
6.2.2 rostopic介绍
用帮助选项查看rostopic的子命令
6.2.3 使用 rostopic echo:可以显示在某个话题上发布的数据。
rostopic echo [topic]
$ rostopic echo /turtle1/cmd_vel
下方向键使turtle_teleop_key节点发布数据
6.2.4 使用 rostopic list
rostopic list能够列出所有当前订阅和发布的话题。
让我们查看一下list子命令需要的参数,在一个新终端中运行:
$ rostopic list -h
$ rostopic list -v (-v, --verbose list full details about each topic)
6.3 ROS Messages
话题之间的通信是通过在节点之间发送ROS消息实现的。对于发布器(turtle_teleop_key)和订阅器(turtulesim_node)之间的通信,发布器和订阅器之间必须发送和接收相同类型的消息。这意味着话题的类型是由发布在它上面的消息类型决定的。使用rostopic type命令可以查看发布在某个话题上的消息类型。
6.3.1 使用 rostopic type
rostopic type 命令用来查看所发布话题的消息类型。
rostopic type [topic]
$ rostopic type /turtle1/cmd_vel
使用rosmsg命令来查看消息的详细情况
$ rosmsg show geometry_msgs/Twist
6.4 结合消息来使用rostopic
6.4.1 使用 rostopic pub
rostopic pub可以把数据发布到当前某个正在广播的话题上。
rostopic pub [topic] [msg_type] [args]
——————————————————————————————————————————————————————————————————————————————————————————————
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
rostopic pub 这条命令将会发布消息到某个给定的话题
-1 单个破折号)这个参数选项使rostopic发布一条消息后马上退出
/turtle1/command_velocity 这是消息所发布到的话题名称
turtlesim/Velocity 所发布消息的类型。
-- (双破折号)这会告诉命令选项解析器接下来的参数部分都不是命令选项
2.0 1.8 在一个turtlesim/Velocity消息里面包含有两个浮点型元素:linear和angular
————————————————————————————————————————————————————————————————————————————————————————————————————
稳定的频率为1Hz的命令流来保持移动状态
$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
rqt_graph中的情形,可以看到rostopic发布器节点(红色)正在与rostopic echo节点(绿色)进行通信
turtle正沿着一个圆形轨迹连续运动。
我们可以在一个新终端中通过rostopic echo命令来查看turtlesim所发布的数据。
6.4.2 使用 rostopic hz
rostopic hz命令可以用来查看数据发布的频率。
看一下turtlesim_node发布/turtle/pose时有多快:
$ rostopic hz /turtle1/pose
rostopic type /turtle1/cmd_vel | rosmsg show
6.5使用 rqt_plot
rqt_plot命令可以实时显示一个发布到某个话题上的数据变化图形。这里我们将使用rqt_plot命令来绘制正在发布到/turtle1/pose话题上的数据变化图形。首先,在一个新终端中运行rqt_plot命令:
$ rosrun rqt_plot rqt_plot
添加/隐藏 观测量 输入/turtle1/pose/x /turtle1/pose/y /turtle1/pose/theta
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
7.理解ROS服务和参数:
介绍了ROS 服务和参数的知识,以及命令行工具rosservice 和 rosparam的使用方法
----------------------------------
启动的turtlesim_node仍在运行
-------------------------------------
7.1 ROS Services
服务(services)是节点之间通讯的另一种方式。服务允许节点发送请求(request) 并获得一个响应(response)
7.2使用rosservice
rosservice可以很轻松的使用 ROS 客户端/服务器框架提供的服务。
---------------------------------------------------------------
rosservice list 输出可用服务的信息
rosservice call 调用带参数的服务
rosservice type 输出服务类型
rosservice find 依据类型寻找服务find services by service type
rosservice uri 输出服务的ROSRPC uri
-------------------------------------------------------------------
$ rosservice list
list 命令显示turtlesim节点提供了9个服务:重置(reset), 清除(clear), 再生(spawn), 终止(kill), turtle1/set_pen, /turtle1/teleport_absolute, /turtle1/teleport_relative, turtlesim/get_loggers, and turtlesim/set_logger_level. 同时还有另外两个rosout节点提供的服务: /rosout/get_loggers and /rosout/set_logger_level.
rosservice type
使用方法:
rosservice type [service]
我们来看看clear服务的类型:
$ rosservice type clear
返回:std_srvs/Empty
服务的类型为空(empty),这表明在调用这个服务是不需要参数(比如,请求不需要发送数据,响应也没有数据)
rosservice call
使用方法:
rosservice call [service] [args]
因为服务类型是空,所以进行无参数调用:
$ rosservice call clear
再生(spawn)服务的信息 :在给定的位置和角度生成一只新的乌龟
$ rosservice call spawn 2 2 0.2 ""
7.3 Using rosparam
rosparam使得我们能够存储并操作ROS 参数服务器(Parameter Server)上的数据。参数服务器能够存储整型、浮点、布尔、字符串、字典和列表等数据类型。rosparam使用YAML标记语言的语法。一般而言,YAML的表述很自然:1 是整型, 1.0 是浮点型, one是字符串, true是布尔, [1, 2, 3]是整型列表, {a: b, c: d}是字典.
-----------------------------
rosparam set 设置参数
rosparam get 获取参数
rosparam load 从文件读取参数
rosparam dump 向文件中写入参数
rosparam delete 删除参数
rosparam list 列出参数名
---------------------------------------------
rosparam list
$ rosparam list
我们可以看到turtlesim节点在参数服务器上有3个参数用于设定背景颜色
rosparam set and rosparam get
rosparam set [param_name]
rosparam get [param_name]
修改背景颜色的红色通道:
$ rosparam set background_r 150
我们调用清除服务使得修改后的参数生效:
$ rosservice call clear
获取背景的绿色通道的值:
$ rosparam get background_g
使用rosparam get /来显示参数服务器上的所有内容:
$ rosparam get /
rosparam dump and rosparam load
rosparam dump [file_name]
rosparam load [file_name] [namespace]
现在我们将所有的参数写入params.yaml文件:
$ rosparam dump params.yaml
将yaml文件重载入新的命名空间,比如说copy空间:
$ rosparam load params.yaml copy
$ rosparam get copy/background_b
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
8 使用 rqt_console 和 roslaunch
使用rqt_console和rqt_logger_level进行调试,以及如何使用roslaunch同时运行多个节点。
8.1预先安装rqt和turtlesim程序包
$ sudo apt-get install ros-<distro>-rqt ros-<distro>-rqt-common-plugins ros-<distro>-turtlesim
8.2 使用rqt_console和rqt_logger_level
rqt_console属于ROS日志框架(logging framework)的一部分,用来显示节点的输出信息。rqt_logger_level允许我们修改节点运行时输出信息的日志等级(logger levels)(包括 DEBUG、WARN、INFO和ERROR)。
turtlesim在rqt_console中的输出信息,同时在rqt_logger_level中修改日志等级
运行rqt_console和rqt_logger_level
$ rosrun rqt_console rqt_console
$ rosrun rqt_logger_level rqt_logger_level
新终端中启动turtlesim:
$ rosrun turtlesim turtlesim_node
让turtle动起来并观察rqt_console中的输出
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 0.0]'
8.3 日志等级说明
Fatal Error Warn Info Debug
8.4 使用roslaunch
roslaunch可以用来启动定义在launch文件中的多个节点。
$ roslaunch [package] [filename.launch]
先切换到beginner_tutorials程序包目录下:
$ roscd beginner_tutorials
---------------------------------------------
如果roscd执行失败了,记得设置你当前终端下的ROS_PACKAGE_PATH环境变量,设置方法如下:
$ export ROS_PACKAGE_PATH=~/<distro>_workspace/sandbox:$ROS_PACKAGE_PATH
$ roscd beginner_tutorials
----------------------------------------------------------
然后创建一个launch文件夹:
$ mkdir launch
$ cd launch
8.5 Launch 文件解析
-------------------------------------------------------------------------
创建一个名为turtlemimic.launch的launch文件
<launch>
//以launch标签开头以表明这是一个launch文件
<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
//创建了两个节点分组并以'命名空间(namespace)'标签来区分,其中一个名为turtulesim1,另一个名为turtlesim2,两个组里面都使用相同的turtlesim节点并命名为'sim'。这样可以让我们同时启动两个turtlesim模拟器而不会产生命名冲突。
<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node>
//在这里我们启动模仿节点,并将所有话题的输入和输出分别重命名为turtlesim1和turtlesim2,这样就会使turtlesim2模仿turtlesim1
</launch>
//launch文件的结束标签
--------------------------------------------------------------------------------
8.6 roslaunching
现在让我们通过roslaunch命令来启动launch文件:
使用rostopic命令发送速度设定消息:
$ rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
看到两个turtlesims会同时开始移动
可以通过rqt_graph来更好的理解在launch文件中所做的事情
$ rqt_graph
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
9 使用rosed编辑ROS中的文件
9.1 使用 rosed :编辑器 VIM
rosed 是 rosbash 的一部分。利用它可以直接通过package名来获取到待编辑的文件而无需指定该文件的存储路径了。
$ rosed [package_name] [filename]
$ rosed roscpp Logger.msg
9.2 使用Tab键补全文件名
$ rosed [package_name] <tab>
9.3 编辑器
rosed默认的编辑器是vim。如果想要将其他的编辑器设置成默认的,你需要修改你的 ~/.bashrc 文件
export EDITOR='emacs -nw'
.bashrc文件的改变,只会在新的终端才有效。已经打开的终端不受环境变量的影响。
$ echo $EDITOR 查看
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
10.创建ROS消息和ROS服务
介绍如何创建并编译ROS消息和服务,以及rosmsg, rossrv和roscp命令行工具
10.1消息(msg)和服务(srv)介绍
消息(msg): msg文件就是一个描述ROS中所使用消息类型的简单文本。它们会被用来生成不同语言的源代码。
服务(srv): 一个srv文件描述一项服务。它包含两个部分:请求和响应。
msg文件存放在package的msg目录下,srv文件则存放在srv目录下。
msg文件实际上就是每行声明一个数据类型和变量名。可以使用的数据类型如下:
int8, int16, int32, int64 (plus uint*)
float32, float64
string
time, duration
other msg files
variable-length array[] and fixed-length array[C]
在ROS中有一个特殊的数据类型:Header,它含有时间戳和坐标系信息。在msg文件的第一行经常可以看到Header header的声明.
srv文件分为请求和响应两部分,由'---'分隔。A 和 B 是请求, 而Sum 是响应。
int64 A
int64 B
---
int64 Sum
10.2 使用 msg
10.2.1 创建一个 msg
$ cd ~/catkin_ws/src/beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg
我们要确保msg文件被转换成为C++,Python和其他语言的源代码:
查看package.xml, 确保它包含一下两条语句:
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
在构建的时候,我们只需要"message_generation"。然而,在运行的时候,我们只需要"message_runtime"。
编辑器中打开CMakeLists.txt文件
在 CMakeLists.txt文件中,利用find_packag函数,增加对message_generation的依赖,这样就可以生成消息了
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)
你需要确保你设置了运行依赖:
catkin_package(
...
CATKIN_DEPENDS message_runtime ...
...)
用你的.msg文件替代Message*.msg
add_message_files(
FILES
Num.msg
)
要确保CMake知道在什么时候重新配置我们的project。 确保添加了如下代码:
generate_messages()
10.2.2 使用 rosmsg
通过rosmsg show命令,检查ROS是否能够识消息
$ rosmsg show [message type]
$ rosmsg show beginner_tutorials/Num
消息类型包含两部分:
beginner_tutorials -- 消息所在的package
Num -- 消息名Num.
忘记了消息所在的package,你也可以省略掉package名
$ rosmsg show Num
10.3 使用 srv
10.3.1 创建一个srv
$ roscd beginner_tutorials
$ mkdir srv
从其他的package中复制一个服务
roscp是一个很实用的命令行工具,它实现了将文件从一个package复制到另外一个package的功能。
$ roscp [package_name] [file_to_copy_path] [copy_path]
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
我们要确保srv文件被转换成C++,Python和其他语言的源代码。
message_generation 对msg和srv都起作用
跟msg文件类似,你也需要在package.xml文件中做一些修改 查看上边的说明,增加额外的依赖项
用你自己的srv文件名替换掉那些Service*.srv文件:
add_service_files(
FILES
AddTwoInts.srv
)
10.3.2 使用 rossrv
以上就是创建一个服务所需的所有步骤。
通过rosmsg show命令,检查ROS是否能够识该服务
$ rossrv show <service type>
$ rossrv show beginner_tutorials/AddTwoInts
跟rosmsg类似, 你也可以不指定具体的package名来查找服务文件:
$ rossrv show AddTwoInts
10.4 msg和srv都需要的步骤
在CMakeLists.txt中找到如下部分:
# generate_messages(
# DEPENDENCIES
# # std_msgs # Or other packages containing msgs
# )
去掉注释并附加上所有你消息文件所依赖的那些含有.msg文件的package(这个例子是依赖std_msgs,不要添加roscpp,rospy),结果如下:
generate_messages(
DEPENDENCIES
std_msgs
)
由于增加了新的消息,所以我们需要重新编译我们的package:
$ cd ../..
$ catkin_make
$ cd -
所有在msg路径下的.msg文件都将转换为ROS所支持语言的源代码。
生成的C++头文件将会放置在~/catkin_ws/devel/include/beginner_tutorials/。
Python脚本语言会在~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg目录下创建。
lisp文件会出现在~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/路径下.
10.5 获得帮助
$ rosmsg -h
获得子命令的帮助
$ rosmsg show -h
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
11 编写简单的消息发布器和订阅器 (C++)
本教程将介绍如何编写C++的发布器节点和订阅器节点。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
12 写一个简单的消息发布器和订阅器 (Python)
本教程将通过Python编写一个发布器节点和订阅器节点。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
13.测试消息发布器和订阅器
13.1 启动发布器
确保roscore可用,并运行:
$ roscore
catkin specific 如果使用catkin,确保你在调用catkin_make后,在运行你自己的程序前,已经source了catkin工作空间下的setup.sh文件:
$ cd ~/catkin_ws
$ source ./devel/setup.bash
$ rosrun beginner_tutorials talker (C++)
$ rosrun beginner_tutorials talker.py (Python)
发布器节点已经启动运行。
13.2启动订阅器
名为"listener"的订阅器节点
$ rosrun beginner_tutorials listener (C++)
$ rosrun beginner_tutorials listener.py (Python)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
14 编写简单的Service和Client (C++)
本教程介绍如何用C++编写Service和Client节点。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
15 编写简单的Service和Client (Python)
本教程介绍如何用Python编写Service和Client节点。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
16 测试简单的Service和Client
运行Service
$ rosrun beginner_tutorials add_two_ints_server (C++)
$ rosrun beginner_tutorials add_two_ints_server.py (Python)
运行Client
$ rosrun beginner_tutorials add_two_ints_client 1 3 (C++)
$ rosrun beginner_tutorials add_two_ints_client.py 1 3 (Python)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17.录制与回放数据
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
18 roswtf入门
18.1 安装检查
roswtf 可以检查你的ROS系统并尝试发现问题,
$ roscd
$ roswtf
* "Stack: ros": roswtf根据你当前目录来确定需要做的检查,这里表示你是在rosstack中启动roswtf。
* "Static checks summary": 这是有关文件系统问题的检查报告,现在的检查结果表示文件系统没问题。 * "Cannot communicate with master, ignoring graph checks(无法与master连接,忽略图(graph)检查)": roscore没有运行,所以roswtf没有做运行时检查。
18.2 运行时检查(在有ROS节点运行时)
我们需要让Master运行起来,所以得先启动roscore。
$ roscd
$ roswtf
检查过程的长短取决于正在运行的ROS节点数量
18.3错误报告
ROS_PACKAGE_PATH 环境变量中设置一个 bad值,并退出roscore以简化检查输出信息。
$ roscd
$ ROS_PACKAGE_PATH=bad:$ROS_PACKAGE_PATH roswtf
roswtf还可以发现很多其它类型的问题。如果你发现自己被一个编译或者通信之类的问题困扰的时候,可以尝试运行roswtf看能否帮你解决。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
19 探索ROS维基