【ros】-4 自定义消息类型

话题消息

类似于结构体

1 自定义消息

1.1 定义msg文件

在包的目录下,创建一个msg文件夹,在该文件夹下添加msg文件
在这里插入图片描述

1.2 添加编译、运行依赖

package文件中,添加:

# 消息编译时用到的依赖
<build_depend>message_generation</build_depend>
# 运行时用到的依赖
<exec_depend>message_runtime</exec_depend>

在这里插入图片描述

CMakeList文件中,添加:
首先,添加功能包
在这里插入图片描述

其次,

# 添加msg文件
add_message_files(FILES pra_topic_msg.msg)
# msg文件用到的包
generate_messages(DEPENDENCIES std_msgs)
# std_msgs中包含string、uint8等类型

在这里插入图片描述
最后,添加运行依赖:
catkin_package中添加运行依赖message_runtime
在这里插入图片描述

2 举例

定义pra_topic_msg.msg文件,内容:

string topic_type
uint8 x
uint8 y

2.1 发布者

2.1.1 c++

定义msg_topic_pub.cpp 文件,内容:

#include <ros/ros.h>
#include "practice_pkg/pra_topic_msg.h"


int main(int argc,char **argv){
    ros::init(argc,argv,"msg_topic_pub");
    ros::NodeHandle n;
    ros::Publisher pub = n.advertise<practice_pkg::pra_topic_msg>("msg_topic_cpp",10);
    ros::Rate r(0.5);

    practice_pkg::pra_topic_msg msg;
    msg.topic_type = "publisher";
    msg.x = 1;
    msg.y = 1;
    int var=0;
    while(ros::ok())
    {
        pub.publish(msg);
        ROS_INFO("type:%s x:%d y:%d", msg.topic_type.c_str(), msg.x, msg.y);
        var = msg.x;
        msg.x = msg.x + msg.y;
        msg.y = var;

        r.sleep();
    }
    return 0;
}

由于该c++文件用到了自定义消息类型,因此与之前的配置稍有不同

# 将指定代码文件 生成 可执行文件
add_executable(msg_topic_pub src/msg_topic_pub.cpp)
# 设置链接库
target_link_libraries(msg_topic_pub ${catkin_LIBRARIES})
# 添加依赖项
add_dependencies(msg_topic_pub ${PROJECT_NAME}_generate_messages_cpp)

之后编译并运行
在这里插入图片描述

2.1.2 python

定义文件msg_topic_pub.py

#!/usr/bin/env python

import rospy
from practice_pkg.msg import pra_topic_msg

def func():
    rospy.init_node("msg_topic_pub")
    pub = rospy.Publisher("msg_topic_py",pra_topic_msg ,queue_size=10)
    r = rospy.Rate(0.5)
    msg = pra_topic_msg()
    msg.topic_type = "python"
    msg.x = 1
    msg.y = 1
    while not rospy.is_shutdown():
        pub.publish(msg)
        rospy.loginfo(f"tpye:{msg.topic_type},x:{msg.x},y:{msg.y}")
        msg.x , msg.y = msg.x+msg.y , msg.x
        r.sleep()

if __name__ == "__main__":
    try:
        func()
    except:
        pass

注意:记得将文件改为可执行文件
在这里插入图片描述

2.2 订阅者

2.2.1 c++

定义文件:msg_topic_sub.cpp

#include <ros/ros.h>
#include "practice_pkg/pra_topic_msg.h"

void CallBack(const practice_pkg::pra_topic_msg::ConstPtr& msg)
{
    ROS_INFO("type:%s x:%d y:%d", msg->topic_type.c_str() ,msg->x ,msg->y );
}

int main(int argc,char **argv){
    ros::init(argc,argv,"msg_topic_sub");
    ros::NodeHandle n;
    ros::Subscriber sub = n.subscribe("msg_topic_cpp",10,CallBack);
    ros::spin();
    return 0;
}

配置:

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

运行:
在这里插入图片描述

2.2.2 python

创建文件:msg_topic_sub.py

#!/usr/bin/env python

import rospy
from practice_pkg.msg import pra_topic_msg

def CallBack(msg):
    rospy.loginfo(f"type:{msg.topic_type},x:{msg.x},y:{msg.y}")

def func():
    rospy.init_node("msg_topic_sub")
    rospy.Subscriber("msg_topic_py",pra_topic_msg,CallBack)
    rospy.spin()

if __name__ == "__main__":
    try:
        func()
    except:
        pass

在这里插入图片描述
最终的文件分布:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值