创建ROS自定义消息和服务类型

  • Post author:
  • Post category:其他


1.创建msg

首先切换到功能包底下:

$cd catkin_ws/src/scan
$mkdir msg

在msg文件夹下创建 一个名为laserscan.msg的文件,输入如下内容:

Header header
float32 angle_min        # start angle of the scan [rad]
float32 angle_max        # end angle of the scan [rad]
float32 angle_increment  # angular distance between measurements [rad]
float32 time_increment   # time between measurements [seconds]
float32 scan_time        # time between scans [seconds]
float32 range_min        # minimum range value [m]
float32 range_max        # maximum range value [m]
float32[] ranges         # range data [m] (Note: values < range_min or > range_max should be discarded)
float32[] intensities    # intensity data [device-specific units]

接下来,还有关键的一步:我们要确保msg文件被转换成为C++,Python和其他语言的源代码:

查看package.xml, 确保它包含一下两条语句:

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

然后打开CMakeLists.txt文件,利用find_packag函数,增加对message_generation的依赖,这样就可以生成消息了:

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

同样,你需要确保你设置了运行依赖,这块儿要放在

generate_message()之后

catkin_package(
  CATKIN_DEPENDS 
  message_runtime 
  )

找到如下代码块:

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

去掉注释符号#,用你的.msg文件替代Message*.msg,就像下边这样:

add_message_files(
  FILES
  laserscan.msg
)

手动添加.msg文件后,我们要确保CMake知道在什么时候重新配置我们的project。 确保添加了如下代码:

generate_message(
DEPENDENCIES
std_msgs
)

现在,你可以编译工作空间生成自己的消息源代码了。

然后在工作空间的

devel/include/scan

文件夹下出现一个

laserscan.h

文件,这样就生成了自定义消息类型,就可在程序中include引用

以上就是你创建消息的所有步骤。下面通过

rosmsg show

命令,检查ROS是否能够识别消息。

使用方法:

rosmsg show [message type]

样例:

rosmsg show /scan/laserscan.msg

你将会看到:

[scan/laserscan]:
std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
float32 angle_min
float32 angle_max
float32 angle_increment
float32 time_increment
float32 scan_time
float32 range_min
float32 range_max
float32[] ranges
float32[] intensities

在上边的样例中,消息类型包含两部分:

  • scan — 消息所在的package

  • laserscan.msg — 消息名laserscan.

如果你忘记了消息所在的package,你也可以省略掉package名。输入:

rosmsg show laserscan

你将会看到:

[scan/laserscan]:
std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
float32 angle_min
float32 angle_max
float32 angle_increment
float32 time_increment
float32 scan_time
float32 range_min
float32 range_max
float32[] ranges
float32[] intensities

如果在程序中用的话应该这样:

scan::LaserScan msg;//scan是消息所在包的名字,laserscan为消息文件夹名字去掉.msg,msg为自定义的一个变量,然后
msg.header.stamp = ros::Time::now();
msg.header.frame_id = "laser_frame";
msg.angle_min = -1.57;
msg.angle_max = 1.57;

2.创建srv

在上面的包中创建srv文件夹,在srv文件夹下再创建

AddTwoInts.srv

文件,在文件中粘贴如下消息

#本srv文件是对两个整数求和,虚线前是输入量,后是返回量
int32 a
int32 b
---
int32 sum

下面就是修改

package.xml



CMakeLists.txt

两个文件,告诉ROS如何编译,以及编译什么

首先

package.xml

加上

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

再是

CMakeLists.txt

分别加上

catkin_package(
                CATKIN_DEPENDS message_runtime 
 )
find_package(catkin REQUIRED COMPONENTS 
    std_msgs 
    message_generation
)
add_service_files(DIRECTORY srv
		FILES
		AddTwoInts.srv
)
generate_messages(DEPENDENCIES 
                std_srvs 
)

然后编译,编译通过后查看服务类型

rossrv show package_name/srv_name

如果和你创建的相同,那么你就成功了。



版权声明:本文为qq_43176116原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。