12话题消息的定义与使用
1、自定义话题消息
1.1、在learning_topic中创建文件夹msg
创建Person.msg文件
chen@ubuntu:~/catkin_ws/src/learning_topic/msg$ touch Person.msg
打开该文件,并写入以下内容,在编译的时候会编译成相应的c++或python可执行文件
string name
uint8 sex
uint8 age
uint8 unknown=0
uint8 male =1
uint8 female=2
从而完成数据接口定义
2、设置编译规则
2.1 在package.xml中添加功能包依赖
<build_depend>message_generation</build_depend>
//编译依赖message_generation
<exec_depend>message_runtime</exec_depend>
//运行依赖,会依赖于message_runtime
2.2 在CMakeList.txt添加编译选项
添加依赖功能包,如下图
add_message_files(FILES Person.msg)
//添加定义的消息接口
generate_messages(DEPENDENCIES std_msgs)
//编译Person.msg时,需要依赖ros已有的库std_msgs
在catkin_package中创建运行依赖,对应上面2.1中的<exec_depend>message_runtime</exec_depend>,如下图
CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim message_runtime
2.3、编译
chen@ubuntu:~/catkin_ws$ catkin_make
若编译出错,检查文件中写入的配置是不是有误
下图为devel中编译得到的C++头文件
3、创建发布者和订阅者代码C++
4、配置代码编译规则
add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)
//因为有些代码是动态生成的,为了可执行文件和动态生成的程序产生依赖关系
add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)
5、运行
5.1 运行roscore
chen@ubuntu:~$ roscore
5.2运行发布者
chen@ubuntu:~$ rosrun learning_topic
person_publisher person_subscriber.cpp velocity_publisher
person_publisher.cpp pose_subscriber velocity_publisher.cpp
person_subscriber pose_subscriber.cpp
chen@ubuntu:~$ rosrun learning_topic person_publisher
[ INFO] [1582710519.920151660]: Publish Person Info: name:Tom age:18 sex:1
[ INFO] [1582710520.920881810]: Publish Person Info: name:Tom age:18 sex:1
5.3运行订阅者
chen@ubuntu:~$ rosrun learning_topic person_subscriber
[ INFO] [1582710628.922461835]: Subcribe Person Info: name:Tom age:18 sex:1
[ INFO] [1582710629.921415215]: Subcribe Person Info: name:Tom age:18 sex:1
5.4 关闭rosmaster
发布者和订阅者可以正常通信,rosmaster只是在刚开始通信的时候进行参数注册