• 2.6 自定义srv python


    功能介绍

    以自定义数据类型为基础,完成一个节点作为服务器,另一个节点接收传送两个数字到服务端,服务端计算后反馈到客户端进行打印输出

    1、工作空间

    1.1 创建工作空间lee_ws

    mkdir -p ~/lee_ws/src
    cd ~/lee_ws/src/
    catkin_init_workspace 
    cd ~/lee_ws/
    catkin_make
    echo "source ~/lee_ws/devel/setup.bash" >> ~/.bashrc
    source devel/setup.bash 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.2 创建功能包lee_srv

    cd ~/lee_ws/src
    catkin_create_pkg lee_srv std_msgs rospy roscpp
    cd ~/lee_ws/
    catkin_make
    source ~/lee_ws/devel/setup.bash 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.3 创建srv文件

    路径: /home/lee/lee_ws/src/lee_srv/srv/AddTwoInts.srv

    int64 num1
    int64 num2
    ---
    int64 sum
    
    • 1
    • 2
    • 3
    • 4

    1.4 package.xml配置

    在package.xml最下面的build_dependexec_depend附近添加即可

    <build_depend>message_generationbuild_depend>
    <exec_depend>message_runtimeexec_depend>
    
    • 1
    • 2

    1.5 CMakeLists.txt配置

    在CMakeLists.txt中配置下面相应的代码

    # 需要加入 message_generation,必须有 std_msgs
    find_package(catkin REQUIRED COMPONENTS
      roscpp
      rospy
      std_msgs
      message_generation
    )
    
    # 配置 srv 源文件
    add_service_files(
      FILES
      AddTwoInts.srv
    )
    
    # 生成消息时依赖于 std_msgs
    generate_messages(
      DEPENDENCIES
      std_msgs
    )
    
    #执行时依赖
    catkin_package(
    #  INCLUDE_DIRS include
    #  LIBRARIES lee
      CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
    #  DEPENDS system_lib
    )
    
    • 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

    1.6 编译后的中间文件查看

    Python 需要调用的中间文件(…/工作空间/devel/lib/python3/dist-packages/包名/srv)
    
    • 1

    1.7 总结步骤1.3-1.5

    • 1.3建立的自定义srv文件
    • 需要通过1.4和1.5两个步骤的配置才能通过catkin_make对1.3的文件进行编译
    • 1.6为通过编译自定义文件生成的python、C++和js等头文件,用于相应编程代码的头文件调用

    1.8 VScode编辑ros参数配置

    快捷键 ctrl + shift + B 调用编译,选择:catkin_make:build这一行,点击小齿轮配置设置,修改.vscode/tasks.json 文件,将下面复制进去即可
    这么配置的原因:下一次快捷键 ctrl + shift + B直接进行代码编译
    路径: /home/lee/lee_ws/.vscode/tasks.json

    {
    	"version": "2.0.0",
    	"tasks": [
    		{
    			//代表提示的描述性信息
    			"label": "catkin_make:debug", 
    
    			//可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
    			"type": "shell",  
    
    			//这个是我们需要运行的命令
    			"command": "catkin_make",
    			
    			"args": [],
    		   
    			"group": {"kind":"build","isDefault":true},
    			
    			//可选always或者silence,代表是否输出信息			
    			"presentation": {"reveal": "always"},
    			
    			"problemMatcher": "$msCompile"
    		}
    	]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    1.9 vscode 头文件配置

    为了方便代码提示以及避免误抛异常,需要先配置 vscode,将1.3-1.5生成的 head 中间文件路径配置进 c_cpp_properties.json 的 includepath属性,如果不配置vscode会报错代码,但是编译不受影响
    路径: /home/lee/lee_ws/.vscode/c_cpp_properties.json

    {
        "configurations": [
            {
                "browse": {
                    "databaseFilename": "",
                    "limitSymbolsToIncludedHeaders": true
                },
                "includePath": [
                    "/opt/ros/noetic/include/**",
                    "/home/lee/catkin_ws/src/lee/include/**",
                    "/usr/include/**",
                    "/home/lee/catkin_ws/devel/include/**" //配置 head 文件的路径 
                ],
                "name": "ROS",
                "intelliSenseMode": "gcc-x64",
                "compilerPath": "/usr/bin/gcc",
                "cStandard": "c11",
                "cppStandard": "c++17"
            }
        ],
        "version": 4
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    2、服务端代码 Python

    路径: /home/lee/lee_ws/src/lee_srv/scripts/lee_srv_add_server.py

    2.1 代码部分

    #! /usr/bin/env python
    # coding=utf-8
    
    import rospy
    from lee_srv.srv import AddTwoInts,AddTwoIntsRequest,AddTwoIntsResponse
    
    #接收到数据请求后,进入回调函数
    def chatterCallback(req):
    
        # 解析提交的数据
        sum = req.num1 + req.num2
        rospy.loginfo("提交的数据:num1 = %d, num2 = %d, sum = %d",req.num1, req.num2, sum)
    
        # 创建响应对象,赋值并返回
        # resp = AddIntsResponse()
        # resp.sum = sum
        resp = AddTwoIntsResponse(sum)
        return resp
    
    if __name__ == "__main__":
       
        #初始化 ROS 节点:命名(唯一)
        rospy.init_node("lee_srv_add_server")
    
        #创建一个Service,服务名为chatter_srv的topic,注册回调函数为chatterCallback
        server = rospy.Service("chatter_srv",AddTwoInts,chatterCallback)
    
        #设置循环调用回调函数
        rospy.loginfo("服务已经启动....")
        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

    2.2 CMakeLists.txt部分

    在install下面直接添加如下代码即可

    catkin_install_python(PROGRAMS scripts/lee_srv_add_server.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
    
    • 1

    3、客户端代码 Python

    路径: /home/lee/lee_ws/src/lee_srv/src/lee_srv_add_client.cpp

    3.1 代码部分

    #! /usr/bin/env python
    # coding=utf-8
    
    import rospy
    from lee_srv.srv import AddTwoInts,AddTwoIntsRequest,AddTwoIntsResponse
    import sys
    
    if __name__ == "__main__":
        #优化实现
        #if len(sys.argv) != 3  如果通过 launch 的 args 传参,需要传递的参数个数 3
        #if len(sys.argv) != 5  传参(0-文件路径 1传入的参数 2传入的参数 3节点名称 4日志路径)
        if len(sys.argv) != 3:
            rospy.logerr("请正确提交参数,需要两个数字")
            sys.exit(1)
    
        #初始化 ROS 节点:命名(唯一)
        rospy.init_node("lee_srv_add_client")
    
        #创建一个ServiceProxy,订阅名为chatter_srv的topic
        client = rospy.ServiceProxy("chatter_srv",AddTwoInts)
    
        # 请求前,等待服务已经就绪,如服务器没启动则一直在此等待
        client.wait_for_service()
    
        #整理请求的数据
        req = AddTwoIntsRequest()
        # req.num1 = 100
        # req.num2 = 200 
        #优化
        req.num1 = int(sys.argv[1])
        req.num2 = int(sys.argv[2]) 
    
        #发送请求,并接收并打印显示
        resp = client.call(req)
        rospy.loginfo("响应结果:%d",resp.sum)
    
    • 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

    3.2 CMakeLists.txt部分

    在install下面直接添加如下代码即可

    catkin_install_python(PROGRAMS scripts/lee_srv_add_client.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
    
    • 1

    4、代码测试

    4.1 启动rosmaster

    roscore
    
    • 1

    4.2 启动 lee_srv_add_server 节点

    rosrun lee_srv lee_srv_add_server.py
    
    • 1

    4.3 启动 lee_srv_add_client 节点,并带参数

    rosrun lee_srv lee_srv_add_client.py 1 2
    
    • 1

    5、结果

    在这里插入图片描述

  • 相关阅读:
    INSERT ... ON DUPLICATE KEY UPDATE
    Python运维监控系统之架构设计
    初始HTML
    万邦抖音获取douyin分享口令url API
    什么是离岸金融 (OFFSHORE FINANCE)
    计算机系统的层次结构
    no permission 这种问题的解决方法
    【TES720D】基于复旦微的FMQL20S400全国产化ARM核心模块
    【FPGA教程案例29】基于FPGA的DDS直接数字频率合成器之二——Verilog开发
    在T3开发板上实现SylixOS最小系统(二)
  • 原文地址:https://blog.csdn.net/weixin_44692299/article/details/127871905