学习9:rosed命令的简单介绍 + 创建ROS消息和ROS服务。

肛了一波四级,希望这次能过把- -# 不想收集8张4级准考证啊……


用处不知道是干嘛,主要可以直接编辑某个包里的文件。


1 rosed

1.1 介绍

使用方法如下

$ rosed [package_name] <tab>

举个例子,假设我们想要编辑roscpp包里的Logger.msg文件,通常需要cd到这个里面,然后再用vim打开。这样有时候很麻烦,这里可以直接调用下面的代码完成同样的功能

$ rosed roscpp Logger.msg

2 消息msg
2.1 消息的介绍 

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,并不需要。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值