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

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.xmlCMakeLists.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

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

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值