ROS话题通信机制自定义数据Python实现

ROS话题通信的理论查阅ROS话题通信流程理论
ROS话题通信的自定义数据的准备可以查阅ROS话题通信流程自定义数据格式

在ROS话题通信机制实现中,ROS master 不需要实现,且连接的建立也已经被封装了,需要关注的关键点有三个:

  • 发布方(二狗子)
  • 订阅方(翠花)
  • 数据(此处为普通文本)

创建ROS工程

创建一个ROS工程包括以下几个步骤:

  • 创建一个topic_ws的ROS工作空间
  • 启动VScode
  • VScode 编译ROS
  • 创建ROS功能包
  • 在功能包下创建一个scripts文件

详细操作可以查阅VScode创建ROS项目 ROS集成开发环境

VScode配置

为了方便代码提示以及误抛异常,需要先配置 vscode,将前面自定义数据格式生成的 python 文件路径配置进 settings.json
在这里插入图片描述

发布方(二狗子)

  • 基本流程

    • 1.包含头文件
    • 2.初始化 ROS 节点:命名(唯一)
    • 3.实例化 发布者 对象
    • 4.组织被发布的数据,并编写逻辑发布数据
  • 代码实现

    #! /usr/bin/env python3
    
    import rospy
    from plumbing_pub_sub.msg import Person
    
    
    """
    实现流程:
        1.导包 
        2.初始化 ROS 节点:命名(唯一)
        3.实例化 发布者 对象
        4.组织被发布的数据,并编写逻辑发布数据
    """
    
    if __name__ == "__main__":
        #2.初始化 ROS 节点:命名(唯一)
        rospy.init_node("banZzhuRen")
        #3.实例化 发布者 对象
        pub = rospy.Publisher("liaoTian", Person, queue_size=10)
        #4.组织被发布的数据,并编写逻辑发布数据
        p = Person()
        p.name = "ZhangSan"
        p.age = 24
        p.height = 1.75
    
        # 设置循环频率
        rate = rospy.Rate(1)
    
        rospy.sleep(3) # 休眠3s等待 publisher 注册完成,不然订阅者读不到第一条消息
    
        while not rospy.is_shutdown():
    
            # 发布数据
            pub.publish(p)
            rate.sleep()
            rospy.loginfo("姓名:%s, 年龄:%d, 身高:%.2f",p.name, p.age, p.height)
         
    
  • 添加可执行权限
    进入到scripts文件下,打开Terminal,执行 chmod +x *.py 对demo_pub_person_p.py文件添加可执行的权限
    在这里插入图片描述

  • 验证是否存在问题

    • 编辑配置文件
      修改 plumbing_pub_sub 功能包下的CMakeLists.txt,找到catkin_install_python,修改成如图所示:
      在这里插入图片描述

    • 按快捷键 ctrl + shift + B 编译

    • 开启一个Terminal,运行 roscore 命令;再开启一个新的Terminal,运行source ./devel/setup.bash rosrun plumbing_pub_sub demo_pub_person_p.py ;再开启一个Terminal,运行rostopic echo liaoTian,查看订阅数据
      在这里插入图片描述

订阅方(翠花)

  • 基本流程

    • 1.包含头文件
    • 2.初始化 ROS 节点:命名(唯一)
    • 3.实例化 订阅者 对象
    • 4.处理订阅的消息(回调函数)
    • 5.设置循环调用回调函数
  • 代码实现

    #! /usr/bin/env python3
    
    import rospy
    from std_msgs.msg import String
    
    
    """
    实现流程:
        1.导包 
        2.初始化 ROS 节点:命名(唯一)
        3.实例化 订阅者 对象
        4.处理订阅的消息(回调函数)
        5.设置循环调用回调函数
    """
    
    
    def doMsg(msg):
        rospy.loginfo("订阅到的数据是:%s", msg.data)
    
    if __name__ == "__main__":
        #2.初始化 ROS 节点:命名(唯一)
        rospy.init_node("cuiHua")
        #3.实例化 订阅者 对象
        sub = rospy.Subscriber("fang", String, doMsg, queue_size=10)
        #4.处理订阅的消息(回调函数)
        #5.设置循环调用回调函数
        rospy.spin()
    
  • 添加可执行权限
    进入到scripts文件下,打开Terminal,执行 chmod +x *.py 对demo_sub_person_p.py文件添加可执行的权限
    在这里插入图片描述

