ROS(五)之话题编程:msg文件
文章目录一、话题编程1.talker.cpp2.listerner.cpp3.修改CMakeLists.txt文件4.编译执行一、话题编程1.talker.cpp进入代码空间src下的自己的功能包(my_package)下的srccd ~/catkin_ws/src/my_package/src新建talker.cpp文件#include <sstream>#inc...
文章目录
一、话题编程

1.talker.cpp
进入代码空间src下的自己的功能包(my_package)下的src
cd ~/catkin_ws/src/my_package/src
新建talker.cpp文件:
- ROS节点初始化
- 创建节点句柄,创建Publisher
- 设置频率循环发布
#include <ros/ros.h> // ros.h包含ros中常用的API
#include <std_msgs/String.h> // String.h中ros定义的消息类型
#include <string>
int main(int argc, char **argv)
{
/**
* ROS节点初始化
* 前两个是命令行的参数
* talker是节点node的名称
*/
ros::init(argc, argv, "talker");
// 创建节点句柄
ros::NodeHandle nodeHandle;
/**
* 创建一个名为chatter_pub的Publisher
* 发布名为chatter的topic
* 消息类型为std_msgs::String
* 1000是队列长度,这个是用来缓冲来不及发布的数据
*/
ros::Publisher chatter_pub = nodeHandle.advertise<std_msgs::String>("chatter",1000);
// 设置循环的频率,10hz,即循环100ms
ros::Rate loop_rate(10);
int count = 0;
while( ros::ok() )
{
// 初始化std_msgs::String类型的消息
std_msgs::String msg;
msg.data = "hello ROS" + std::to_string(count);
// 将要发布的消息打印出来
ROS_INFO("%s",msg.data.c_str());
// 发布消息
chatter_pub.publish(msg);
/**
* 循环等待回调函数
* spinOnce()只会查询一次回调函数队列是否有回调函数进来,
* 所有需要用一个while循环控制
*/
ros::spinOnce();
// 按照循环频率延时
loop_rate.sleep();
count++;
}
return 0;
}
2.listerner.cpp
进入代码空间src下的自己的功能包(my_package)下的src
cd ~/catkin_ws/src/my_package/src
新建listener.cpp文件:
- ROS节点初始化
- 创建节点句柄,创建Subscriber
- 循环等待回调函数
#include <ros/ros.h>
#include <std_msgs/String.h>
// 接收到订阅的消息后,会进入消息回调函数
void chatterCallback(const std_msgs::String::ConstPtr & msg)
{
// 将接受到的消息打印出来
ROS_INFO("I hear : [%s]",msg->data.c_str());
}
int main(int argc, char ** argv)
{
/**
* ROS节点初始化
* 前两个是命令行的参数
* listener是节点node的名称
*/
ros::init(argc, argv,"listener");
// 创建节点句柄
ros::NodeHandle nodeHandle;
/**
* 创建一个名为chatter_sub的Subscriber
* 订阅名为chatter的topic
* 1000是队列长度,这个是用来缓冲来不及接受的数据
* 注册回调函数chatterCallback
*/
ros::Subscriber chatter_sub = nodeHandle.subscribe("chatter", 1000, chatterCallback);
/**
* 循环等待回调函数
* spin()会开一个线程不断地查询回调函数队列是否有回调函数进来
*/
ros::spin();
return 0;
}
3.修改CMakeLists.txt文件
进入代码空间src下的自己的功能包(my_package)下
cd ~/catkin_ws/src/my_package
编辑CMakeLists.txt文件
gedit CMakeLists.txt
# project name
project(my_package)
# using C++11
set(CMAKE_CXX_FLAGS "${CAMKE_CXX_FLAGS} -std=c++11 ")
# cmake version
cmake_minimum_required(VERSION 2.8.3)
# find ROS package
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
)
# link headers
include_directories(
${catkin_INCLUDE_DIRS}
)
# 生成可执行文件
add_executable(talker src/talker.cpp)
add_executable(listener src/listener.cpp)
# after ADD_EXECUTABLE,为生成文件target添加库
target_link_libraries(talker ${catkin_LIBRARIES})
target_link_libraries(listener ${catkin_LIBRARIES})
4.编译执行
cd ~/catkin_ws
catkin_make

新建终端
roscore
新建终端
rosrun my_package talker
新建终端
rosrun my_package listener

二、自定义消息类型
1.新建消息类型文件
这个文件存储在功能包my_package下新建的一个msg文件夹。
mkdir -p ~/catkin_ws/src/my_package/msg
创建Person.msg文件
gedit ~/catkin_ws/src/my_package/msg/Person.msg
string name
uint8 sex
uint8 age
uint8 unknown = 0
uint8 male = 1
uint8 female = 2
- 变量:
name,sex,age - 常量:
unknown,male,female
2.添加依赖
(1)修改package.xml
gedit ~/catkin_ws/src/my_package/package.xml
添加
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

(2)修改CMakeLists.txt
gedit ~/catkin_ws/src/my_package/CMakeLists.txt
话题编程要用到自定义的消息数据结构,所以我们
- 添加build的依赖
message_generation和exec的依赖message_runtime
(话题编程messages和服务编程serviecs都是消息message,依赖build的message_generation和exec的message_runtime)
(动作编程actions是动作action,依赖build和exec的actionlib、actionlib_msgs) - 添加我们的
messages文件Person.msg - 添加话题编程
messages使用消息类型std_msgs
消息类型(messages(对应std_msgs)/services(对应std_msgs)/actions(对应actionlib_msgs))
则对应CMakeLists.txt新增修改内容:
-
find_package:添加build的依赖,即找到catkin包中需要的组件。
除了那三项( roscpp、rospy和std_msgs)后,还要有message_generation。 -
add_message_files:Generate messages in the ‘msg’ folder(添加在’msg’ 文件夹中的消息文件。)
添加我们自定义文件的Person.msg到FILES中 -
generate_messages:Generate added messages and services with any dependencies listed here(使用此处添加的任何依赖项来生成添加了的消息和服务)
添加消息类型std_msgs到DEPENDENCIES中 -
catkin_package:添加exec执行的依赖CATKIN_DEPENDS
除了添加那三项( roscpp、rospy和std_msgs)后,还要有message_runtime。
其中要注意的是:
generate_messages当然在add_message_files之后catkin_package必须在add_message_files和generate_messages之后
# project name
project(my_package)
# using C++11
set(CMAKE_CXX_FLAGS "${CAMKE_CXX_FLAGS} -std=c++11 ")
# cmake version
cmake_minimum_required(VERSION 2.8.3)
# find catkin package需要的组件
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
# 添加消息文件
add_message_files(
FILES
Person.msg
)
# 生成添加了的消息和服务
generate_messages(
DEPENDENCIES
std_msgs
)
# 添加exec执行的依赖
catkin_package(
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
)
# link headers
include_directories(
${catkin_INCLUDE_DIRS}
)
# 生成可执行文件
add_executable(talker src/talker.cpp)
add_executable(listener src/listener.cpp)
# after ADD_EXECUTABLE,为生成文件target添加库
target_link_libraries(talker ${catkin_LIBRARIES})
target_link_libraries(listener ${catkin_LIBRARIES})
3.编译
cd ~/catkin_ws
catkin_make
编译好后我们可以使用命令查看消息:
rosmsg show Person

更多推荐



所有评论(0)