ROS学习笔记 自定义数据类型的topic

ROS学习笔记 自定义数据类型的topic

  • 在创建好的package目录下再创建一个msg文件夹专门用于防止自定义数据类型的topic的源文件(文件名必须是msg,踩过坑了)
  • 创建SelfDefineTopicName.msg文件(据说文件的首字母一定要大写,不大写会出问题)
  • 可以在里面定义变量或常量
//SelfDefineTopicName.msg
string name
uint8 sex
uint8 age

uint8 unknown = 0
uint8 male = 1
uint8 female =2

这里使用的基础数据类型与语言无关,编译会变成各种各样的语言对应的数据类型 ros真的强

编译topic

  • 首先在此功能包的package.xml内添加依赖说明
  <build_depend>message_generation</build_depend>//编译依赖
  <exec_depend>message_runtime</exec_depend>//运行依赖
  • 在功能包的CMakeLists.txt中的find_package()多加一行(防止有人把原先的内容全删了然后就省着吗一行了)
message_generation
  • 在功能包的CMakeLists.txt中的catkin_package()变为形如
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES learning_topic
  CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim message_runtime
#  DEPENDS system_lib
)
原来的样子是这样的
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES learning_topic
#  CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim
#  DEPENDS system_lib
)
  • 说白了就是删除一个# 然后多加一个message_runtime
  • 最后设置要编译的msg文件
add_message_files(
  FILES 
  Person.msg
)

generate_messages(
  DEPENDENCIES 
  std_msgs
)

然后编译即可 ,你不会编译我就管不了
编译完会生成一个SelfDefineTopicName.h的文件在devel/packageName目录下。
写代码时直接#include''packageName/SelfDefineTopicNmae.h"即可。
packagename是命名空间

rosmsg show packageName/Person

这个命令可以查看此数据结构的信息
最后附上跟这个topic配套的publisher跟subscriber的demo

//Person_publiser
#include "learning_topic/Person.h"
#include <ros/ros.h>
int main(int argc, char **argv) {
    ros::init(argc, argv, "person_publisher");
    ros::NodeHandle n;
    ros::Publisher Pub = n.advertise<learning_topic::Person>("/person_info",10);//如果没有这个topic会自建一个topic
    ros::Rate rate_loop(10);
    while(ros::ok){
        learning_topic::Person person_msgs;
        person_msgs.name = "luoxihao";
        person_msgs.age = 20;
        person_msgs.sex = learning_topic::Person::male;
        Pub.publish(person_msgs);
        rate_loop.sleep();
    }
    return 0;
}
#include "learning_topic/Person.h"
#include <ros/ros.h>
void personCallBack(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 sub = n.subscribe("/person_info",10,personCallBack);

    ros::spin();
    
    return 0;
}
### 关于赵虚左 ROS 讲义的内容概要 赵虚左老师的《ROS理论与实践》系列讲义主要围绕机器人操作系统(ROS)的核心知识点展开,涵盖了从基础知识到实际操作的多个方面。以下是基于已有引用内容整理的相关资料和内容概要: #### 1. **ROS 概述与环境搭建** - 赵虚左老师的第一章重点介绍了 ROS 的基本概念及其在机器人开发中的作用[^1]。 - 主要内容包括: - ROS 的分布式架构设计以及其作为中间件的角色。 - 如何安装并配置 ROS2 环境,适合初学者快速上手。 - 提供了详细的环境搭建指南,适用于多种主流操作系统。 #### 2. **ROS 文件系统与计算图** - 第二部分深入讲解了 ROS 的文件系统结构以及计算图的概念[^2]。 - 核心要点如下: - **节点 (Node)**:执行特定功能的小型程序单元。 - **消息 (Message)**:用于传递数据的标准格式。 - **主题 (Topic)** 和 **服务 (Service)**:两种常见的通信方式。 - 这些组件共同构成了 ROS 中的数据流模型。 #### 3. **通信机制与参数管理** - 在第三部分内容中,进一步探讨了 ROS 的通信机制及其实战技巧[^3]。 - 参数服务器的功能被详细介绍,具体命令包括但不限于: - `rosparam set`:设置全局参数。 - `rosparam get`:获取指定参数值。 - `rosparam load/dump/delete/list`:分别完成加载、保存、删除和列举参数的操作。 --- ### 下载资源建议 目前公开渠道并未提供完整的 PDF 版本下载链接,但可以通过以下途径获取相关内容: 1. 参考 Bilibili 平台上由猛狮集训营发布的官方教学视频。 2. 加入知识星球社区(ID: 24691717),获得更多补充材料和技术支持。 3. 如果需要纸质版或电子书形式的学习笔记,可尝试联系作者团队微信 damuxt 请求协助。 --- ### 示例代码片段 下面展示一段简单的 Python 实现,演示如何通过 ROS 发布一个自定义话题的消息: ```python import rclpy from std_msgs.msg import String def main(args=None): rclpy.init(args=args) node = rclpy.create_node('minimal_publisher') publisher = node.create_publisher(String, 'topic', 10) msg = String() while True: msg.data = "Hello World" publisher.publish(msg) node.get_logger().info(f'Publishing: {msg.data}') rclpy.spin_once(node) if __name__ == '__main__': main() ``` 此脚本展示了创建节点、初始化发布者对象的过程,并循环发送字符串类型的测试信息给订阅端接收处理。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值