ROS基础(二)

六、理解ROS服务和参数

ROS Services

服务(services)是节点之间通讯的另一种方式。服务允许节点发送请求(request) 并获得一个响应(response)

rosservice可以很轻松的使用 ROS 客户端/服务器框架提供的服务。rosservice提供了很多可以在topic上使用的命令,如下所示:
使用方法:
rosservice list:输出可用服务的信息。

$ rosservice list

rosservice call:调用带参数的服务。

$ rosservice call [service] [args]

rosservice type:输出服务类型。

$ rosservice type [service]

rosservice find:依据类型寻找服务find services by service type
rosservice uri:输出服务的ROSRPC uri

Using rosparam

rosparam使得我们能够存储并操作ROS 参数服务器(Parameter Server)上的数据。参数服务器能够存储整型、浮点、布尔、字符串、字典和列表等数据类型。

rosparam set:设置参数

$ rosparam set [param_name]

rosparam get:获取参数

$ rosparam get [param_name]

另:$ rosparam get /显示参数服务器上的所有内容。

rosparam list:列出参数名

$ rosparam list

rosparam load:从文件读取参数

$ rosparam load [file_name] [namespace]

(把file的内容重载入namespace中)

rosparam dump:向文件中写入参数

$ rosparam dump [file_name]

rosparam delete:删除参数

七、使用 rqt_console 和 roslaunch

rqt_console属于ROS日志框架(logging framework)的一部分,用来显示节点的输出信息。

$ rosrun rqt_console rqt_console

rqt_logger_level允许我们修改节点运行时输出信息的日志等级(logger levels)(包括 DEBUG、WARN、INFO和ERROR)。

$ rosrun rqt_logger_level rqt_logger_level

日志等级按以下优先顺序排列:
Fatal
Error
Warn
Info
Debug
Fatal是最高优先级,Debug是最低优先级。通过设置日志等级你可以获取该等级及其以上优先等级的所有日志消息。比如,将日志等级设为Warn时,你会得到Warn、Error和Fatal这三个等级的所有日志消息。

roslaunch:启动定义在launch文件(启动文件)中的多个节点。

$ roslaunch [package] [filename.launch]

①先切换到程序包目录下(如果roscd执行失败了,记得设置你当前终端下的ROS_PACKAGE_PATH环境变量,设置方法如下:

$ export ROS_PACKAGE_PATH=~/<distro>_workspace/sandbox:$ROS_PACKAGE_PATH)

②然后创建一个launch文件夹:

$ mkdir launch
$ cd launch

③创建一个名为turtlemimic.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>

  <node pkg="turtlesim" name="mimic" type="mimic">
    <remap from="input" to="turtlesim1/turtle1"/>
    <remap from="output" to="turtlesim2/turtle1"/>
  </node>

  </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文件的结束标签。

roslaunch:启动launch文件。
如:$ roslaunch beginner_tutorials turtlemimic.launch

八、使用rosed编辑ROS中的文件

rosed 是 rosbash 的一部分。利用它可以直接通过package名来获取到待编辑的文件而无需指定该文件的存储路径了。

使用方法:

$ rosed [package_name] [filename]

例子:

$ rosed roscpp Logger.msg

这个实例展示了如何编辑roscpp package里的Logger.msg文件。
如果该实例没有运行成功,那么很有可能是你没有安装vim编辑器。请参考编辑器部分进行设置。
如果文件名在package里不是唯一的,那么会呈现出一个列表,让你选择编辑哪一个文件。

rosed默认的编辑器是vim。如果想要将其他的编辑器设置成默认的,你需要修改你的 ~/.bashrc 文件,增加如下语句:
export EDITOR='emacs -nw'(这将emacs设置成为默认编辑器)
注意: .bashrc文件的改变,只会在新的终端才有效。已经打开的终端不受环境变量的影响。
打开一个新的终端,看看那是否定义了EDITOR:

$ echo $EDITOR
emacs -nw

九、创建ROS消息和ROS服务

