节点是进行运算任务的进程。一个系统可以由很多节点组成,节点也可以称为软件模块。
ROS是以节点的形式开发的,节点是根据其目的,可以细分的可执行程序的最小单位。节点使基于ROS的系统在运行时更加形象化,当许多节点同时进行时,
可以将不同节点的通讯绘制成下图。
话题本质是对套接字的一种封装,一个节点可以向一个给定的话题发布消息,另一个节点可以订阅给定话题中特定消息类型的消息。在实现上,消息是序列化的
消息通过一个GlobalCallbackQueue和一个TopicManager管理
需要注意的是,在ROS中,话题必须是唯一的,否则消息路由就会产生错误。
查看工具 : 可视化工具rqt_graph、命令行工具rostopic。
基于主题 发布/订阅 的通信方法是一种异步方法,该 发布/订阅 模型是一种很灵活的通讯模式。但在某些情况下,需要一种同时使用请求和响应的同步消息交换方案,ROS提供了叫做服务的消息同步方法,是一种一对一的机制。
一个服务被分成服务服务器和服务客户端,其中服务服务器只在有请求(request)的时候才响应(response),而服务客户端会在发送请求后接收响应。与话题不同,服务是一次性消息通信。
因此,当服务的请求和响应完成时,两个连接的节点将被断开。
服务通常被用作请求机器人执行特定操作时使用的命令,或者用于根据特定条件需要产生事件的节点。
由于它是一次性的通信方式,在网络上的负载很小,所以它也被用作代替 基于主题 发布/订阅 的通信手段。
rostopic常用命令 topic的名字全局唯一
查看话题 rostopic info [话题名]
获得话题列表 rostopic list
获得话题列表 rostopic list -v
发布数据 rostopic pub [话题名] [消息类型] [参数]
闩锁模式(latch mode)、速率模式(rate mode)、单次模式(once mode)、文件模式(file mode)。
闩锁模式(latch mode) 默认模式,只发布一次,确保收到,选项为-l。
速率模式(rate mode) 以特定速率发布消息,默认10Hz,选项为-r。
单次模式(once mode) 以闩锁模式发布消息,执行3秒,然后结束发布,选项为-1。
文件模式(file mode) 从YAML文件中读取消息,文件模式的发布速度也为10Hz,选项为-f。
示例
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
“-”短划线代表参数是可选参数, “-- ”代表参数是非可选参数
节点之间通过传送消息进行通讯。每一个消息都是一种数据结构。
ROS的消息支持标准的数据类型(整型、浮点型、布尔型等),
还包括数组、结构体、自定义的数据类型等等。
查看消息类型 rosmsg info [消息类型]
消息列表 rosmsg list
程序包消息 rosmsg package [程序包名] 查看消息常用用法
消息类型的命名方式为:程序包名/消息名
消息类型每行的声明必须包含两部分:域、常量,域定义了消息的数据类型,
常量定义了域的名称。域可以是独立域也可以是复合域。
特别的消息类型Header来提供一些通用信息如时间戳、序列号、帧ID等
std_msgs/Header中的消息头内容如下:
#序列号 uint32 seq #时间戳 time stamp #坐标系ID string frame_id
std_msgs支持字符串、布尔、整型、浮点型、数组等多种数据类型。
标准消息
std_msgs/Char char data
几何消息
geometry_msgs/Twist geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
传感消息senser_msgs/PointCloud(复合域)
std_msgs/Header header
uint32 seq
time stamp
string frame_id
geometry_msgs/Point32[] points
float32 x
float32 y
float32 z
sensor_msgs/ChannelFloat32[] channelsstring name
float32[] values
示例 查看小海龟的话题、消息。
启动小海龟 启动节点rosrun turtlesim turtlesim_node
启动键盘控制rosrun turtlesim turtle_teleop_key
查看消息 rosrun rqt_console rqt_console
过滤消息 rosrun rqt_logger_level rqt_logger_level
查看网络拓扑 rosrun rqt_graph rqt_graph
创建发布订阅
发布消息 //配置话题、队列大小、发布模式
template Publisher advertise(const std::string& topic, uint32_t queue_size, bool latch=false)
//发布消息
template void publish(const boost::shared_ptr& message) const{
......
SerializedMessage m;
m.type_info = &typeid(M);
m.message = message;
publish(boost::bind(serializeMessage, boost::ref(*message)), m);
}
spinOnce(监听到后继续往下运行,用于设置发布频率)
spin(监听到后调回调函数执行,继续循环监听)
自定义消息步骤
步骤1:创建自定义消息.msg 文件
Header header
string first_name
string last_name
uint8 age
uint32 score
步骤2编写消息发布文件 talker
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "example_3/Info.h"
#include
#include
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker"); //talk 节点
ros::NodeHandle nh;
rosbag::Bag bag;
ros::Publisher chatter_pub = nh.advertise("chatter", 1000); // 队列长度1000
bag.open("/home/miaozl/catkin_ws/bagfiles/test.bag",rosbag::bagmode::Write);
bag.setCompression(rosbag::CompressionType::LZ4);
ros::Rate loop_rate(10);
while (ros::ok())
{
example_3::Info msg;
msg.header.stamp=ros::Time::now();
msg.header.frame_id="info_msg";
msg.first_name = "Fabio";
msg.last_name = "Miao";
msg.age =36;
msg.score = 100;
chatter_pub.publish(msg); // 发布消息
ROS_INFO("publish message");
bag.write("chatter",msg.header.stamp,msg);
ros::spinOnce(); // 监听回调
loop_rate.sleep();
}
bag.close();
return 0;
}
步骤3 编写消息订阅文件 listener
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "example_3/Info.h"
void chatterCallback(const example_3::Info::ConstPtr& msg)
{
//ROS_INFO("I heard: [%s]", msg->data.c_str());
//ROS_INFO("I heard: %s %s,his age is %d,his score is %d",msg->first_name.c_str(),msg->last_name.c_str(),msg->age,msg->score);
ROS_INFO("I heard: header frame id is %s, %s %s,his age is %d,his score is %d",msg->header.frame_id.c_str(),
msg->first_name.c_str(),msg->last_name.c_str(),msg->age,msg->score);
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("chatter", 1000, chatterCallback);
ros::spin();
return 0;
}
步骤3 package.xml、CMakeLists.txt配置
cmake_minimum_required(VERSION 3.0.2)
project(example_3)
## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
rosbag
std_msgs
message_generation
)
## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)
## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# catkin_python_setup()
################################################
## Declare ROS messages, services and actions ##
################################################
## To declare and build messages, services or actions from within this
## package, follow these steps:
## * Let MSG_DEP_SET be the set of packages whose message types you use in
## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
## * In the file package.xml:
## * add a build_depend tag for "message_generation"
## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET
## * If MSG_DEP_SET isn't empty the following dependency has been pulled in
## but can be declared for certainty nonetheless:
## * add a exec_depend tag for "message_runtime"
## * In this file (CMakeLists.txt):
## * add "message_generation" and every package in MSG_DEP_SET to
## find_package(catkin REQUIRED COMPONENTS ...)
## * add "message_runtime" and every package in MSG_DEP_SET to
## catkin_package(CATKIN_DEPENDS ...)
## * uncomment the add_*_files sections below as needed
## and list every .msg/.srv/.action file to be processed
## * uncomment the generate_messages entry below
## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)
## Generate messages in the 'msg' folder
add_message_files(
FILES
Info.msg
)
## Generate services in the 'srv' folder
# add_service_files(
# FILES
# Service1.srv
# Service2.srv
# )
## Generate actions in the 'action' folder
# add_action_files(
# FILES
# Action1.action
# Action2.action
# )
## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs
)
################################################
## Declare ROS dynamic reconfigure parameters ##
################################################
## To declare and build dynamic reconfigure parameters within this
## package, follow these steps:
## * In the file package.xml:
## * add a build_depend and a exec_depend tag for "dynamic_reconfigure"
## * In this file (CMakeLists.txt):
## * add "dynamic_reconfigure" to
## find_package(catkin REQUIRED COMPONENTS ...)
## * uncomment the "generate_dynamic_reconfigure_options" section below
## and list every .cfg file to be processed
## Generate dynamic reconfigure parameters in the 'cfg' folder
# generate_dynamic_reconfigure_options(
# cfg/DynReconf1.cfg
# cfg/DynReconf2.cfg
# )
###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES example_3
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
###########
## Build ##
###########
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
## Declare a C++ library
# add_library(${PROJECT_NAME}
# src/${PROJECT_NAME}/example_3.cpp
# )
## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")
## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## Specify libraries to link a library or executable target against
if(CMAKE_BUILD_TYPE STREQUAL DEBUG)
add_executable(talker src/talker.cpp)
add_executable(listener src/listener.cpp)
target_link_libraries(talker
${catkin_LIBRARIES}
)
target_link_libraries(listener
${catkin_LIBRARIES}
)
endif()
#############
## Install ##
#############
# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html
## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
# catkin_install_python(PROGRAMS
# scripts/my_python_script
# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )
## Mark executables for installation
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html
# install(TARGETS ${PROJECT_NAME}_node
# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )
## Mark libraries for installation
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html
# install(TARGETS ${PROJECT_NAME}
# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
# )
## Mark cpp header files for installation
# install(DIRECTORY include/${PROJECT_NAME}/
# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
# FILES_MATCHING PATTERN "*.h"
# PATTERN ".svn" EXCLUDE
# )
## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
# # myfile1
# # myfile2
# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )
#############
## Testing ##
#############
## Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_example_3.cpp)
# if(TARGET ${PROJECT_NAME}-test)
# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()
## Add folders to be run by python nosetests
# catkin_add_nosetests(test)
步骤4 生成消息文件 编译执行