肛了一波四级,希望这次能过把- -# 不想收集8张4级准考证啊……
用处不知道是干嘛,主要可以直接编辑某个包里的文件。
1 rosed
1.1 介绍
使用方法如下
$ rosed [package_name] <tab>
举个例子,假设我们想要编辑roscpp包里的Logger.msg文件,通常需要cd到这个里面,然后再用vim打开。这样有时候很麻烦,这里可以直接调用下面的代码完成同样的功能
$ rosed roscpp Logger.msg
msg文件会再package的msg目录下。
用ROS自己的语言定义一个msg的格式,主要的数据类型有
int8, int16, int32, int64 (plus uint*)
float32, float64
string
time, duration
other msg files
variable-length array[] and fixed-length array[C]
wiki上说,还有一个消息类型是Header。
下面是一个msg文件的例子
Header header string child_frame_id geometry_msgs/PoseWithCovariance pose geometry_msgs/TwistWithCovariance twist大致就是定义了一个Header类型的变量header,一个string类型的变量,child_frame_id
以及貌似是自定义类的2个变量(怀疑是msg类型嵌套,类似于C++中class中套class?)
2.2 创建一个msg
首先进入我们之前创建的src的begin_tutorials文件夹。
这里应该包含launch,src等。现在我们创建一个msg文件夹。
然后在msg文件夹里创建一个文本,叫Num.msg
文本里只有一行为
int64 num
当然也可以写的复杂点,如wiki上给的
string first_name string last_name uint8 age uint32 score
实际上msg文件要被转化为C++或者python代码,这样可能就能做到跨语言跨平台之类方便的作用了把。
所以在package.xml里,要确保包含
<build_depend>message_generation</build_depend> <run_depend>message_runtime</run_depend>(一周过来,package.xml我都忘了是干嘛了- -#)
一般默认的package.xml里默认的是
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<run_depend>roscpp</run_depend>
<run_depend>rospy</run_depend>
<run_depend>std_msgs</run_depend>
并没有上面的message_generation和runtime。
具体这些是干嘛的,我还没彻底弄明白。
再看Cmakelist.txt,有一段代码是(下面排版出了点问题,请保存代码为html格式,然后打开即可正常阅读QAQ)
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs )
我们需要添加一项message_generation。也就是最后为
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation )
wiki上说,find_package不写,有时候不出问题。但是还是要写比较好。
还要设置运行依赖,找到并修改下面两处代码
catkin_package( ... CATKIN_DEPENDS message_runtime ... ...)add_message_files( FILES Num.msg )同时再文件末尾添加一行。
generate_messages()
2.3 检查刚刚做的成功没有
运行下面的代码
$ rosmsg show beginner_tutorials/Num这个很显然,就是打印beginner_tutorials这个package的Num.msg的消息。
当然直接rosmsg show Num也行。会显示现有的所有的Num的消息。
caleb@ubuntu:~/catkin_ws/src/beginner_tutorials$ rosmsg show Num [beginner_tutorials/Num]: int64 num
(等等!!我们对Cmakelist.txt做的操作呢???……就不检查了?)
3 服务srv
3.1 服务的介绍
srv文件分为请求和响应。我理解服务就是可调用的函数,请求就是输入的参数类型,相应为返回的参数类型
一个srv的官方wiki例子
int64 A int64 B --- int64 Sum
输入两个int64类型,输出一个int64类型。
3.2 创建一个srv
从这里,猜都能猜的出来,和创建msg方法基本一样。
去src目录下新建文件夹srv
再里面建的方法类似。
官方wiki给的。。让我们复制一个srv过来……
用roscp命令,
roscp [从这里] [的这个文件] [复制到这里]
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
当然, 打开这个srv文件,看到的代码如下int64 a int64 b --- int64 sum
显然,又需要去package.xml里找到东西来改一下。找到add_service_files,添加AddTwoInts.srv
为了确保srv文件也能被转化为C++或者python代码,我们需要在CmakeList.txt里的find_package里添加对message_generation的依赖。这里有很多细节,比如回车换行的问题。find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)
除了编译依赖外,找到add_service_files,添加
AddTwoInts.srv
类似的,可以用rossrv show命令来查看是否添加成功。(自动补全不智能了这里!)
4 添加srv和msg都需要的步骤
在CMakeList.txt里找到generate_message,添加依赖std_msg。(wiki说不需要添加对roscpp和rospy的依赖,多添加会出问题嘛?)
回到工作空间,也就是catkin工作最高层目录,执行catkin_make。
编译失败QAQ
他说generate_message()只能被调用一次,但是我貌似也就只调用了一次啊??这怎么回事。
看了wiki的英文原文……
好吧,根本不需要添加generate_message()...
对于早期ros版本需要添加这个,对于我们的indigo,并不需要。