教程描述: 本教程将展示如何使用ROS消息描述语言来定义你自己的消息类型.
教程难度: 中级
下节预告: 在Pyhon中使用C++类
自定义一个消息类型很简单,只要将.msg文件放到一个package的msg文件夹下即可。请参考初级教程中的创建.msg文件(不要忘记选择相应的编译构建系统)。
消息类型都被归属到与功能包相对应的域名空间下,例如:
#include
std_msgs::String msg;
from std_msgs.msg import String
msg = String()
如果你要使用在其他功能包里定义的消息类型,不要忘记添加以下语句:
<build_depend>name_of_package_containing_custom_msgbuild_depend>
<run_depend>name_of_package_containing_custom_msgrun_depend>
<build_depend>message_generationbuild_depend>
<run_depend>message_runtimerun_depend>
到package.xml。同时需要修改CMakeList.txt:
find_package(message_generation)
catkin_package(CATKIN_DEPENDS message_runtime)
add_message_files(FILES your_msg_file.msg)
教程ROSNodeTutorialC++和ROSNodeTutorialPython展示了使用自定义消息类型来创建talker和listener的C++和Python实现。
官网还有3个教程,分别如下:
在python中使用C++类
本教程阐述一种在python中使用C++类的方法。链接如下:中文 英文
将ROS项目进行打包
本教程介绍如何快速打包和部署ROS项目。链接如下:英文
如何编写教程
本教程介绍在编辑ros.org维基时,可以用到的模板和宏定义,并附有示例以供参考。链接如下:中文 英文
以上内容可以查阅对应资料进行自主学习,至此关于ROS机器人操作系统的基础概念部分(包括安装、配置、初级和中级)就全部结束了。稍后课程将针对功能包、接口和库的学习与使用进行介绍,以专题设计为主线展开。
目录
ROS是一个庞大的系统,许多人共同开发。为了进行合理地管理,我们已经写好了开发指导说明。请按照下面的指导说明,合理布局你的代码。
参考:
支持使用Git、Mercurial、Subversion 和Bazaar进行代码管理。由于ROS社区是分散的,欢迎你将代码托管到任何公共访问的地方(比如GitHub、 Bitbucket、Google Code). 主要的ROS基础代码会被发布到github.com的几个组织单元several organization units下面。关于建议的仓库使用说明参考RecommendedRepositoryUsage
针对每一个功能包,利用单独的bug tracker,实现bug报告,增强请求,和任务分配。经常性的,在本站的页面上,你会看的一些具体的bug tracker的相关链接。
对于代码的托管GitHub作为一个仓库的通用的bug tracker。
代码维护者将会为每个报告的问题创建一个里程式标记(milestone)。当问题被定位时,可以给报告者一个合适的反馈。这些里程标记就是ROS正式版(比如 Groovy or Hydro) 或者细分版本(比如 Hydro beta 1). 更多的是,当问题没被修复时,会赋以标记untargeted。这可能是由于开发者的时间紧迫或者可靠性的考虑。
为了让用户表达自己的想法,针对已发布的软件版本,测试是否已经修复bug,维护者应该要么,在关闭问题报告的时候,发布一个尝试版本,要么为每一个更细化的版本设置标记,在下个里程标记之前,标记问题报告。这样一来,对用户来说,让所包含的问题本身来决定发布版的bug是否已经被修复。
当你发现一个bug时,开启一个指派(ticket)。当你需要新功能的时候,打开一个指派。邮件或者发布到answers.ros.org或者邮件列表都有可能被遗忘。但是,指派的方式反而就不会那么容易忘记。
指派的时候尽量遵循这些原则.
尽量包含bug重现时,需要的指令。They should include instructions for reproducing the bug.
尽量描述问题出现时的,系统运行状态。(用的什么系统版本,涉及的功能包有哪些。
不要畏惧指派。许多开发者都会指派给他们自己,比如利用Trac。
如果你不确定出现问题时涉及的的功能包或者问题确实是一个bug,请首先访问answers.ros.org。
package功能包由代码组织而成,而功能包组成一个单独的仓库responsitory。功能包是作为代码构建的基本单位。
尤其注意!建议,在GitHub上,在仓库的根目录创建一个README.md,用来向用户说明代码仓库的具体细节。建议,在ROS wiki页面设置链接到指定的包含的软件包。参照 this article 获取更多的帮助.
ROS功能包和系统的构建依赖于manifest.xml。
每一个功能包都必须,在功能包所在的顶层目录,存在一个manifest.xml文件.
最基本的,manifest必须包含下面的三部分:
下面举一个roscpp节点的一个模板例子:
<package>
<description brief="BRIEF DESCRIPTION">
LONGER DESCRIPTION
description>
<author>You/[email protected]author>
<license>BSDlicense>
<url>http://www.ros.org/wiki/YOURPACKAGEurl>
<depend package="roscpp"/>
package>
下面是rospy的一个例子:
<package>
<description brief="BRIEF DESCRIPTION">
LONGER DESCRIPTION
description>
<author>You/[email protected]author>
<license>BSDlicense>
<url>http://www.ros.org/wiki/YOURPACKAGEurl>
<depend package="rospy"/>
package>
我们已经移植了所有最新的GUI到rqt,这些GUI都是QT基础的GUI框架。在fuerte使用wxWidgets之前,因交叉编译的兼容性太差,大部分已有的代码被重建。 因此对于新的GUI设计,考虑使用rqt。开发说明从这里获取(including license consideration when writing in python)。
基本的代码编译工具是CMake(more)。
每一个创建的功能包的顶层目录都必须存在CMakeLists.txt。
现在,每一个功能包都必须有一个Makefile, 短而精巧。那些没有经过构建步骤的功能包不需要任何的构建文件。
ROS是开源的,旨在让来自五湖四海的不同的用户和开发者们,从学生到企业家们,都可以得到帮助获取支持。
遵循Berne Convention版权,作为作者自动拥有版权,而不管有没有一个正式的声明。无论如何,显式的版权声明有助于长期性项目的管理。
ROS里的调试工具,包括但不限于:
一般性建议:
(gdb) run arg1 arg2 arg3
当程序崩溃crashes时,利用gdb的bt指令来进行追溯和探究。
valgrind -v foo arg1 arg2 arg3
Valgrind可以追踪所有的内存访问呢,一把可以找到问题的原因。同样,可以发现你没有发现的其他问题。注意的就是,Valgrind会拖慢你程序运行的节奏,看起运行缓慢。
我们进行两个级别的测试:
如果你在ROS系统下,开发ros-pkg 或者wg-ros-pkg,安装build farm 启动测试构代码搭建和自动测试在不同的芯片体系下。如果在你提交后,搭建或者测试停止工作,你应该获得一封邮件来告知相关的错误,希望来修复它。参考AutomatedTesting指导说明。
所有的代码都应该参照 QAProcess。进行文档汇总。包括:
ROS社区代码的发布流程参考release页面
在代码应该用到ROS的服务的地方,遵循以下规则
一旦有人使用的你的代码,你就有责任不要对他们所谓的对代码大幅改动,进行釜底抽薪。相反的,使用deprecation,意味着,对于它的移除用清单的形式,标记指定的特性或者内容不再支持。给用户些时间去适应,作为一个发布版的过程循环,就和移除一样。
弃用发生在多级情况下,包括:
大文件(大小超过1MB)经常不属于*-ros-pkg仓库代码,尤其是他们一般仅仅用在单元测试时。不管某些人是否构建了你的功能包,大的文件会影响checkout的仓库的时间和效率。
大的数据文件应该被托管到公共的web主网页。在web服务器上,你也可以仅仅放置你所需要的文件。文件的托管可以在download.ros.org。请联系[email protected] 获取更多信息。在你打开上传请求之前,鼓励你去查找是否已存在你所需要的文件。
下载文件,请使用catkin_download_test_data。 如果,你在更早的rosbuild时候,使用 rosbuild_download_test_data(URL MD5SUM) 宏定义。比如:
catkin_download_test_data(
${PROJECT_NAME}_saloon.bag
http://downloads.foo.com/bags/saloon.bag
DESTINATION ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_SHARE_DESTINATION}/test
MD5 01603ce158575da859b8afff5b676bf9)
rosbuild_download_test_data(http://code.ros.org/svn/data/robot_pose_ekf/zero_covariance.bag test/zero_covariance.bag 0a51b4f5001f446e8466bf7cc946fb86)