3.用户功能包
~/catkin_ws/src 是用户源代码的空间。
组成:
/include 头文件
/launch 用于roslaunch的启动文件
/node 用于rospy的脚本
/msg 消息文件
/src 源代码文件
/srv 服务文件
CMakeLists.txt 构建配置文件
package.xml 功能包配置文件
ROS的构建系统默认使用CMaKe。
在ROS中,CMaKe被修改为适合于ROS的“catkin”构建系统。
catkin_create_pkg [功能包名称] [依赖功能包1] [依赖功能包2]
ROS中的功能包名称全部是小写字母,不能包含空格。格式规则是将每个单词用下划线(_)而不是短划线( - )连接起来。
cd ~/catkin_ws/src
catkin_create_pkg my_first_ros_pkg std_msgs roscpp
cd my_first_ros_pkg
ls
实践
下面是对每个语句的说明。
■ <?xml> 这是一个定义文档语法的语句,随后的内容表明在遵循xml版本1.0。
■ 从这个语句到最后的部分是ROS功能包的配置部分。
■ 功能包的名称。使用创建功能包时输入的功能包名称。正如其他选项,用户可以随时更改。
■ 功能包的版本。可以自由指定。
■ 功能包的简要说明。通常用两到三句话描述。
■ 提供功能包管理者的姓名和电子邮件地址。
■ 记录版权许可证。写BSD、MIT、Apache、GPLv3或LGPLv3即可。
■ 记录描述功能包的说明,如网页、错误管理、存储库的地址等。根据功能包的类型,用户可以填写网站、错误跟踪(bugtracker)或存储库的地址。
■ 记录参与功能包开发的开发人员的姓名和电子邮件地址。如果涉及多位开发人员,只需在下一行添加标签。
■ <buildtool_depend> 描述构建系统的依赖关系。我们正在使用catkin 构建系统,因此输入catkin。
■ <build_depend> 在编写功能包时写下您所依赖的功能包的名称。
■ <run_depend> 填写运行功能包时依赖的功能包的名称。
■ <test_depend> 填写测试功能包时依赖的功能包名称。
■ 在使用ROS中未指定的标签名称时会用到。最广泛使用的情况是功能包的情况,这时用 格式表明是元能包。
■ 在export标签中使用的官方标签声明,当前功能包为一个元功能包时声明它
修改功能包配置文件(package.xml):
<? xml version = "1 . 0" ?>
< package >
< name > my _ first _ ros _ pkg </ name >
< version > 0 . 0 . 1 </ version >
< description > The my _ first _ ros _ pkg package </ description >
< license > Apache License 2 . 0 </ license >
< author email = "pyo @ robotis . com" > Yoonseok Pyo </ author >
< maintainer email = "pyo @ robotis . com" > Yoonseok Pyo </ maintainer >
< url type = "bugtracker" > https :// github . com / ROBOTIS - GIT / ros _ turtorials / issues </ url >
< url type = "repository" > https :// github . com / ROBOTIS - GIT / ros _ turtorials . git </ url >
< url type = "website" > http :// www . robotis . com </ url >
< buildtool _ depend > catkin </ buildtool _ depend >
< build _ depend > std _ msgs </ build _ depend >
< build _ depend > roscpp </ build _ depend >
< run _ depend > std _ msgs </ run _ depend >
< run _ depend > roscpp </ run _ depend >
< export ></ export >
</package>
此处简单对照了一下,并未修改,结果目前无影响
ROS的构建系统catkin基本上使用CMake,并在功能包目录中的CMakeLists.txt文件中描述构建环境。
构建配置文件(CMakeLists.txt)中的每一项如下所示。第一条是操作系统中安装的cmake的最低版本。由于它目前被指定为版本2.8.3,所以如果使用低于此版本的cmake,则必须更新版本。
cmake _ minimum _ required ( VERSION 2 . 8 . 3 )
project项是功能包的名称。只需使用用户在package.xml中输入的功能包名即可。请注意,如果功能包名称与package.xml中的标记中描述的功能包名称不同,则在构建时会发生错误,因此需要注意。
project ( my _ first _ ros _ pkg )
find_package项是进行构建所需的组件包。目前,roscpp和std_msgs被添加为依赖包。如果此处没有输入功能包名称,则在构建时会向用户报错。换句话说,这是让用户先创建依赖包的选项。
find _ package ( catkin REQUIRED COMPONENTS
roscpp
std _ msgs
)
以下是使用ROS以外的功能包时使用的方法。例如,使用Boost时,必须安装system功能包。功能如前面的说明,是让用户先创建依赖功能包的选项。
find _ package ( Boost REQUIRED COMPONENTS system )
catkin_python_setup( )选项是在使用Python,也就是使用rospy时的配置选项。其功能是调用Python安装过程setup.py。
catkin _ python _ setup ()
add_message_files是添加消息文件的选项。FILES将引用当前功能包目录的msg目录中的*.msg文件,自动生成一个头文件(*.h)。在这个例子中,我们将使用消息文件Message1.msg和Message2.msg。
add _ message _ files (
FILES
Message1 . msg
Message2 . msg
)
add_service_files是添加要使用的服务文件的选项。使用FILES会引用功能包目录中的srv目录中的*.srv文件。在这个例子中,用户可以选择使用服务文件Service1.srv和Service2.srv。
add _ service _ files (
FILES
Service1 . srv
Service2 . srv
)
generate_messages是设置依赖的消息的选项。此示例是将DEPENDENCIES选项设置为使用std_msgs消息包。
generate _ messages (
DEPENDENCIES
std _ msgs
)
generate_dynamic_reconfigure_options是使用dynamic_reconfigure时加载要引用的配置文件的设置。
generate _ dynamic _ reconfigure _ options (
cfg / DynReconf1 . cfg
cfg / DynReconf2 . cfg
)
以下是catkin 构建选项。INCLUDE_DIRS表示将使用INCLUDE_DIRS后面的内部
目录include的头文件。LIBRARIES表示将使用随后而来的功能包的库。
CATKIN_DEPENDS后面指定如roscpp或std_msgs等依赖包。目前的设置是表示依赖于roscpp和std_msgs。DEPENDS是一个描述系统依赖包的设置。
catkin _ package (
INCLUDE _ DIRS include
LIBRARIES my _ first _ ros _ pkg
CATKIN _ DEPENDS roscpp std _ msgs
DEPENDS system _ lib
)
include_directories是可以指定包含目录的选项。目前设定为 c a t k i n I N C L U D E D I R S , 这 意 味 着 将 引 用 每 个 功 能 包 中 的 i n c l u d e 目 录 中 的 头 文 件 。 当 用 户 想 指 定 一 个 额 外 的 i n c l u d e 目 录 时 , 写 在 {catkin_INCLUDE_DIRS},这意味着将引用每个功能包中的include目录中的头文件。当用户想指定一个额外的include目录时,写在 catkinINCLUDEDIRS,这意味着将引用每个功能包中的include目录中的头文件。当用户想指定一个额外的include目录时,写在{catkin_INCLUDE_DIRS}的下一行即可。
include _ directories (
${
catkin _ INCLUDE _ DIRS }
)
add_library声明构建之后需要创建的库。以下是引用位于my_first_ros_pkg功能包的src目录中的my_first_ros_pkg.cpp文件来创建my_first_ros_pkg库的命令。
add _ library ( my _ first _ ros _ pkg
src /${
PROJECT _ NAME }/ my _ first _ ros _ pkg . cpp
)
add_dependencies是在构建该库和可执行文件之前,如果有需要预先生成的有依赖性的消息或dynamic_reconfigure,则要先执行。以下内容是优先生成my_first_ros_pkg库依赖的消息及dynamic reconfigure的设置。
add _ dependencies ( my _ first _ ros _ pkg ${
${
PROJECT _ NAME }_ EXPORTED _ TARGETS } ${
catkin _ EXPORTED _ TARGETS })
add_executable是对于构建之后要创建的可执行文件的选项。以下内容是引用src/my_first_ros_pkg_node.cpp文件生成my_first_ros_pkg_node可执行文件。如果有多个要引用的*.cpp文件,将其写入my_first_ros_pkg_node.cpp之后。如果要创建两个以
上的可执行文件,需追加add_executable项目。
add _ executable ( my _ first _ ros _ pkg _ node src / my _ first _ ros _ pkg _ node . cpp )
如前面描述的add_dependencies一样,add_dependencies是一个首选项,是在构建库和可执行文件之前创建依赖消息和dynamic reconfigure的设置。下面介绍名为my_first_ros_pkg_node的可执行文件的依赖关系,而不是上面提到的库。在建立可执行文件之前,先创建消息文件的情况下会经常用到。
add _ dependencies ( my _ first _ ros _ pkg _ node ${
${
PROJECT _ NAME }_ EXPORTED _ TARGETS } ${
catkin _ EXPORTED _ TARGETS })
target_link_libraries是在创建特定的可执行文件之前将库和可执行文件进行链接的选项。
target _ link _ libraries ( my _ first _ ros _ pkg _ node
${
catkin _ LIBRARIES }
)
此外,还提供了创建官方发行版ROS功能包时使用的Install项目和用于单元测试的Testing项目。
如下修改构建配置文件(CMakeLists.txt):
cmake _ minimum _ required ( VERSION 2 . 8 . 3 )
project ( my _ first _ ros _ pkg )
find _ package ( catkin REQUIRED COMPONENTS roscpp std _ msgs )
catkin _ package ( CATKIN _ DEPENDS roscpp std _ msgs )
include _ directories (${
catkin _ INCLUDE _ DIRS })
add _ executable ( hello _ world _ node src / hello _ world _ node . cpp )
target _ link _ libraries (hello_world_node ${
catkin_LIBRARIES})
此处catkin_make时出现多次错误,经检查皆时因为代码由PDF复制而来时产生乱码,符号前后增加了空格,造成程序错误。如下:
如上图1caake显示CMakelists.txt文件135行有错,上图2中135行由于直接复制PDF,导致原程序“add_executable(hello_world_node src/hello_world_node.cpp)”增添了许多空格,语法错误。
在上述CMakelists.txt文件的可执行文件创建部分(add_executable)中,进行了以下设置。
add _ executable ( hello _ world _ node src / hello _ world _ node . cpp )
即引用功能包的src目录中的hello_world_node.cpp源代码来生成hello_
world_node可执行文件。
首先,用cd命令转到功能包目录中包含源代码的目录(src),并创建hello_world_node.cpp文件。这个例子使用gedit编辑器,但是也可以使用自己的编辑器,比如vi、gedit、qtcreator、vim或者emacs。
$ cd ~/ catkin _ ws / src / my _ first _ ros _ pkg / src /
$ gedit hello_world_node.cpp
之后如下修改代码:
#include <ros/ros.h>
#include <std_msgs/String.h>
#include <sstream>
int main(int argc,char**argv)
{
ros::init(argc,argv,"hello_world_node");
ros::NodeHandle nh;
ros::Publisher chatter_pub=nh.advertise<std_msgs::String>("say_hello_world",1000);
ros::Rate loop_rate(10);
int count=0;
while(ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss <<"hello world!"<< count;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++ count;
}
return 0;
}
此处错误原因同上,因复制PDF导致两个错误,如下:
1.
由于cd ~/与catkin _ ws 之间存在空格,系统默认此时目录为主文件夹,因此创建hello_world_node.cpp文件位置错误(如下图例所示),cmake出错。如上图修改后,位置正确。
2.
文件名“hello_world_node.cpp”中出现多个空格,变成单个文件“hello” "-"等等,因此cmake时出错。重新输入后正确。
将之前创建的功能包反映在ROS功能包列表的命令,这并不是必选操
作,但在创建新功能包后更新的话使用时会比较方便。
$ rospack profile
下面是catkin构建。移动到catkin工作目录后进行catkin构建。
$ cd ~/catkin_ws && catkin_make
快捷命令 如第3.2节“搭建ROS开发环境”中所述,如果在.bashrc文件中设置了“alias cm =’cd〜/ catkin_ws && catkin_make”,则可以用终端窗口中的cm命令替换以前的命令。
如果构建无误,那么将在“~/catkin_ws/devel/lib/my_first_ros_pkg”中生成
“hello_world_node”文件。
打开一个终端窗口(Ctrl + Alt + t)并在运行该节点之前先运行roscore。
$ roscore
最后,打开一个新的终端窗口(Ctrl + Alt + t)并使用以下命令运行节点。这是在名为my_first_ros_pkg的功能包中运行名为hello_world_node的节点的命令。
$ rosrun my _ first _ ros _ pkg hello _ world _ node
结果:
经验总结:
在本次练习中我因为不够细心和偷懒出现了许多错误,花费了大量时间。在以后的实践中一定要认真操作,不偷懒。
重新拉取代码的时候出现的问题。百度出现的解决办法总共试了三次,配置了git的环境变量;设置了git的邮箱以及用户名,(不知道这个有没有起作用,反正一顿操作下来就好了)git config --global user.name "Your Name"git config --global user.email "[email protected]"再进行命令,git pull origin '分支名称'--allow-unrelated-histories即可成功。记录...
说明:忘记对成员变量进行初始化,或者是没有充分考虑初始化的顺序,是在实现过程当中经常发生的一类Bug。在Java中,如果忘记对局部变量进行初始化,会发生编译错误。因此很多人认为不可能发生初始化的遗漏。但是,如果忘记对成员变量进行初始化是不会导致编译错误的。将会被默认值初始化。其结果是,如果变量是引用型(类或者数组型)的而忘记初始化,就会在运行时发生NullPointerException错误。
环绕上海走一回——《环绕上海》读后感3533字:都说海南岛没有冬天,其实,在年末阴雨霏霏、连月不开的日子里,这里轻寒逼人、浓潮侵人的感觉一点也不好受。在这样的时候,捧着一本特别的书,和一名美国人一起环绕着二十年代的旧上海走一回,可以暂时忘记现实的阴郁,有一种踏实而又温暖的美妙体验。读罢掩卷,余味绵绵。作者哈罗德·师克明,于1920年代从美国不远万里来到中国上海,开启了他环绕上海的观光之旅。他从...
异常信息: Exception in thread "main" org.hibernate.MappingException: Unknown entity: com.red.bean.Book at org.hibernate.impl.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:548) at org
爬虫系列(四)--全站爬取全站爬取需要的数据基于一个这样的假设:某网站的页面上存在该网站其他页面的连接,通过这些连接跳转的新的页面进行数据的爬取。在开始这个之前,要先明白栈和队列。本篇中介绍的是单线程的实现方式,大规模的爬取需要多线程,分布式爬取。1.实现步骤(1)准备几个起始链接加入待队列Q中,例如Q=["http://www.xxx.com/aaa/","http://www.xx...
射频识别技术漫谈(13)——Mifare S50与Mifare S70
1,编译链接编译链接分为4个步骤:预处理、编译、汇编、链接2,预处理(预编译)预编译过程把源文件变成.i文件,主要处理以#开头的预编译指令,比如#include、#define等主要处理规则:2,编译编译是把预处理完的文件进行一系列词法分析、语法分析、语义分析、优化后,生成相应的汇编代码文件。3,汇编汇编器将汇编代码变成机器指令,没有复杂语法,也没有语义,也不需要优化,只需要一一对应的翻译即可。4,链接链接过程生成可执行文件。...
MyBatis虽然有很好的SQL执行性能,但毕竟不是完整的ORM框架,不同的数据库之间SQL执行还是有差异。笔者最近在升级 Oracle 驱动至 ojdbc 7 ,就发现了处理DATE类型存在问题。还好MyBatis提供了使用自定义TypeHandler转换类型的功能。本文介绍如下使用 TypeHandler 实现日期类型的转换。问题背景项目中有如下的字段,是采用的DATE类型:birt...
2022-2028中国医疗设备电源市场现状研究分析与发展前景预测报告据QYR最新调研,2021年中国医疗设备电源市场销售收入达到了 万元,预计2028年可以达到 万元,2022-2028期间年复合增长率(CAGR)为 %。中国市场核心厂商包括XP Power、SL Power Electronics、明纬、Astrodyne TDI和CUI Inc等,按收入计,2021年中国市场前三大厂商占有大约 %的市场份额。从产品产品类型方面来看,AC/DC电源占有重要地位,预计2028年份额将达到 %。同时就
正常情况下,我们在使用python做页面开发时,防止中文出现乱码问题,python2 情况下会使用:如下语句——import sysreload(sys)sys.setdefaultencoding("utf-8")但在python3下,报错:sys.setdefaultencoding('utf-8')AttributeError: module 'sys' has no attribute 'setdefaultencoding'这条语句改为import sysimp
这篇蛋糕求职记记录了我应聘到淘宝软件公司的过程以及点滴收获。拿出来和大家分享。 到武汉应聘确实是件很突然的事情。虽然早就决定去武汉尝试下淘宝和支付宝(对阿里的偏好始于大三)。 10月10号到武汉,晚上再加上大雨,再加上迷糊的计程车司机把我和另外一名一起来应聘的同学带到了武大校园里面……武大真的很大,兜兜转转才找到一个可以住的旅馆。第二天就换到武大正门对着的街道里的旅馆。可以说,去
这话出自地产界大佬任志强。看了以上这段话,不知道所有的IT码农、苦逼的IT工程师们作何感想。他们是感觉“不负恩泽”,还是愤懑的“情何以堪”呢?作为在IT行业里混了很多年,同时又是一个职业规划师,这段话让我对IT人的职业发展有了一些全新的认识。在IT这个瞬息万变的行业,我们昨天对其职业发展的观点,到今天再看,是否就变成了迂腐之言?1. 技术做到一定程度要涉及管理?相信这是多数职业规划给I