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
如果和你创建的相同,那么你就成功了。