ROS实践06 自定义消息类型
文章目录
- 运行环境:
- 思路:
- 1.1 定义.msg文件
- 1)功能包下新建 msg 目录,添加文件 Person.msg
- 2)修改package.xml
- 3)修改CMakeLists.txt
- 2.1 自定义消息调用(C++)
- 1)编译后修改includePath
- 2)发布方实现
- 2.1修改CMakeLists.txt
- 2.3运行节点
- 3)订阅方实现
- 3.1修改CMakeLists.txt
- 3.2运行节点
运行环境:
ubuntu20.04 noetic
宏基暗影骑士笔记本
思路:
定义.msg文件
修改package.xml和CMakeLists.txt文件
编译后修改includePath
创建功能包
在功能包src下新建.cpp文件
1.1 定义.msg文件
1)功能包下新建 msg 目录,添加文件 Person.msg
string name
uint16 age
float64 height
package.xml --功能包清单文件
CMakeLists.txt --CMake 配置文件
2)修改package.xml
# 编译依赖与执行依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
3)修改CMakeLists.txt
编译依赖、运行依赖、引入msg、依赖std_msg
# 编译依赖
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
#运行依赖
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES demo02_talker_listener
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
# 将.msg 引入功能包
add_message_files(
FILES
Person.msg
)
# generate_messages 依赖于 std_msgs
generate_messages(
DEPENDENCIES
std_msgs
)
2.1 自定义消息调用(C++)
1)编译后修改includePath
"/home/duduzai/demo01_ws/devel/include/**"
Person.msg编译后自动生成Person.h
2)发布方实现
在功能包src中新建person_pub.cpp文件
/*
需求: 循环发布人的信息
*/
#include "ros/ros.h"
#include "demo01_pub/Person.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
//1.初始化 ROS 节点
ros::init(argc,argv,"talker_person");
//2.创建 ROS 句柄
ros::NodeHandle nh;
//3.创建发布者对象
ros::Publisher pub = nh.advertise<demo01_pub::Person>("chatter_person",1000);
//4.组织被发布的消息,编写发布逻辑并发布消息
demo01_pub::Person p;
p.name = "sunwukong";
p.age = 2000;
p.height = 1.45;
ros::Rate r(1);
while (ros::ok())
{
pub.publish(p);
p.age += 1;
ROS_INFO("我叫:%s,今年%d岁,高%.2f米", p.name.c_str(), p.age, p.height);
r.sleep();
ros::spinOnce();
}
return 0;
}
.msg编译后生成.h头文件,下面引入头文件
#include “demo01_pub/Person.h”
消息类型
<demo01_pub::Person>
2.1修改CMakeLists.txt
# 生成可执行文件
add_executable(person_pub.cpp src/person_pub.cpp)
# 链接可执行文件和消息类型
add_dependencies(person_pub.cpp ${PROJECT_NAME}_generate_messages_cpp)
# 链接可执行和编译库
target_link_libraries(person_pub.cpp
${catkin_LIBRARIES}
)
2.3运行节点
roscore
source ./devel/setup.bash
rosrun demo01_pub person_pub.cpp
3)订阅方实现
在功能包src中新建person_sub.cpp文件
/*
需求: 订阅人的信息
*/
#include "ros/ros.h"
#include "demo01_pub/Person.h"
void doPerson(const demo01_pub::Person::ConstPtr& person_p){
ROS_INFO("订阅的人信息:%s, %d, %.2f", person_p->name.c_str(), person_p->age, person_p->height);
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
//1.初始化 ROS 节点
ros::init(argc,argv,"listener_person");
//2.创建 ROS 句柄
ros::NodeHandle nh;
//3.创建订阅对象
ros::Subscriber sub = nh.subscribe<demo01_pub::Person>("chatter_person",10,doPerson);
//4.回调函数中处理 person
//5.ros::spin();
ros::spin();
return 0;
}
3.1修改CMakeLists.txt
# 生成可执行文件
add_executable(person_sub.cpp src/person_sub.cpp)
# 链接可执行文件和消息类型
add_dependencies(person_sub.cpp ${PROJECT_NAME}_generate_messages_cpp)
# 链接可执行和编译库
target_link_libraries(person_sub.cpp
${catkin_LIBRARIES}
)
3.2运行节点
# 打开终端
cd /home/duduzai/demo01_ws
source ./devel/setup.bash
rosrun demo01_pub person_sub.cpp