ROS机器人编程--七.ROS编程基础 学习笔记

好久不见. 提交于 2019-11-29 22:57:48

7.2 发布者节点和订阅者节点的创建和运行

1.创建功能包

$ cd ~/catkin_ws/src
$ catkin_create_pkg ros_tutorials_topic message_generation std_msgs roscpp

创建ros _ tutorials _ topic功能包,依赖于message_generation(创建新消息的功能包,std_msgs(ROS标准消息功能包)和roscpp(在ROS中使用C/C ++的客户端程序库),且必须在创建功能包之前安装。
创建功能包时,将在~/catkin_ws/src目录中创建ros_tutorials_topic功能包目录。

$ cd ros_tutorials_topic
$ ls
include 			 → 头文件目录
src 	             → 源代码目录
CMakeLists.txt 	 → 构建配置文件			
package.xml 		 → 功能包配置文件

2.修改配置文件

ROS的必备配置文件package.xml是一个包含功能包信息的XML文件,其中包含用于描述功能包名称、作者、许可证和依赖包的信息。利用编辑器(gedit、vim、emacs等)打开文件,并修改它以匹配当前节点。

$ gedit package.xml

ROS的构建系统catkin基本上使用CMake,它在功能包目录中的CMakeLists.txt文件中描述了构建环境。该文件设置可执行文件的创建、依赖包优先构建、链接创建等。

$ gedit CMakeLists.txt

3. 创建消息文件

在上述的CMakeLists.txt文中添加了如下选项。

add_message_files(FILES MsgTutorial.msg)

在构建时要包含消息MsgTutorial.msg,该消息将在此节点中被使用。按以下顺序创建它:

$ roscd ros_tutorials_topic 		 → 移动到功能包目录
$ mkdir msg 					→ 功能包中创建新的 msg 消息目录
$ cd msg 					 → 转到创建的 msg 目录
$ gedit MsgTutorial.msg 		→ 创建新的 MsgTutorial . msg 文件并修改内容

4. 创建发布者节点

CMakeLists.txt中,给了生成以下可执行文件的选项。

add_executable (topic_publisher src/topic_publisher.cpp )
$ roscd ros_tutorials_topic/src 	→ 移至 src 目录,该目录是功能包的源代码目录
$ gedit topic_publisher.cpp 		→ 新建源文件并修改内容

5. 创建订阅者节点

CMakeLists.txt中添加以下选项来生成可执行文件。

add_executable(topic_subscriber src/topic_subscriber.cpp)

通过构建topic_subscriber.cpp文件来创建topic_subscriber可执行文件。

$ roscd ros_tutorials_topic/src 		→ 移动到 src 目录,该目录是功能包的源代码目录
$ gedit topic_subscriber cpp 	→ 创建和修改新的源代码文件		

6. 构建(build)节点

$ cd ~/catkin_ws 		→ 移动到 catkin 目录
$ catkin_make 		→ 执行 catkin 构建

使用以上命令在ros_tutorials_topic功能包中构建消息文件、发布者节点和订阅者节点。
ros_tutorials_topic功能包的源代码位于“~/catkin_ws/src/ros_tutorials_topic/src”
ros_tutorials_topic功能包中的消息文件位于“/catkin_ws/src/ros_tutorials_topic/msg”
基于此的构建:
在“~/catkin_ws”的“/build”和“/devel”目录中生成文件。
“/build”目录中保存catkin构建用到的配置内容
而“/devel/lib/ros_tutorials_topic’”目录中保存可执行文件。
另外,“/devel/include/ros_tutorials_topic”目录存储着从消息文件自动生成的消息头文件。

7.运行发布者

$ roscore
$ rosrun ros_tutorials_topic topic_publisher
$ rostopic list
/ros_tutorial_msg
/rosout
/rosout_agg
$ rostopic echo/ros_tutorial_msg		/检查ros_tutorial_msg话题消息                                                                            

8. 运行订阅者

$ rosrun ros_tutorials_topic topic_subscriber

9. 检查运行中的节点的通信状态

$ rqt_graph 或 $ rqt

在这里插入图片描述发布者节点(topic_publisher)正在传输话题(ros_tutorial_msg),并且可以确认它正在接收订阅者节点(topic_subscriber)。

7.3. 创建和运行服务服务器与客户端节点

服务由服务服务器(service server)和服务客户端(service client)组成,其中服务服务器仅在收到请求(request)时才会响应(response),而服务客户端则会发送请求并接收响应。与话题不同,服务是一次性消息通信。因此,当服务的请求和响应完成时,两个节点的连接会被断开。
本节旨在创建一个简单的服务文件,并创建和运行一个服务服务器(server)节点和一个服务客户端(client)节点。

1.创建功能包

$ cd ~/catkin_ws/src
$ catkin_create_pkg ros_tutorials_service message_generation std_msgs roscpp
$ cd ros_tutorials_service
$ ls
include 			 → 头文件目录
src 	             → 源代码目录
CMakeLists.txt 	     → 构建配置文件			
package.xml 		 → 功能包配置文件

2.修改配置文件

$ gedit package.xml
$ gedit CMakeLists.txt

3. 创建服务文件

在上述的CMakeLists.txt文中添加了如下选项。

add_service_files(FILES SrvTutorial.srv)

按以下顺序创建SrvTutorial.srv:

$ roscd ros_tutorials_service 		 → 移动到功能包目录
$ mkdir srv 						 → 功能包中创建新的srv服务目录
$ cd srv							 → 转到创建的srv目录
$ gedit SrvTutorial.srv 			 → 创建新的SrvTutorial.srv文件并修改内容
int64 a
int64 b
---
int64 result

4. 创建服务服务器节点

CMakeLists.txt中,给了生成以下可执行文件的选项。

add_executable (service_server src/service_server.cpp)
$ roscd ros_tutorials_service/src 	→ 移至 src 目录,该目录是功能包的源代码目录
$ gedit service_server.cpp 		→ 新建源文件并修改内容

5. 创建服务客户端节点

CMakeLists.txt中添加以下选项来生成可执行文件。

add_executable(service_client src/service_client.cpp)
$ roscd ros_tutorials_service/src 		→ 移动到 src 目录,该目录是功能包的源代码目录
$ gedit service_client.cpp 				→ 创建和修改新的源代码文件		

6. 构建(build)节点

$ cd ~/catkin_ws 		→ 移动到 catkin 目录
$ catkin_make 		→ 执行 catkin 构建

7.运行服务服务器

$ roscore
$ rosrun ros_tutorials_service service_server

8. 运行服务客户端

$ rosrun ros_tutorials_service service_client 2 3

9.rosservice call命令的用法

在下面的命令中执行rosservice call命令之后,写入相应的服务名称,例如/ros_tutorial_srv,然后写入服务请求所需的参数即可。

$ rosservice call / ros _ tutorial _ srv 10 2
result : 12

10. GUI工具Service Caller的用法

最后,介绍使用rqt的ServiceCaller的方法,它使用一个GUI形式的界面。首先,运行ROS的GUI工具rqt。

$ rqt

然后从rqt程序的菜单中选择[插件[Plugins]→[Service]→[Service Caller],然后出现如下屏幕。
在这里插入图片描述

7.4. 创建和运行动作服务器和客户端节点

动作与话题和服务不同,在异步、双向,以及请求和响应之间需要很长的时间的情况,以及需要中途结果值等需要更复杂的编程的情况中显
的格外有用。

1.创建功能包

$ cd ~/catkin_ws/src
$ catkin_create_pkg ros_tutorials_action message_generation actionlib_msgs actionlib roscpp

2.修改配置文件

$ gedit package.xml
$ gedit CMakeLists.txt

3. 创建动作文件

在上述的CMakeLists.txt文中添加了如下选项。

add_action_files(FILES Fibonacci.action)

按以下顺序创建Fibonacci.action:

$ roscd ros_tutorials_action 	 → 移动到功能包目录
$ mkdir action					 → 功能包中创建新的srv服务目录
$ cd action						 → 转到创建的srv目录
$ gedit Fibonacci.action 		 → 创建新的Fibonacci.action文件并修改内容

在动作文件中,三个连字符(—)用作分隔符,第一个是goal消息,第二个是result消息,第三个是feedback消息。goal消息和result消息之间的关系与上述srv文件相同,但主要区别在于feedback消息用于指定进程执行过程中的中间值传输。


# goal definition
int32 order
---
# result definition
int32 [] sequence
---
# feedback
int32[] sequence

除了可以在动作文件中找到的目标(goal)、结果(result)和反馈(feedback)之外,动作基本上还使用两个额外的消息:取消(cancel)和状态(status)。取消(cancel)消息使用actionlib_msgs/GoalID,它在动作运行时可以取消动作客户端和单独节点上的动作的执行。状态(status)消息可以根据状态转换 (如PENDING、ACTIVE、PREEMPTED和SUCCEEDED )检查当前动作的状态。

4. 创建动作服务器节点

CMakeLists.txt中,给了生成以下可执行文件的选项。

add_executable (action_server src/action_server.cpp)
$ roscd ros_tutorials_action/src 	→ 移至 src 目录,该目录是功能包的源代码目录
$ gedit action_server.cpp 			→ 新建源文件并修改内容

5. 创建动作客户端节点

CMakeLists.txt中添加以下选项来生成可执行文件。

add_executable(action_client src/action_client.cpp)
$ roscd ros_tutorials_action/src 		→ 移动到 src 目录,该目录是功能包的源代码目录
$ gedit action_client.cpp 				→ 创建和修改新的源代码文件		

6. 构建(build)节点

$ cd ~/catkin_ws 	→ 移动到 catkin 目录
$ catkin_make 		→ 执行 catkin 构建

7.运行动作服务器

$ roscore
$ rosrun ros_tutorials_action action_server

可以通过rqt_graph和rostopic list命令来查看当前动作消息的使用情况。
如果想了解更多有关每条消息的信息,请将-v选项添加到rostopic list中。这将单独显示发布和订阅的话题。
为了查看可视化信息,请使用以下命令。

$ rqt _ graph

8. 运行动作客户端

$ rosrun ros_tutorials_action action_client 

如果想详细了解中途值或结果值,

rostopic echo /ros_tutorial_action/feedback

7.5. 参数的用法

7.6. roslaunch的用法

roslaunch可以运行多个节点。
除此之外,它还是一种在运行节点时可以附带如下各种选项的ROS命令: 修改参数或节点的名称,设置节点的命名空间,设置ROS_ROOT及ROS_PACKAGE_PATH,以及环境变量修改等选项的ROS命令等。
roslaunch使用“*.launch”文件来设置可执行节点,它基于XML,并提供各个标签的选项。

roslaunch [功能包名称] [roslaunch文件]

1. roslaunch的应用

$ roscd ros_tutorials_topic
$ mkdir launch
$ cd launch
$ gedit union.launch

如下编辑union.launch文件的内容。

< launch >
< node pkg = "ros _ tutorials _ topic" type = "topic _ publisher" name = "topic _ publisher1" />
< node pkg = "ros _ tutorials _ topic" type = "topic _ subscriber" name = "topic _ subscriber1" />
< node pkg = "ros _ tutorials _ topic" type = "topic _ publisher" name = "topic _ publisher2" />
< node pkg = "ros _ tutorials _ topic" type = "topic _ subscriber" name = "topic _ subscriber2" />
</launch>

在标签中,描述了使用roslaunch命令运行节点所需的标签。描述了roslaunch运行的节点。

pkg 功能包的名称
type 实际运行的节点的名称(节点名)
name 与上述type对应的节点被运行时,起的名称(运行名)。一般情况下使用与type相同的名称,但可以根据需要,在运行时更改名称。

添加–screen选项,终端上运行的所有节点的输出将显示在终端屏幕上。

$ roslaunch ros_tutorials_topic union.launch --screen

2. Launch标签

launch 指roslaunch语句的开始和结束。
node 这是对于节点运行的标签。您可以更改功能包、节点名称和执行名称。
machine 可以设置运行该节点的PC的名称、address、ros-root和ros-package-path。
include 您可以加载属于同一个功能包或不同的功能包的另一个launch,并将其作为一个launch文件来运行。
remap 可以更改节点名称、话题名称等等,在节点中用到的ROS变量的名称。
env 设置环境变量,如路径和IP(很少使用)。
param 设置参数名称、类型、值等
rosparam 可以像rosparam命令一样,查看和修改load、dump和delete等参数信息。
group> 用于分组正在运行的节点。
test 用于测试节点。类似于node,但是有可以用于测试的选项。
arg 可以在launch文件中定义一个变量,以便在像下面这样运行时更改参数。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!