一.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
---
上例中,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
uint 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 Num3.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.youkuaiyun.com/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)