ROS实践06 自定义消息类型

运行环境:

ubuntu20.04 noetic
宏基暗影骑士笔记本

思路:

定义.msg文件
修改package.xml和CMakeLists.txt文件

编译后修改includePath
创建功能包
在功能包src下新建.cpp文件

1.1 定义.msg文件

1)功能包下新建 msg 目录,添加文件 Person.msg

string name
uint16 age
float64 height

package.xml --功能包清单文件
CMakeLists.txt --CMake 配置文件

2)修改package.xml

# 编译依赖与执行依赖
 <build_depend>message_generation</build_depend>
 <exec_depend>message_runtime</exec_depend>

3)修改CMakeLists.txt

编译依赖、运行依赖、引入msg、依赖std_msg

# 编译依赖
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)
#运行依赖
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES demo02_talker_listener
  CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)
# 将.msg 引入功能包
add_message_files(
  FILES
  Person.msg
)
# generate_messages 依赖于 std_msgs
generate_messages(
  DEPENDENCIES
  std_msgs
)



2.1 自定义消息调用(C++)

1)编译后修改includePath

"/home/duduzai/demo01_ws/devel/include/**"

在这里插入图片描述

Person.msg编译后自动生成Person.h


2)发布方实现

在功能包src中新建person_pub.cpp文件

/*
    需求: 循环发布人的信息

*/

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


int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");

    //1.初始化 ROS 节点
    ros::init(argc,argv,"talker_person");

    //2.创建 ROS 句柄
    ros::NodeHandle nh;

    //3.创建发布者对象
    ros::Publisher pub = nh.advertise<demo01_pub::Person>("chatter_person",1000);

    //4.组织被发布的消息,编写发布逻辑并发布消息
    demo01_pub::Person p;
    p.name = "sunwukong";
    p.age = 2000;
    p.height = 1.45;

    ros::Rate r(1);
    while (ros::ok())
    {
        pub.publish(p);
        p.age += 1;
        ROS_INFO("我叫:%s,今年%d岁,高%.2f米", p.name.c_str(), p.age, p.height);

        r.sleep();
        ros::spinOnce();
    }



    return 0;
}

.msg编译后生成.h头文件,下面引入头文件
#include “demo01_pub/Person.h”

消息类型
<demo01_pub::Person>

2.1修改CMakeLists.txt
# 生成可执行文件
add_executable(person_pub.cpp src/person_pub.cpp)

# 链接可执行文件和消息类型
add_dependencies(person_pub.cpp ${PROJECT_NAME}_generate_messages_cpp)

# 链接可执行和编译库
target_link_libraries(person_pub.cpp
  ${catkin_LIBRARIES}
)
2.3运行节点
roscore
source ./devel/setup.bash
rosrun demo01_pub person_pub.cpp 

在这里插入图片描述


3)订阅方实现

在功能包src中新建person_sub.cpp文件

/*
    需求: 订阅人的信息

*/

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

void doPerson(const demo01_pub::Person::ConstPtr& person_p){
    ROS_INFO("订阅的人信息:%s, %d, %.2f", person_p->name.c_str(), person_p->age, person_p->height);
}

int main(int argc, char *argv[])
{   
    setlocale(LC_ALL,"");

    //1.初始化 ROS 节点
    ros::init(argc,argv,"listener_person");
    //2.创建 ROS 句柄
    ros::NodeHandle nh;
    //3.创建订阅对象
    ros::Subscriber sub = nh.subscribe<demo01_pub::Person>("chatter_person",10,doPerson);

    //4.回调函数中处理 person

    //5.ros::spin();
    ros::spin();    
    return 0;
}
3.1修改CMakeLists.txt
# 生成可执行文件
add_executable(person_sub.cpp src/person_sub.cpp)

# 链接可执行文件和消息类型
add_dependencies(person_sub.cpp ${PROJECT_NAME}_generate_messages_cpp)

# 链接可执行和编译库
target_link_libraries(person_sub.cpp
  ${catkin_LIBRARIES}
)
3.2运行节点
# 打开终端
cd /home/duduzai/demo01_ws
source ./devel/setup.bash
rosrun demo01_pub person_sub.cpp 

在这里插入图片描述


⭐⭐⭐ 嘟嘟崽 ⭐⭐⭐
⭐⭐⭐ 祝你成功 ⭐⭐⭐
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答: 在ROS2中,如果要发布自定义消息类型,需要进行以下几个步骤。首先,需要在消息定义文件中定义自定义消息类型,该文件需要保存在消息目录中,并使用.msg文件扩展名。\[1\]然后,在发布节点的源代码中,使用ROS2的Publisher类来创建发布者对象,并指定自定义消息类型作为模板参数。例如:ros2::Publisher<my_msgs::MyMessage> pub = node.create_publisher<my_msgs::MyMessage>("my_topic", 10);\[2\]接下来,编写发布消息的逻辑,并使用发布者对象的publish方法来发布消息。最后,运行发布节点,即可发布自定义消息类型消息。 #### 引用[.reference_title] - *1* *2* [ROS笔记(6)——自定义消息类型](https://blog.csdn.net/weixin_40582034/article/details/129041958)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [ROS实践07 自定义消息调用python](https://blog.csdn.net/qq_42227760/article/details/130013586)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

圆嘟嘟2019

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值