11_创建ROS msg和srv文件

本教程介绍了如何创建msg和srv文件,以及rosmsg,rossrv,roscp等命令行工具。至于为什么选择deepin而不是ROS通用的ubuntu,也仅仅是为了支持国产系统。鉴于本人水平有限,如哪位攻城狮网友发现本文存在的问题,烦请留言指正,谢谢!

msg和srv文件介绍

  • msg:msg是用于描述ROS消息的简单文本文件。它们是用于生成不同语言的源代码
  • srv:srv文件用于描述ROS service。它由两部分组成request和response.

msg文件存储在包的msg目录中,srv文件存储在srv目录中。
msg文件只是每行带有字段类型和字段名称的简单文本文件,你可以使用的字段类型有:

  • int8,int16,int32,int64(uint*)
  • float32,float64
  • string
  • time,duration
  • 其他msg文件
  • 变长数组array[],固定长数组array[c]

在ROS中还有一种特殊的类型:Header.Header通常包括ROS中常用的时间戳和坐标帧信息。您经常会看到在msg文件中的第一行有Header.下面是一个包含Header,string,以及另外两个msg的示例

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

srv文件除了包含request和response两部分外其他与msg基本一致,这两部分使用—进行拆分。下面是一个srv文件的例子

int64 A
int64 B
---
int64 Sum

在上面的例子中A,B是request,Sum是response.

使用msg文件

创建msg

让我在之前创建的beginner_tutorials包中创建msg文件

roscd beginner_tutorials
mkdir msg
echo "int64 num" >> msg/Num.msg

上面的示例中Num.msg文件只包含一行。你可以通过添加多个元素来实现一个更为复杂的msg文件。

string first_name
string last_name
uint8 age
uint32 score

不过还有一步,我们需要确保msg文件可以被转换为C++,python和其他语言的源代码。打开package.xml文件,添加如下两行,并确保这两行没被注释掉:

  <build_depend>message_generationbuild_depend>
  <exec_depend>message_runtimeexec_depend>

注意,在构建时,我们需要message_generation,在运行时需要message_runtime.使用你喜欢的编辑器,打开CMakeList.txt.将message_generation依赖添加到已经存在的CMakeList.txt的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
)

你可能注意到,有时候即使你没有为所有的依赖项使用find_package,你的项目也能正常构建。这是因为catkin将您的项目合成为一个,所以如果之前的项目调用find_package,你的项目会配置相同的值。要养成在项目中添加构建依赖的习惯。
另外要确保导出了消息运行依赖

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

然后需要在CMakeList.txt中添加msg文件

add_message_files(
  FILES
  Num.msg
)

通过手动添加.msg文件,我们可以确保CMake在添加其他msg文件后知道何时需要重新配置项目。现在我们需要确保调用generate_message()函数


 generate_messages(
   DEPENDENCIES
   std_msgs
 )

rosmsg

# 用法
rosmsg show [message type]
# 示例
# 前提你已经catkin_make过,并source对应的setup.bash
rosmsg show beginner_tutorials/Num 
int64 num

上面所述的message type包含:包名 和msg文件名。当然如果你记不清对应的msg属于哪个包。
也可以调用

rosmsg show Num 
[beginner_tutorials/Num]:
int64 num

使用srv文件

创建srv

同样切换到beginner_tutorials包目录,然后创建srv目录

roscd beginner_tutorials
mkdir srv

在手动创建一个srv文件之前我们可以使用roscp从其他ROS包复制一个srv文件

# 语法
roscp [package_name] [file_to_copy_path(src)] [copy_Path(dst)]
# 示例
roscp rospy_tutrials AddTwoInts.srv srv/AddTwoInts.srv

另外还有一步,我们需要确认srv文件能转成C++或python源码或其他语言。除非你已经做过了,否则
打开package.xml,增加如下两行

  <build_depend>message_generationbuild_depend>
  <exec_depend>message_runtimeexec_depend>

和使用msg保持一致,我们需要在运行时需要message_runtime,构建时需要message_generation.
需要按照如下修改CMakeList.txt.需要注意message_generation可用于srv和msg文件。

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation 
)
# 另外需要增加srv文件
add_service_files(
  FILES
  AddTwoInts.srv
)

使用rosrv

rosrv可用于查看srv的具体内容

# 语法
rossrv show <service type>
# 示例
rossrv  show beginner_tutorials/AddTwoInts 
int64 a
int64 b
---
int64 sum
# 与rosmsg类似如果记不清包名,可以不加
 rossrv  show AddTwoInts
[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

msg和srv文件常见步骤

  • 修改CMakeList.txt.去掉generate_messages的注释,并添加任何你依赖的包含消息使用的.msg文件的包(在本例中是std_msgs):
  • 并在此追加你需要的任何msg文件
generate_messages(
  DEPENDENCIES
  std_msgs
  beginner_tutorials
)
# 修改CMakeList.txt后即可构建此包
roscd beginner_tutorials
cd ../../
catkin_make
# 或者
catkin build

包的msg目录下的任何.msg文件都将生成用于所有所支持语言的代码。C++语言的头文件生成在
devel/include/beginner_tutorials/*,h Python脚本存放在devel/lib/python3/dist-packages/beginner_tutorials/msg/。相应的srv文件也会在对应的位置生成对应的头文件,或者python脚本。
消息格式完整规范
如果你正在构建使用新消息的C++节点,你还需要声明节点和消息之间的依赖关系

帮助

rosmsg -h
rosmsg is a command-line tool for displaying information about ROS Message types.

Commands:
        rosmsg show     Show message description
        rosmsg info     Alias for rosmsg show
        rosmsg list     List all messages
        rosmsg md5      Display message md5sum
        rosmsg package  List messages in a package
        rosmsg packages List packages that contain messages

 rossrv -h
rossrv is a command-line tool for displaying information about ROS Service types.

Commands:
        rossrv show     Show service description
        rossrv info     Alias for rossrv show
        rossrv list     List all services
        rossrv md5      Display service md5sum
        rossrv package  List services in a package
        rossrv packages List packages that contain services

Type rossrv <command> -h for more detailed usage


你可能感兴趣的:(ROS1-基础学习,ubuntu,linux,运维)