ROS通信编程(三)

ROS通信编程

ros通信编程三大内容:话题编程(topic)、服务编程(service)、动作编程(action)

ROS通信编程——话题编程

如何运行文件

                                                     rosrun learning_communication talker

                                                    rosrun learning_communication listener

话题编程流程:

1、创建发布者

2、创建订阅者

3、添加编译选项

4、运行可执行程序

                                                                         话题通信模型

如何实现一个发布者

初始化ROS节点 ;

向ROS Master 注册节点信息 ,包括发布的话题名和话题中的消息类型 ;

按照一定频率循环发布消息 。

在自己所创建的功能包(learning_communication)的src文件夹下新建一个talker.cpp文件

如何实现订阅者

初始化ROS节点 ;

订阅需要的话题 ;

循环等待话题消息,接收到消息后进入回调函数 ;

在回调函数中完成消息处理 。

在自己所创建的功能包(learning_communication)的src文件夹下新建一个listener.cpp文件。

如何编译代码

设置需要编译都代码和生成都可执行文件 ;

设置链接库 ;

设置依赖 。

在自己所创建的功能包(learning_communication)下的CmakeLists.txt下添加如下语句:

add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
# add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)


add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
# add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)

如何运行可执行文件

如果时py文件可直接运行,若是cpp文件则经过编译之后形成可执行文件再运行。

cpp文件需要自定义话题消息,配置相关信息之后再编译形成

如何自定义话题消息:

定义msg文件(在自己所创建的功能包(learning_communication)下创建msg文件夹,里面新建一个Person.msg文件(这个文件根据自己实际需求来创建)

Person.msg内容如下:

string name
uint8  sex
uint8  age

uint8 unknown = 0
uint8 male    = 1
uint8 female  = 2

在自己所创建的功能包下的Package.xml(learning_communication / Package.xml)中添加功能包依赖,语句如下:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>


在自己所创建的功能包下的CmakeList.txt(learning_communication / CmakeList.txt)中添加功能包依赖,语句如下:

find_package( ...... message_generation)

catkin_package(CATKIN_DEPENDS geometry_msgs roscpp
rospy std_msgs message_runtime)

add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)

ROS通信编程——服务编程

如何运行可执行文件:

Sever节点启动后的日志信息

Client启动后发布服务请求,并成功接收到反馈结果

Server接收到服务调用后完成加法求解,并将结果反馈给Cliebt

ROS通信编程——服务编程

什么是动作(action)                                            Action的接口

          一种问答通信机制 ;                                                                                   goal :发布任务目标 ;

          带有连续反馈 ;                                                                                           cancel :请求取消任务 ;

          可以在任务过程中止运行 ;                                                                          status : 通知客户端当前的状态 ;

          基于ROS的消息机制实现 。                                                                       feedback :周期反馈任务运行的监控数据 ;

                                                                                                                               result :向客户端发送任务的执行结果,只发布一次 。

如何自定义动作消息

定义action文件(在自己所创建的功能包(learning_communication)下创建action文件夹,里面新建一个DoDishes.action文件(这个文件根据自己实际需求来创建)

DoDishes.action文件内容如下:

# 定义目标信息
uint32 dishwasher_id
# Specify which dishwasher we wa
nt to use
---
# 定义结果信息
uint32 total_dishes_cleaned
---
# 定义周期反馈的消息
float32 percent_complete

在自己所创建的功能包下的Package.xml(learning_communication / Package.xml)中添加功能包依赖,语句如下:

<build_depend>actionlib</build_depend>
<build_depend>actionlib_msgs</build_depend>
<exec_depend>actionlib</exec_depend>
<exec_depend>actionlib_msgs</exec_depend>

在自己所创建的功能包下的CmakeList.txt(learning_communication / CmakeList.txt)中添加功能包依赖,语句如下:

find_package(catkin REQUIRED actionlib_msgs actionlib)
add_action_files(DIRECTORY action FILES DoDishes.action)
generate_messages(DEPENDENCIES actionlib_msgs)

如何实现一个动作服务器

           初始化ROS节点 ;

           创建动作服务器实例 ;

           启动服务器,等待动作请求 ;

           在回调函数中完成动作服务功能的处理,并反馈信息 ;

           动作完成,发送结束信息 。

如何实现一个动作客户端

           初始化ROS节点 ;

           创建动作客户端实例 ;

           连接动作服务端 ;

           发送动作目标 ;

           根据不同类型的服务端反馈处理回调函数 。

如何编译代码

设置需要编译都代码和生成都可执行文件 ;

设置链接库 ;

设置依赖 。

在自己所创建的功能包(learning_communication)下的CmakeLists.txt下添加如下语句:

add_executable(DoDishes_client src/DoDishes_client.cpp)
target_link_libraries( DoDishes_client ${catkin_LIBRARIES})
add_dependencies(DoDishes_client ${${PROJECT_NAME}_EXPORTED_TARGETS})

add_executable(DoDishes_server src/DoDishes_server.cpp)
target_link_libraries( DoDishes_server ${catkin_LIBRARIES})
add_dependencies(DoDishes_server ${${PROJECT_NAME}_EXPORTED_TARGETS})

如何执行可执行文件

ROS之分布式通信

ROS是一种分布式软件框架,节点之间通过松耦合都方式进行组合 。

如何实现分布式多机通信

(1)设置ip地址,确保底层链路的联通

两台计算机(hcx-pc、raspi2)的ip地址

在两台计算机上分别使用ping命令测试网络是否联通

如何实现分布式多机通信

(2)在从机端设置ROS_MASTER_URL,让从机找到ROS_Master

       $ export ROS_MASTER_URI=http://hcx-pc:11311 (当前终端有效)  或   $ echo “export ROS_MASTER_URI=http://hcx-pc:11311” >>   ~/.bashrc (所有终端有效)

猜你喜欢

转载自blog.csdn.net/weixin_39036700/article/details/81660828
今日推荐