消息(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的声明。

下面是一个msg文件的样例,它使用了Header,string,和其他另外两个消息类型。
Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist
srv文件分为请求和响应两部分,由3个’-'分隔。下面是srv的一个样例:
int64 A
int64 B
___
int64 Sum
其中 A 和 B 是请求, 而Sum 是响应。

1.使用 msg

1.1创建一个 msg

下面,我们将在之前创建的package里定义新的消息。

$ cd ~/catkin_ws/src/beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg

上面是最简单的例子——在.msg文件中只有一行数据。当然,你可以仿造上面的形式多增加几行以得到更为复杂的消息:

string first_name
string last_name
uint8 age
uint32 score

接下来,还有关键的一步:我们要确保msg文件被转换成为C++,Python和其他语言的源代码:
查看package.xml, 确保它包含一下两条语句:

  <build_depend>message_generation</build_depend>
  <run_depend>message_runtime</run_depend>

如果没有,添加进去。 注意,在构建的时候,我们只需要"message_generation"。然而,在运行的时候,我们只需要"message_runtime"。

在 CMakeLists.txt文件中,利用find_packag函数,增加对message_generation的依赖,这样就可以生成消息了。 你可以直接在COMPONENTS的列表里增加message_generation,就像这样:

#Do not just add this line to your CMakeLists.txt, modify the existing line
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)

同样,你需要确保你设置了运行依赖:

catkin_package(
 ...
 CATKIN_DEPENDS message_runtime ...
 ...)
找到如下代码块:
# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

去掉注释符号#,用你的.msg文件替代Message*.msg,就像下边这样:

add_message_files(
  FILES
   Num.msg
)

手动添加.msg文件后,我们要确保CMake知道在什么时候重新配置我们的project。确保添加了如下代码:

generate_messages()

现在,你可以生成自己的消息源代码了。

1.2使用 rosmsg

rosmsg show:检查ROS是否能够识消息。

$ rosmsg show [message type]

2.使用 srv

2.1创建一个srv

在package中创建一个服务:

$ roscd package_name
$ mkdir srv

这次我们不再手动创建服务,而是从其他的package中复制一个服务。 roscp是一个很实用的命令行工具,它实现了将文件从一个package复制到另外一个package的功能。
使用方法:

$ roscp [package_name] [file_to_copy_path] [copy_path]

现在我们可以从rospy_tutorials package中复制一个服务文件了:

$ roscp package_name AddTwoInts.srv srv/AddTwoInts.srv

还有很关键的一步:我们要确保srv文件被转换成C++,Python和其他语言的源代码。
现在认为,你已经如前边所介绍的,在CMakeLists.txt文件中增加了对message_generation的依赖。:

# Do not just add this line to your CMakeLists.txt, modify the existing line
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)

(对的, message_generation 对msg和srv都起作用)

同样,跟msg文件类似,你也需要在package.xml文件中做一些修改。查看上边的说明,增加额外的依赖项。
删掉#,去除对下边语句的注释:

# add_service_files(
#   FILES
#   Service1.srv
#  Service2.srv
# )

用你自己的srv文件名替换掉那些Service*.srv文件:

add_service_files(
   FILES
   AddTwoInts.srv
)

现在,你可以生成自己的服务源代码了。

2.2使用 rossrv

rosmsg show:检查ROS是否能够识该服务。

$ rossrv show <service type>

3.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:

# In your catkin workspace
$ 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/ 路径下。

4.获得帮助

使用-h选项

5.回顾

总结一下到目前为止我们接触过的一些命令:

命令 功能
rospack = ros+pack(age) 提供与ROS包相关的信息。
rosstack = ros+stack 提供与ROS堆栈相关的信息。
roscd = ros+cd 改变工作目录。
rosls = ros+ls 列举文件。
roscp = ros+cp 复制文件。
rosmsg = ros+msg 提供与ROS消息定义相关的信息。
rossrv = ros+srv 提供与ROS服务定义相关的信息。
rosmake = ros+make 编译ros包。(不同于catkin_make的另一种编译方式)

猜你喜欢

转载自blog.csdn.net/pomo16/article/details/82819660