ROS学习笔记 自定义数据类型的topic
- 在创建好的
package
目录下再创建一个msg文件夹专门用于防止自定义数据类型的topic的源文件(文件名必须是msg,踩过坑了) - 创建
SelfDefineTopicName.msg
文件(据说文件的首字母一定要大写,不大写会出问题) - 可以在里面定义变量或常量
//SelfDefineTopicName.msg
string name
uint8 sex
uint8 age
uint8 unknown = 0
uint8 male = 1
uint8 female =2
这里使用的基础数据类型与语言无关,编译会变成各种各样的语言对应的数据类型 ros真的强
编译topic
- 首先在此功能包的
package.xml
内添加依赖说明
<build_depend>message_generation</build_depend>//编译依赖
<exec_depend>message_runtime</exec_depend>//运行依赖
- 在功能包的
CMakeLists.txt
中的find_package()
中多加一行(防止有人把原先的内容全删了然后就省着吗一行了)
message_generation
- 在功能包的
CMakeLists.txt
中的catkin_package()
变为形如
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES learning_topic
CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim message_runtime
# DEPENDS system_lib
)
原来的样子是这样的
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES learning_topic
# CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim
# DEPENDS system_lib
)
- 说白了就是删除一个# 然后多加一个
message_runtime
- 最后设置要编译的msg文件
add_message_files(
FILES
Person.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
然后编译即可 ,你不会编译我就管不了
编译完会生成一个SelfDefineTopicName.h
的文件在devel/packageName
目录下。
写代码时直接#include''packageName/SelfDefineTopicNmae.h"
即可。
packagename是命名空间
rosmsg show packageName/Person
这个命令可以查看此数据结构的信息
最后附上跟这个topic配套的publisher跟subscriber的demo
//Person_publiser
#include "learning_topic/Person.h"
#include <ros/ros.h>
int main(int argc, char **argv) {
ros::init(argc, argv, "person_publisher");
ros::NodeHandle n;
ros::Publisher Pub = n.advertise<learning_topic::Person>("/person_info",10);//如果没有这个topic会自建一个topic
ros::Rate rate_loop(10);
while(ros::ok){
learning_topic::Person person_msgs;
person_msgs.name = "luoxihao";
person_msgs.age = 20;
person_msgs.sex = learning_topic::Person::male;
Pub.publish(person_msgs);
rate_loop.sleep();
}
return 0;
}
#include "learning_topic/Person.h"
#include <ros/ros.h>
void personCallBack(const learning_topic::Person::ConstPtr &msg) {
ROS_INFO("name = %s,age = %d,sex = %d",msg->name.c_str(),msg->age,msg->sex);
}
int main(int argc, char **argv){
ros::init(argc, argv,"person_subscriber");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("/person_info",10,personCallBack);
ros::spin();
return 0;
}