• 建立一个ROS msg and srv


    msg是一个描述ROS消息字段的简单的文本文件,它们经常用来为消息产生不同语言的源代码。

    srv文件描述一个服务,它由请求和响应两部分组成。

    msg文件被存储在一个包的msg目录下,srv文件被存储在srv目录下。msg是简单的文本文件,它的每一行由一个字段的类型字段的名称组成。

    你可以使用的字段的类型有:

    int8, int16, int32, int64 (plus uint*)
    float32, float64
    string
    time, duration
    other msg files
    variable-length array[] and fixed-length array[C]

    ROS中还有一个特殊的类型Header,header包括了一个时间戳和一个经常在ROS中使用的坐标框架信息。你经常会看到在msg文件的第一行代码是:

    Header header

    下面是一个使用了Header的msg的例子:

      Header header
      string child_frame_id
      geometry_msgs/PoseWithCovariance pose
      geometry_msgs/TwistWithCovariance twist

    srv文件和msg文件是一样的,除了它们包括两部分:请求和响应,这两部分通过'---'分隔。下面是一个srv文件的例子:

    int64 A
    int64 B
    ---
    int64 Sum

    在上面的例子中A和B是请求,sum是响应。


    接下来我们在之前定义的包中定义一个新的消息

    $ cd ~/catkin_ws/src/beginner_tutorials
    $ mkdir msg
    $ echo "int64 num" > msg/Num.msg

    当然我们能够增加多一些信息到这个消息文件中:

    string first_name
    string last_name
    uint8 age
    uint32 score

    然后确保我们的消息文件能够转换成C++的源代码。需要做的是:

    (1)打开package.xml,确保小面的两行在其中:

    <build_depend>message_generation</build_depend>
     <run_depend>message_runtime</run_depend>

    在构建的时候,我们需要“message_generation”在运行时我们需要”message_runtime”。

    (2)打开CMakeLists.txt,可以使用我们前面学的rosed命令:

    rosed beginner_tutorials CMakeLists.txt

    添加message_generation依赖到find_package中,这样就能产生消息.

    # Do not just add this to your CMakeLists.txt, modify the existing text to add message_generation before the closing parenthesis
    find_package(catkin REQUIRED COMPONENTS
       roscpp
       rospy
       std_msgs
       message_generation
    )

    添加CATKIN_DEPENDS message_runtime,如下:

    catkin_package(
      ...
      CATKIN_DEPENDS message_runtime ...
      ...)

    找到下面的代码片:

    # add_message_files(
    #   FILES
    #   Message1.msg
    #   Message2.msg
    # )

    把它修改为:

    add_message_files(
      FILES
      Num.msg
    )

    手动的加入这个.msg文件,我们就能让CMake知道什么时候需要重新配置我们的工程。

    接下来我们必须确保generate_messages()函数被调用,我们要打开下面的代码:

    generate_messages(
      DEPENDENCIES
      std_msgs
    )

    接下来我们就能从我们的消息定义中产生源码文件了。


    不着急生产源码文件,先学习一些其他的命令,我们利用命令行工具rosmsg show来查看消息的详细信息:

    $ rosmsg show [message type]

    举个例子:

    $ rosmsg show beginner_tutorials/Num

    返回结果:

    int64 num

    这里我们看到一个消息的类型包括两个部分:

    beginner_tutorials -- 消息被定义的包的名字

    Num -- 消息Num的名字

    当然如果你忘记了消息在哪个包里面了,也可以不用包的名字:

    $ rosmsg show Num

    它会显示出你的包的类型和详细信息。

    [beginner_tutorials/Num]:
    int64 num

    看完了消息,我们再来看一下服务的相关内容:

    创建一个srv的目录:

    $ roscd beginner_tutorials
    $ mkdir srv

    我们这里从其他的工程中拷贝一个srv的定义。roscp这个命令行工具可以帮助我们从一个工程中拷贝文件到另一个工程中。

    $ roscp [package_name] [file_to_copy_path] [copy_path]

    接下来我们从rospy_tutorials这个包中拷贝一个服务。

    $ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

    roscp会在rospy_tutorials这个包中搜索AddTwoInts.srv文件。然后拷贝到指定的路径中去。

    与前面的消息类似,服务文件也需要确保能够转换为C++或者其他语言的源代码。

    (1)打开package.xml,确保小面的两行在其中:

    <build_depend>message_generation</build_depend>
      <run_depend>message_runtime</run_depend>

    (2)打开CMakeLists.txt文件:

    添加message_generation依赖到find_package中,其实前面我们已经配置过了,不管message_generation这个东东的名字怎样,它对msg和srv都起到作用。

    add_service_files()修改成:

    add_service_files(
      FILES
      AddTwoInts.srv
    )

    这样我们就能够从我们定义的服务中产生源码文件了。


    下面还是先来看一下有关服务的一些命令行工具,如rossrv show命令行:

    $ rossrv show <service type>

    例如:

    $ rossrv show beginner_tutorials/AddTwoInts

    得到结果:

    int64 a
    int64 b
    ---
    int64 sum

    和rosmsg show 一样,如果忘记了包的名字,可以直接show服务的名字:

    $ rossrv show AddTwoInts
    [beginner_tutorials/AddTwoInts]:
    int64 a
    int64 b
    ---
    int64 sum
    
    [rospy_tutorials/AddTwoInts]:
    int64 a
    int64 b
    ---
    int64 sum

    会自动给出srv的类型和详细的信息。



    上面的所有的文件的配置都设置好了,接下来我们看一下如何将上述的文件生成为ros支持的语言代码,打开CMakeLists.txt:

    首先在CMakeLists.txt文件中找到下面的代码:

    # generate_messages(
    #   DEPENDENCIES
    # #  std_msgs  # Or other packages containing msgs
    # )

    对这段代码取消注释,如果用到了一些.msg的文件,那么就把包含这些文件的包增加为依赖。

    generate_messages(
      DEPENDENCIES
      std_msgs
    )

    现在我们增加了一些新的信息,然后就需要重新编译这些包:

    # In your catkin workspace
    $ cd ../..
    $ catkin_make
    $ cd –        //回到之前的目录

    所有在msg目录下的.msg文件都会产生ros所支持的语言的源文件。

    C++信息的头文件产生在:

    catkin_ws/devel/include/beginner_tutorials/

    Python脚本产生在:

    catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg

    lisp文件产生在:

    catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/

    到现在为止,我们完成了消息和服务的一些任务,最后说一些有关于命令的东西,这些命令都有帮助的提示。

    例如:

    $ rosmsg -h

    或者:

    rosmsg show -h
  • 相关阅读:
    停滞的代码
    民兵葛二蛋大结局
    该开始BS了
    今天写出了第一个.NetBS应用
    读源码,仿照
    MVN,老天怎么回事?
    从哪里入手
    学习Java了
    工厂方法模式与简单工厂
    转:悟透JavaScript
  • 原文地址:https://www.cnblogs.com/stemon/p/4191651.html
Copyright © 2020-2023  润新知