您的位置:首页 > 其它

ROS学习第四弹 (ROS编辑器及配置/ROS msg/srv 消息和服务)

2017-10-31 09:46 711 查看
一.ROS专用编辑器rosed的使用

1.1 rosed使用

rosed是rosbash的一部分,这个工具可以通过包名直接编辑包中的一个文件而不需要打印整个包的路径,使用格式:

rosed [package_name] [filename]

例:rosed roscpp Logger.msg

如果出现:



说明,vim没有安装,装一下:sudo apt-get install vim 即可使用,用这个工具需要有Vim基础

2.2 用tab键编辑一个包下的所有文件

rosed [package_name] <tab><tab>

连按两下TAB键可以列出所有的备选项

2.3 Editor

rosed 的默认编辑器是vim,我们可以自己设置自己喜欢的编辑器,设置为nano:

export EDITOR='nano -w'

设置为emacs:

export EDITOR='emacs -nw'

使用上面的设置只会在当前终端有效,永久更改:echo "export EDITOR='emacs -nw'" >> ~/.bashrc

可以用:echo $EDITOR来查看当前编辑器版本

三.创建一个ROS msg和srv

3.1 msg和srv介绍

msg:msg文件是简单的文本文件,描述了ROS message的变量(fields/数据)。msg的作用是让不同语言写的代码生成messages

srv:srv文件描述丽一个service的数据,由两个部分组成,请求部分和响应部分。

msg文件存储在包的msg目录下,srv文件存储在包的srv目录下。

msgs是简单的文本文件,每一行是一个变量类型和变量名,这些变量名可以是:

int8,int16,int32,int64

float32,float64

string

time,duration

othre msg files

variable-length array[] and fixed-length array[C]

在ROS中还有一种特殊的数据类型:Header.它包含的是一个时间戳和一个迪卡尔坐标信息,通常在一个msg的文件的头一行都有一个Header数据。

以下是一个msg文件的例子:(最后两行是msgs变量)

Header header

string child_frame_id

geometry_msgs/PoseWithCovariance pose

geometry_msgs/TwistWithCovariance twist

srv文件和msg文件类似,只是srv文件 有两个部分:request和reponse,两个部分用'---'分割,一个例子:

int64 A

int64 B

---

int64 sum
上例中,A和B是rquest,sum是reponse

3.2 msg

3.2.1 创建一个msg

在先前创建的包中定义一个新的msg:

cd ~/catkin_ws/src/beginner_tutorials

mkdir msg

echo "int64 num" > msg/Num.msg

这样就往msg包中写入了一个int64的变量,当然,也可以创建更多更复杂的 元素:

string first_name

string last_name

uint8 age

u
4000
int 32 score

然后需要确认msg文件已经被翻译成C++/Python或其他语言代码

需要做一些工作:

a.打开package.xml,添加如下两行:

<build_depend>message_generation</build_depend>

<run_depend>message_runtime</run_depend>

b.打开CMakeLists.txt。将message_generation依赖加入find_package中,这样运行你生成messages.find_package已经在CMakeLists.txt中,

那么只需要在find_package中加上message_generation即可:



有时不调用find_package中的所有依赖也能成功编译你的公程,但是这是因为catkin把所有的projects编译成一个find_package,而之前的包调用了

find_package,如果以前的包没调用,那么就可能导致编译失败。

c.同样是在CMakeList.txt中,将message_runtime依赖加入catkin_package中:



d.找到以下代码块,将注释符去掉:



并将其中的message改为所之前写的Message:



e.确认generate_message()已经被调用,找到代码块:



去掉注释:



此时也可以直接跳过第3.3,3.4进行第五节的联系。

3.3 使用rosmsg

使用rosmsg 的前提是已经创建了一个msg,使用格式:

$ rosmsg show [message type]

例:
rosmsg show beginner_tutorials/Num

(我在这个地方遇到了跳出找不到的情况,然后roscd找不到路径,原因是环境变量出错,

解决办法:export ROS_PACKAGE_PATH=~/catkin_ws/src:$ROS_PACKAGE_PATH,没遇到可以不用管)

