启明办公

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 128|回复: 1

创建ROS自定义消息类型

[复制链接]

1

主题

4

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2022-9-20 19:46:48 | 显示全部楼层 |阅读模式
说明:本节默认读者已经按照创建ROS工作空间操作流程创建了一个名为example的工作空间
一、创建msg文件

在~/example/src/package1路径下创建一个msg文件夹(如果写服务就创建一个srv文件夹),使用touch命令创建一个Person.msg文件(后缀名必须是.msg,消息名称最好首字母大写),相关操作命令如下
cd ~/example/src/package1
mkdir msg
cd msg
touch Person.msg在Person.msg中输入如下内容完成.msg文件的创建,msg文件是ROS独有的格式
string name
uint8 sex
uint8 age

uint8 unknown = 0
uint8 male = 1
uint8 female = 2二、修改package.xml文件

需要加入编译依赖和执行依赖,编译和执行均需要相关依赖功能包,在package.xml文件中添加以下内容
<build_depend>message_generation</build_depend>     //编译的支持项
<exec_depend>message_runtime</exec_depend>     //生成可执行文件的支持项三、修改CMakeLists.txt文件

//在功能包的CMakeList.txt文件夹下添加message_generation库,这一块主要是编译会用到的支持包
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

//在声明ROS消息时需要加入以下内容
add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)

//取消对编译选项的注释,在原本的内容下加入message_runtime,此处为生成可执行文件所需依赖包
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES package1
   CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

// 添加编译及链接文件,增加add_dependencies表明优先编译消息头文件,避免后续使用时候编译程序报错
add_executable(example_package1_publisher_exe src/person_publisher.cpp)
target_link_libraries(example_package1_publisher_exe ${catkin_LIBRARIES})
add_dependencies(example_package1_publisher_exe ${PROJECT_NAME}_generate_messages_cpp)

add_executable(example_package1_subsriber_exe src/person_subscriber.cpp)
target_link_libraries(example_package1_subsriber_exe ${catkin_LIBRARIES})
add_dependencies(example_package1_subsriber_exe ${PROJECT_NAME}_generate_messages_cpp)

四、发布者CPP文件

#include "ros/ros.h"
#include "package1/Person.h"

int main(int argc,char **argv)
{
    //ROS节点初始化
    ros::init(argc,argv,"person_publisher");  

    //创建句柄
    ros::NodeHandle n;   

    //创建一个Publisher,发布名为/person_info的话题,消息类型为package1::Person,队列长度为10        
    ros::Publisher person_info_pub  =  n.advertise<package1::Person>("/person_info",10);
   
    //设置循环频率(HZ),与loop_rate.sleep()函数关联,如果下一帧信息不满足频率要求则系统延时
    ros::Rate loop_rate(1);   

    while(ros::ok())
    {   //初始化package1::Person类型的消息
        package1::Person person_msg;
        person_msg.name = "Bob";
        person_msg.age = 6;
        person_msg.sex =  package1::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;
}
五、接收CPP文件

#include  <ros/ros.h>
#include "package1/Person.h"


void personInfoCallback(const package1::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;   

    //创建一个Publisher,发布名为/person_info的话题,消息类型为package1::Person,队列长度为10        
    ros::Subscriber person_info_sub  =  n.subscribe("/person_info",10,personInfoCallback);
    ros::spin();
    return 0;
}
返回到主工作空间下使用使用catkin_make编译整个项目~
回复

使用道具 举报

0

主题

8

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2025-2-25 07:43:52 | 显示全部楼层
前排顶,很好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|启明办公

Copyright © 2001-2013 Comsenz Inc.Template by Comsenz Inc.All Rights Reserved.

Powered by Discuz!X3.4

快速回复 返回顶部 返回列表