$ 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 → 功能包配置文件
ROS的必备配置文件package.xml是一个包含功能包信息的XML文件,其中包含用于描述功能包名称、作者、许可证和依赖包的信息。利用编辑器(gedit、vim、emacs等)打开文件,并修改它以匹配当前节点。
$ gedit package.xml
ROS的构建系统catkin基本上使用CMake,它在功能包目录中的CMakeLists.txt文件中描述了构建环境。该文件设置可执行文件的创建、依赖包优先构建、链接创建等。
$ gedit CMakeLists.txt
在上述的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 文件并修改内容
CMakeLists.txt中,给了生成以下可执行文件的选项。
add_executable (topic_publisher src/topic_publisher.cpp )
$ roscd ros_tutorials_topic/src → 移至 src 目录,该目录是功能包的源代码目录
$ gedit topic_publisher.cpp → 新建源文件并修改内容
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 → 创建和修改新的源代码文件
$ 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”目录存储着从消息文件自动生成的消息头文件。
$ roscore
$ rosrun ros_tutorials_topic topic_publisher
$ rostopic list
/ros_tutorial_msg
/rosout
/rosout_agg
$ rostopic echo/ros_tutorial_msg /检查ros_tutorial_msg话题消息
$ rosrun ros_tutorials_topic topic_subscriber
$ rqt_graph 或 $ rqt
发布者节点(topic_publisher)正在传输话题(ros_tutorial_msg),并且可以确认它正在接收订阅者节点(topic_subscriber)。
服务由服务服务器(service server)和服务客户端(service client)组成,其中服务服务器仅在收到请求(request)时才会响应(response),而服务客户端则会发送请求并接收响应。与话题不同,服务是一次性消息通信。因此,当服务的请求和响应完成时,两个节点的连接会被断开。
本节旨在创建一个简单的服务文件,并创建和运行一个服务服务器(server)节点和一个服务客户端(client)节点。
$ 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 → 功能包配置文件
$ gedit package.xml
$ gedit CMakeLists.txt
在上述的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
CMakeLists.txt中,给了生成以下可执行文件的选项。
add_executable (service_server src/service_server.cpp)
$ roscd ros_tutorials_service/src → 移至 src 目录,该目录是功能包的源代码目录
$ gedit service_server.cpp → 新建源文件并修改内容
CMakeLists.txt中添加以下选项来生成可执行文件。
add_executable(service_client src/service_client.cpp)
$ roscd ros_tutorials_service/src → 移动到 src 目录,该目录是功能包的源代码目录
$ gedit service_client.cpp → 创建和修改新的源代码文件
$ cd ~/catkin_ws → 移动到 catkin 目录
$ catkin_make → 执行 catkin 构建
$ roscore
$ rosrun ros_tutorials_service service_server
$ rosrun ros_tutorials_service service_client 2 3
在下面的命令中执行rosservice call命令之后,写入相应的服务名称,例如/ros_tutorial_srv,然后写入服务请求所需的参数即可。
$ rosservice call / ros _ tutorial _ srv 10 2
result : 12
最后,介绍使用rqt的ServiceCaller的方法,它使用一个GUI形式的界面。首先,运行ROS的GUI工具rqt。
$ rqt
然后从rqt程序的菜单中选择[插件[Plugins]→[Service]→[Service Caller],然后出现如下屏幕。
动作与话题和服务不同,在异步、双向,以及请求和响应之间需要很长的时间的情况,以及需要中途结果值等需要更复杂的编程的情况中显
的格外有用。
$ cd ~/catkin_ws/src
$ catkin_create_pkg ros_tutorials_action message_generation actionlib_msgs actionlib roscpp
$ gedit package.xml
$ gedit CMakeLists.txt
在上述的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 )检查当前动作的状态。
CMakeLists.txt中,给了生成以下可执行文件的选项。
add_executable (action_server src/action_server.cpp)
$ roscd ros_tutorials_action/src → 移至 src 目录,该目录是功能包的源代码目录
$ gedit action_server.cpp → 新建源文件并修改内容
CMakeLists.txt中添加以下选项来生成可执行文件。
add_executable(action_client src/action_client.cpp)
$ roscd ros_tutorials_action/src → 移动到 src 目录,该目录是功能包的源代码目录
$ gedit action_client.cpp → 创建和修改新的源代码文件
$ cd ~/catkin_ws → 移动到 catkin 目录
$ catkin_make → 执行 catkin 构建
$ roscore
$ rosrun ros_tutorials_action action_server
可以通过rqt_graph和rostopic list命令来查看当前动作消息的使用情况。
如果想了解更多有关每条消息的信息,请将-v选项添加到rostopic list中。这将单独显示发布和订阅的话题。
为了查看可视化信息,请使用以下命令。
$ rqt _ graph
$ rosrun ros_tutorials_action action_client
如果想详细了解中途值或结果值,
rostopic echo /ros_tutorial_action/feedback
roslaunch可以运行多个节点。
除此之外,它还是一种在运行节点时可以附带如下各种选项的ROS命令: 修改参数或节点的名称,设置节点的命名空间,设置ROS_ROOT及ROS_PACKAGE_PATH,以及环境变量修改等选项的ROS命令等。
roslaunch使用“*.launch”文件来设置可执行节点,它基于XML,并提供各个标签的选项。
roslaunch [功能包名称] [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
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文件中定义一个变量,以便在像下面这样运行时更改参数。