如果你不确定这个msg的位置,可以使用:

rosmsg show Num

3.4 使用srv

3.4.1创建一个srv

roscd beginner_tutorials

mkdir srv

然后从另一个包里拷贝一个已经存在的srv文件,拷贝格式:roscp [package_name] [file_to_copy_path] [copy_path]

具体命令:

roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

此时,与创建msg的步骤相似,需要进行以下几步:

a.在CMakeList.txt中的find_package中添加message_generation之前创建msg时已经添加过,此处可以不再重复;

而需要修改代码块:

# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

去掉注释并替换为:

add_service_files(
FILES
AddTwoInts.srv
)


b.在package.xml中需要添加:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

需要注意的是,这与之前msg添加的是不一样的;

3.4.2 使用rossrv

格式:

rossrv show <service type>

例:
rossrv show beginner_tutorials/AddTwoInts

同样的,如果不确定包名,可以使用:
rossrv show AddTwoInts

此时,可以看见:

 AddTwoInts

[beginner_tutorials/AddTwoInts]:

int64 a

int64 b

---

int64 sum

[rospy_tutorials/AddTwoInts]:

int64 a

int64 b

---

int64 sum

3.5 msg和srv的通用使用步骤:

除非以前做过,否则必须先对CMakeList.txt做以下修改:

# generate_messages(
#   DEPENDENCIES
# #  std_msgs  # Or other packages containing msgs
# )

去掉注释,并且增加包含使用的msg所依赖的包,例如:

generate_messages(
DEPENDENCIES
std_msgs
)

然后我们可以在我们的包里新建msg和srv了:

# In your catkin workspace
$ roscd beginner_tutorials
$ cd ../..
$ catkin_make install
$ cd -

(在此时遇到一个run_depend的错误,解决方法参考:http://blog.csdn.net/zzmj_f/article/details/78417223)

之后,catkin_make会将相应的位置,文件在msg文件夹中编译出所支持语言的代码,分别是python,C++,lisp:

C++ message的头文件在:~/catkin_ws/devel/include/beginner_tutorials/.

Python 的脚本文件在:~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg.

lisp文件在:~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/.

相似的,srv文件也会产生响应的支持的代码在各自的目录下,C++头文件位置与msg文件一样,而python与lisp的文件和msg文件夹同级

可以自己找一下这些文件,打开看一下。

关于更加详细的msg的创建及语法,可查看:http://wiki.ros.org/action/show/msg?action=show&redirect=ROS%2FMessage_Description_Language

如果是用新的message比编译了一个C++节点节点,那么你还需要在你的节点和message间申明依赖,具体参照:http://docs.ros.org/latest/api/catkin/html/howto/format2/building_msgs.html

3.6 获取帮助

如果对于ROS命令还有不清楚的地方,可以使用 rosmsg -h的方法获取帮助:

rosmsg is a command-line tool for displaying information about ROS Message types.

Commands:

    rosmsg show    Show message description

    rosmsg info    Alias for rosmsg show

    rosmsg list    List all messages

    rosmsg md5    Display message md5sum

    rosmsg package    List messages in a package

    rosmsg packages    List packages that contain messages

Type rosmsg <command> -h for more detailed usage

3.7 复习

回顾一下这一章都讲了什么:

rospack = ros + pack(age):提供和ROS包相关的信息

roscd = ros + cd :将当前目录定位到ROS包的位置

rosls = ros + ls :列出ROS包的子文件

roscp = ros +cp : 从另一个ROS包中复制文件

rosmsg = ros + msg : 提供和相关的ROS message的定义

rossrv = ros + srv :提和相关的ROS service之间的定义

catkin_make: 编译一个ROS包,不过这个命令是在使用工作空间catkin时使用

对应在不使用catkin工作空间时,可以使用:rosmake = ros + make :编译一个ROS包

下一步学习用python或C++写发布和订阅(Publisher and Subscriber)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