ROS机器人编程--四.构建系统 学习笔记

4.8文件系统

1.安装目录
  1. 路径:/opt/ros/kinetic
  2. 详细内容:
    /bin 可执行的二进制文件
    /etc 与ROS和catkin相关的配置文件
    /include 头文件
    /lib 库文件
    /share ROS功能包
    env.* 配置文件
    setup.* 配置文件
2.工作目录
  1. 路径:/home/用户名/catkin_ws
  2. 详细内容:
    /build 构建相关的文件
    /devel msg、srv头文件、用户包库、可执行文件
    /src 用户功能包

3.用户功能包
~/catkin_ws/src 是用户源代码的空间。

组成:
/include 头文件
/launch 用于roslaunch的启动文件
/node 用于rospy的脚本
/msg 消息文件
/src 源代码文件
/srv 服务文件
CMakeLists.txt 构建配置文件
package.xml 功能包配置文件

4.9构建系统

ROS的构建系统默认使用CMaKe。
在ROS中,CMaKe被修改为适合于ROS的“catkin”构建系统。

1.创建功能包
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

实践
在这里插入图片描述

2.修改功能包配置文件(package.xml)

下面是对每个语句的说明。

■ <?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>

此处简单对照了一下,并未修改,结果目前无影响

3.修改构建配置文件(CMakeLists.txt)

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,includeinclude,{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)”增添了许多空格,语法错误。

4.编写源代码

在上述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时出错。重新输入后正确。

5.构建功能包

将之前创建的功能包反映在ROS功能包列表的命令,这并不是必选操
作,但在创建新功能包后更新的话使用时会比较方便。

$ rospack profile

下面是catkin构建。移动到catkin工作目录后进行catkin构建。

$ cd ~/catkin_ws && catkin_make

快捷命令 如第3.2节“搭建ROS开发环境”中所述,如果在.bashrc文件中设置了“alias cm =’cd〜/ catkin_ws && catkin_make”,则可以用终端窗口中的cm命令替换以前的命令。

6.运行节点

如果构建无误,那么将在“~/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

结果:
在这里插入图片描述
经验总结:
在本次练习中我因为不够细心和偷懒出现了许多错误,花费了大量时间。在以后的实践中一定要认真操作,不偷懒。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值