ros-自定义消息

建立消息内容

在建立的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;

}
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值