ros-话题消息的定义与使用

数据结构的定义

在catkin_ws/src/learning_topic创建msg文件夹,进入msg文件夹中,创建Person.msg,存放下面的代码在Person.msg

string name
uint8 sex
uint8 age
uint8 unknown = 0   # 在ROS中,这不是代表初始化,而是宏定义
uint8 male = 1
uint8 female = 2

在package.xml中添加功能包依赖

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

在CMakeList.txt添加编译选项

find_package(... message_generation
)

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

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES learning_topic
  CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim message_runtime
#  DEPENDS system_lib
)

注释:
INCLUDE_DIRS:导出包的include路径
LIBRARIES:导出项目中的库名字
CATKIN_DEPENDS:指定当前包所依赖的其他ROS包
DEPENDS:指定当前包所依赖的其他非ROS包,如普通的opencv库。

可参考

实现发布与订阅

创建发布者和订阅者

新建两个文件,分别为person_publisher.cpp 和 person_subscriber.cpp
在这里插入图片描述person_publisher.cpp文件:

/*
*该例程将用于发布/person_info话题,自定义类型为learning_topic::Person
*/
#include<ros/ros.h>      //很多ROS里的API和函数从里面调用
#include<learning_topic/Person.h>   
 
int main(int argc,char **argv)
{
	//ROS节点初始化
	ros::init(argc,argv,"person_publisher");
	
	//创建节点句柄
	ros::NodeHandle n;
 
	//创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10
	ros::Publisher person_info_pub  = n.advertise<learning_topic::Person>("/person_info",10);
 
	//设置循环的频率
	ros::Rate loop_rate(1);
 
	int count = 0;
	while(ros::ok())
	{
		//初始化learning_topic::Person类型的消息
		learning_topic::Person      person_msg;
		person_msg.name = "PPT";
		person_msg.age = 18;
		person_msg.sex = learning_topic::Person::male; //调用之前定义的宏
 
		//发布消息
		person_info_pub.publish(person_msg);
		ROS_INFO("publish Person Info: name:%s  age:%d  sex:%d",
			  person_msg.name.c_str(),person_msg.age,person_msg.sex    );
	
		//按照循环频率延时
		loop_rate.sleep();
	}
	return 0;
 
}
 

person_subscriber.cpp:

/*
*该例程将用于订阅/person_info话题,自定义消息类型为learning_topic::Person
*/
#include<ros/ros.h>      //很多ROS里的API和函数从里面调用
#include<learning_topic/Person.h> 
 
void PersonInfoCallback(const learning_topic::Person::ConstPtr & msg)
{
 
	//将接收到的消息打印出来
	ROS_INFO("Subscribe Person Info: name:%s  age:%d  sex:%d",
	          msg->name.c_str(),msg->age,msg->sex);
 
}
 
int main(int argc,char **argv)
{
	//ROS节点初始化
	ros::init(argc,argv,"person_subscriber");
	
	//创建节点句柄
	ros::NodeHandle n;
 
	//创建一个Subscriber,发布名为/turtle/pose的topic,注册回调函数
	ros::Subscriber person_info_sub  = n.subscribe("/person_info",10,PersonInfoCallback);
	
	//循环等待回调函数
	ros::spin();
 
	return 0;
 
}
 

配置代码编译规则

在CMakeLists.txt文件中添加:

add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJRCT_NAME}_generate_message_cpp)
 
add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJRCT_NAME}_generate_message_cpp)

如果编译时,在add_dependencies报错,则改为

add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher  ${PROJECT_NAME}_gencpp)
 
add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber  ${PROJECT_NAME}_gencpp)

编译

在这里插入图片描述

运行

#打开新的终端
roscore
#打开新的终端
rosrun learning_topic person_publisher
#打开新的终端
rosrun learning_topic person_subscriber
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值