发布方、订阅方声明的话题必须一致,案例中的话题是 liaoTian

编辑配置文件

修改 plumbing_pub_sub 功能包下的CMakeLists.txt,找到同时复制一个catkin_install_python,修改成如图所示
在这里插入图片描述

编译并执行

  • 按快捷键 ctrl + shift + B 编译
    在这里插入图片描述

  • 执行代码

    • 1.启动 roscore;
      开启一个Terminal,启动 roscore
      在这里插入图片描述

    • 2.启动发布节点;
      开启一个新的Terminal

      cd topic_ws/
      source ./devel/setup.bash 
      rosrun plumbing_pub_sub demo_pub_person_p.py 
      

      在这里插入图片描述

    • 3.启动订阅节点。

      cd topic_ws/
      source ./devel/setup.bash 
      rosrun plumbing_pub_sub demo_sub_person_p.py 
      
      

      在这里插入图片描述

计算图查看Python话题机制节点

开启一个Terminal,运行 roscore 命令;再开启一个新的Terminal,运行source ./devel/setup.bash rosrun plumbing_pub_sub demo_pub_person_p.py ;再开启一个Terminal,运行rosrun plumbing_pub_sub demo_sub_person_p.py,查看订阅数据;再开启一个Terminal,运行 rqt_graph
在这里插入图片描述

计算图如图所示:
在这里插入图片描述

  • 29
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS中,话题(Topic)是一种用于节点之间通信机制。下面是一个简单的编程实现过程: 1. 安装ROS和创建ROS工作空间 首先,需要安装ROS并创建ROS工作空间。可以参考ROS官方文档进行安装和配置。 2. 创建ROS节点和话题 使用ROS命令行工具创建ROS节点和话题。例如,可以使用以下命令创建一个名为“my_node”的节点和一个名为“my_topic”的话题: ``` rosnode create my_node rostopic create my_topic std_msgs/String ``` 3. 编写ROS节点的发布程序 使用ROS编程库编写发布程序,将数据发布到话题上。例如,以下是一个简单的发布程序,它会发布一个字符串到“my_topic”话题上: ``` #include <ros/ros.h> #include <std_msgs/String.h> int main(int argc, char **argv) { ros::init(argc, argv, "my_publisher"); ros::NodeHandle nh; ros::Publisher pub = nh.advertise<std_msgs::String>("my_topic", 10); ros::Rate loop_rate(10); while (ros::ok()) { std_msgs::String msg; msg.data = "Hello, world!"; pub.publish(msg); loop_rate.sleep(); } return 0; } ``` 4. 编写ROS节点的订阅程序 使用ROS编程库编写订阅程序,从话题上接收数据。例如,以下是一个简单的订阅程序,它会从“my_topic”话题上接收字符串并打印出来: ``` #include <ros/ros.h> #include <std_msgs/String.h> void callback(const std_msgs::String::ConstPtr& msg) { ROS_INFO("I heard: [%s]", msg->data.c_str()); } int main(int argc, char **argv) { ros::init(argc, argv, "my_subscriber"); ros::NodeHandle nh; ros::Subscriber sub = nh.subscribe("my_topic", 10, callback); ros::spin(); return 0; } ``` 5. 运行ROS节点 使用ROS命令行工具运行ROS节点。例如,可以使用以下命令运行发布程序和订阅程序: ``` rosrun my_package my_publisher rosrun my_package my_subscriber ``` 这样,就完成了ROS话题通信的编程实现。当发布程序发布数据时,订阅程序会从话题上接收数据并进行处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值