• ROS -话题通信示例


    写在最前

    由于毕设是做ros机器人相关的上位机,因此本专题是做毕设所有过程的记录
    学习资料参考内容如下:
    B站Autolabor初级教程教学
    Autolabor初级教程教学文档
    主要是想记录自己的踩过的所有坑,内容可能比较零散,想看比较系统完备的知识请去参考上面两个链接

    每个可视化操作对应于一个命令行

    2.1 新建工作区

    在这里插入图片描述

    mkdir -p 自定义空间名称/src

    2.2 点击debug按钮

    这一步相当于在src目录中运行catkin make命令
    在这里插入图片描述

    catkin_make

    2.3 新建ros包 添加环境

    在这里插入图片描述
    在这里插入图片描述

    catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs

    2.4 在包内部新建scripts文件夹

    在这里插入图片描述

    mkdir scripts

    2.5 创建发布者节点pub.py

    """
        需求: 实现基本的话题通信,一方发布数据,一方接收数据,
             实现的关键点:
             1.发送方
             2.接收方
             3.数据(此处为普通文本)
    
             PS: 二者需要设置相同的话题
    
    
        消息发布方:
            循环发布信息:HelloWorld 后缀数字编号
    
        实现流程:
            1.导包 
            2.初始化 ROS 节点:命名(唯一)
            3.实例化 发布者 对象
            4.组织被发布的数据,并编写逻辑发布数据
    
    
    """
    #1.导包 
    import rospy
    from std_msgs.msg import String
    
    if __name__ == "__main__":
        #2.初始化 ROS 节点:命名(唯一)
        rospy.init_node("talker_p")
        #3.实例化 发布者 对象
        pub = rospy.Publisher("chatter",String,queue_size=10)
        #4.组织被发布的数据,并编写逻辑发布数据
        msg = String()  #创建 msg 对象
        msg_front = "hello 你好"
        count = 0  #计数器 
        # 设置循环频率
        rate = rospy.Rate(1)
        while not rospy.is_shutdown():
    
            #拼接字符串
            msg.data = msg_front + str(count)
    
            pub.publish(msg)
            rate.sleep()
            rospy.loginfo("写出的数据:%s",msg.data)
            count += 1
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    2.6 创建订阅者节点sub.py

    
    #!/usr/bin/env python3
    """
        需求: 实现基本的话题通信,一方发布数据,一方接收数据,
             实现的关键点:
             1.发送方
             2.接收方
             3.数据(此处为普通文本)
    
    
        消息订阅方:
            订阅话题并打印接收到的消息
    
        实现流程:
            1.导包 
            2.初始化 ROS 节点:命名(唯一)
            3.实例化 订阅者 对象
            4.处理订阅的消息(回调函数)
            5.设置循环调用回调函数
    
    """
    #1.导包 
    import rospy
    from std_msgs.msg import String
    
    def doMsg(msg):
        rospy.loginfo("I heard:%s",msg.data)
    
    if __name__ == "__main__":
        #2.初始化 ROS 节点:命名(唯一)
        rospy.init_node("listener_p")
        #3.实例化 订阅者 对象
        sub = rospy.Subscriber("chatter",String,doMsg,queue_size=10)
        #4.处理订阅的消息(回调函数)
        #5.设置循环调用回调函数
        rospy.spin()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    2.7 用python3命令运行python节点

    在这里插入图片描述

    值得注意的是一般的视频教程会让你在/src/cmakelists文件里也要配置python解释器的环境,这样的话就可以在全局使用rosrun 包名 xxx.py来运行python节点,但是我们要知道的是python节点也可以直接当作一个python程序来运行,即可以用python3 xxx.py来运行

    2.8 利用rosrun命令运行python节点

    • 在cmakelist添加解释器信息

    在这里插入图片描述

    大概就在158行添加py文件的路径信息,注意这里可以直接填相对路径

    • 添加环境变量(这可以让你在任何命令窗口用rosrun运行这个包)
      在这里插入图片描述
    • rosrun运行节点

    rosurn 包名 xxx.py

    值得注意的是,由于我的ros系统是melodic1.14.3,所以rosrun 包名 xxx.py这个命令是默认用的python2,所以最好还是用python3 xxx.py这种方式来运行python节点

    2.9 查看节点计算图

    • 新打开一个命令行窗口输入rosrun rqt_graph rqt_graph,可以看到以下计算图

    在这里插入图片描述

  • 相关阅读:
    java-php-python-ssm郑工社团交流服务信息平台计算机毕业设计
    使用 Java 枚举和自定义数据类型
    [Django-1] 快速建立项目
    Linux三剑客:awk的基本用法
    详解差分进化算法:从基础到小生境(Niche)技术与多目标优化在Python的实现
    Windows10下Git2.37.1安装及配置完整版
    P4实验之防火墙
    技术应用:C# System.Data.DataTable().Compute 基本用法
    领航先锋案例!DevOps重塑研发运维体系,共筑XOps新蓝图
    linux☞container_of
  • 原文地址:https://blog.csdn.net/weixin_46187354/article/details/127784817