建立消息内容
在建立的msg文件夹下,建立一个文件
touch person.msg
内容如下,类似C语言结构体
string name
uint8 sex
uint8 age
uint8 unknow=0
uint8 male=1
uint8 female=2
添加功能包依赖
将
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
添加进package.xml
将message_generation
添加进 find_package
添加以下代码在如图位置
add_message_files(FILES person.msg)
generate_messages(DEPENDENCIES std_msgs)
这里注意,person.msg 与你建立的文件名是一致的
在Cmake里面将注释依赖打开 即CATKIN_DEPENDS geometry-msgs roscprospy std_msgs turtlesim 这句话
回到catkin_ws目录下 做编译 输入catkin_make
在这里会生成person.h文件,可以打开看一下
接下来开始编写代码,要分别编写发布者与订阅者的代码
如图新建立2个文件
这是每编译前的代码,接下来进行代码编译
添加代码编译规则
add_executable(person_publish src/person_publish.cpp)
target_link_libraries(person_publish ${catkin_LIBRARIES})
add_dependencies(person_publish ${PROJECT_NAME}_generate_messages_cpp)
add_executable(person_subscribe src/person_subscribe.cpp)
target_link_libraries(person_subscribe ${catkin_LIBRARIES})
add_dependencies(person_subscribe ${PROJECT_NAME}_generate_messages_cpp)
编译代码,改正后代码如下
#include <ros/ros.h> //包含ros自带的头文件
#include “learning_topic/person.h”//包含自己建立的learning_topic 功能包下的 person.h
int main(int argc,char **argv)
{
ros::init(argc,argv,“person_publisher”);//节点名称是person——publisher
ros::NodeHandle n; //创建节点
//创建一个发布者 消息类型是leaqrning_topic 通道是person_info
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 person_msg; //根据自己生成的数据类型 定义一个对象
person_msg.name=“dxp”;
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;
}
/*************************************************************************************************************/
#include <ros/ros.h>
#include “learning_topic/person.h”
void personincallback(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 person_subscribe =n.subscribe (“person_info”,10,personincallback);
ros::spin();
return 0;
}