ROS的新手教程--学习笔记1

干货在最后或者另一篇博客https://mp.csdn.net/postedit/102992022

小白开始学习,来自官网或者他人博客欢迎指正

0.安装ROS和配置ROS环境

安装ROS通过官网,如果新手可以考虑安装完整的,免得以后需要继续安装。

sudo apt-get install ros-kinetic-desktop-full

如果从apt这样的包管理器安装ROS,那么这些包将不能被写访问,也不应该被用户编辑。当从源代码使用ROS包或创建新的ROS包时,您应该始终在您有权访问的目录中工作,比如您的主文件夹。

管理环境:

在ROS的安装过程中,将看到提示从几个setup.*sh文件中选择一个作为源,甚至将此“源”添加到shell启动脚本中。这是必需的,因为ROS依赖于使用shell环境组合空间的概念。这使得针对不同版本的ROS或针对不同的包集进行开发变得更加容易。
如果在查找或使用ROS包时遇到问题,确保环境设置正确。检查的一个好方法是确保设置了诸如ROS_ROOT和ROS_PACKAGE_PATH之类的环境变量:

$ printenv | grep ROS

输出:

ROS_ROOT=/opt/ros/kinetic/share/ros
ROS_PACKAGE_PATH=/home/chen/mycatkin/src:/home/chen/px4_ws/src:/home/chen/catkin_ws/src/mavlink:/home/chen/catkin_ws/src/mavros/libmavconn:/home/chen/catkin_ws/src/mavros/mavros_msgs:/home/chen/catkin_ws/src/mavros/mavros:/home/chen/catkin_ws/src/mavros/mavros_extras:/home/chen/catkin_ws/src/mavros/test_mavros:/opt/ros/kinetic/share
ROS_MASTER_URI=http://localhost:11311
ROS_VERSION=1
ROSLISP_PACKAGE_DIRECTORIES=/home/chen/mycatkin/devel/share/common-lisp:/home/chen/px4_ws/devel/share/common-lisp:/home/chen/catkin_ws/devel/share/common-lisp
ROS_DISTRO=kinetic
ROS_ETC_DIR=/opt/ros/kinetic/etc/ros


如果没有显示,需要source~一下.bash,但只能在该shell窗口访问ROS命令。

$ source /opt/ros/kinetic/setup.bash

或者将该行加入系统.bashrc,可以不必在每个shell窗口中使用source~

1.ROS系统命令学习(来自:http://blog.sina.com.cn/s/blog_661159d50100och4.html

参考ROS官网:http://www.ros.org/wiki/ROS/Tutorials/NavigatingTheFilesystem

 
对于ROS系统,很多代码关联于很多的packages和stacks之间,如果用简单的liunx命令行,比如ls,cd 等,会导致路径冗长等问题,所以ROS提供了自己的命令行。根据官网,我整理出ROS系统下常用的命令:
 
1,find命令   ----查找相应的package或者stack
用法:
$ rospack find [package name]
$ rosstack find [stack_name]
例子:
$ rospack find roscpp
得到结果:
YOUR_INSTALL_PATH/ros/core/roscpp
 
2,roscd命令 ----改变路径到相应的package或者stack
用法:
$ roscd [Locationname[/subdir]]
 
(1) 定位到相应的package, stack文件
例子:
$ roscd roscpp
得到结果:
YOUR_INSTALL_PATH/ros/core/roscpp
 
(2) 定位到相应的package,stack文件的字文件
例子:
$ roscd roscpp/include
得到结果:
YOUR_INSTALL_PATH/ros/core/roscpp/include
 
(3) 没有参数时的roscd
例子:
$ roscd
得到结果:
YOUR_INSTALL_PATH/ros         ----类似于UNIX的pwd
 
(4) roscd日志  ----得到ROS存储日志的文件
$ roscd log
 
3,rosls命令 -----罗列相应的package,stack文件夹的文件
用法:
$ rosls [locationname[/subdir]]
例子:
$ rosls roscpp_tutorials
得到结果:
add_two_ints_client listener_unreliable add_two_ints_server listener_with_tracked_object add_two_ints_server_class listener_with_userdata anonymous_listener Makefile babbler manifest.xml CMakeLists.txt node_handle_namespaces custom_callback_processing notify_connect listener srv listener_async_spin talker listener_multiple time_api listener_single_message timers listener_threaded_spin
 
4,善于用" Tab "键
“Tab”键,在Windows系统下,功能只是个制表符,但是在Liunx下,这个键功能很强大,比如(指在ROS 下)得到整个package名字
例子:
$ roscd roscpp_<<< now push the TAB key >>> --roscpp_tutorials是个很长的名字,可以采用TAB
得到结果:
$ roscd roscpp tutorials/
 
5,ROS 下一些命名规则:
rospack = ros + pack(age)
rosstack = ros + stack
roscd = ros + cd
rosls = ros + ls
 
 

2.创建新的工作空间(kinetic)

$ source /opt/ros/kinetic/setup.bash  //配置环境。假设已经安装catkin,并且是在kinetic中通过apt-get的形式安装的catkin

创建工作空间:

$ mkdir -p ~/mycatkin/src  //这里将新创建的工作空间命名为mycatkin
$ cd ~/catkin_ws/
$ catkin_make  
//编译工作空间,自动生成build和devel目录,并在src目录中生成一个CMakelists.txt。在devel中有许多setup.*bash文件,source这些文件可以将此工作空间覆盖在环境之上。
$ source devel/setup.bash 
//在新创建的工作空间目录下执行该操作,确保安装脚本正确地覆盖该工作空间,确保ROS_PACKAGE_PATH环境变量包含您所在的目录。
$ echo $ROS_PACKAGE_PATH
/home/youruser/catkin_ws/src:/opt/ros/kinetic/share

echo $ROS_PACKAGE_PATH /home/chen/mycatkin/src:/opt/ros/kinetic/share

接下来将继续如何使用工作空间。

3.创建简单的ROS package

ROS的软件以Package的方式组织起来。package包含节点(Node)、ROS依赖库、数据套、配置文件、第三方软件、或者任何其他逻辑构成。package的目标是提供一种易于使用的结构以便于软件的重复使用。总得来说,ROS的package遵从Goldilocks原则:短小精干。所有的ROS packages包括很多类似的文件:manifests, CMakeLists.txt, mainpage.dox, 和Makefiles.
         package很容易手工制作,也可使用其他工具,例如roscreate-pkg。ROS的package可以是ROS_ROOT或者ROS_PACKAGE_PATH里面的一个目录/文件夹,包含一个manifest.xml文件。package可以是ROSstacks的组成部分。首先我们用roscreate来创建package:
        $ roscreate-pkg [package_name]
这里我直接引用官网提供的这个例子:---创建beginner_tutorials package,他依赖std_msgs, roscpp, rospy
(1) 利用 rorcreate-pkg 创建 package
$ roscreate-pkg beginner_tutorials std_msgs roscpp rospy
得到结果:
Created package directory /opt/ros/cturtle/ros/beginner_tutorials
Created include directory /opt/ros/cturtle/ros/beginner_tutorials/include/beginner_tutorials
Created cpp source directory /opt/ros/cturtle/ros/beginner_tutorials/src
Created package file /opt/ros/cturtle/ros/beginner_tutorials/Makefile
Created package file /opt/ros/cturtle/ros/beginner_tutorials/manifest.xml
Created package file /opt/ros/cturtle/ros/beginner_tutorials/CMakeLists.txt
Created package file /opt/ros/cturtle/ros/beginner_tutorials/mainpage.dox
 
Please edit beginner_tutorials/manifest.xml and mainpage.dox to finish creating your package
 
最后一句话是说编辑package的清单,这里我们需要仔细阅读manifest.xml,所以这里把生成的manifest.xml贴于下面:

<package>

<description brief="beginner_tutorials"> beginner_tutorials </description>

<author>root</author>

<license>BSD</license>

<review status="unreviewed" notes=""/>

<url>http://ros.org/wiki/beginner_tutorials</url>

<depend package="std_msgs"/>

<depend package="rospy"/>

<depend package="roscpp"/>

</package>

 
(2) 将该路径添加到ros系统中(即更新ros查找路径)
$ export ROS_PACKAGE_PATH=YOUR_BEGINNER_TUTORIALS_PATH:$ROS_PACKAGE_PATH
对于我机子而已,是这样添加:
$ export ROS_PACKAGE_PATH=./:$ROS_PACKAGE_PATH
然后我确认是否在ROS可以找到:
$ rospack find beginner_tutorials
结果如下:
/opt/ros/cturtle/ros/beginner_tutorials
 
注意注意!!!根据ROS官方的教程创建工作空间后,进入[src]目录,在其中创建一个名为“beginner_tutorials”的新程序包,并建立了它的依赖关系。
注意:这里我的新建工作空间位于/home/chen/mycatkin/src
$ export ROS_PACKAGE_PATH=/home/chen/mycatkin/src:ROS_PACKAGE_PATH
$ rospack find beginner_tutorials
输出:/home/chen/mycatkin/src/beginner_tutorials
 

The solution is before to do the command:

$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

We need to be located in : ~/catkin_ws/src

For some reason I was in ~/catkin_ws and thought it was the right place to create the Package.

之前我把beginner_tutorials包安装在了/mycatkin目录下,一直找不到,后来才发现应该在src目录下创建,上面是谷狗上的。
 
(3) 我们可以查看package相关第一层依赖项
$ rospack depends1 beginner_tutorials  ----package第一层依赖项查询
结果如下:
std_msgs
rospy
roscpp
 
$ rospack depends1 rospy ----package依赖项rospy的第一层依赖项查询
结果如下:
roslib
roslang
 
$ rospack depends beginner_tutorials  ---package所有依赖项查询
genmsg_cpp
rospack
roslib
rosconsole
std_msgs
roslang
rospy
xmlrpcpp
roscpp
 
 
4.建立和编译package
参考网址:http://www.ros.org/wiki/ROS/Tutorials/BuildingPackages

 前面我们用roscreate-pkg建立package,这里我们根据系统关联来编译这些packages.


以下内容翻译自官网:https://wiki.ros.org/ROS/Tutorials/BuildingPackages

catkin_make是一个命令行工具,它为标准的catkin工作流增加了一些便利。您可以想象catkin_make将对cmake的调用与标准cmake工作流中的make结合起来:

# In a catkin workspace
$ catkin_make [make_targets] [-DCMAKE_VARIABLES=...]

对于不熟悉标准CMake工作流程的人,可以将其分解如下:

注意:如果您运行以下命令,它将不工作,因为这只是一个例子,如何CMake一般工作。

# In a CMake project
$ mkdir build
$ cd build
$ cmake ..
$ make
$ make install  # (optionally)

此过程针对每个CMake项目运行。相反,catkin项目可以在工作区中一起构建。在工作空间中构建0到多个catkin包遵循以下工作流程:

# In a catkin workspace
$ catkin_make
$ catkin_make install  # (optionally)

以上命令将构建在src文件夹中找到的所有catkin项目。如果你的源代码在不同的地方,如my_src,然后你会调用catkin_make这样:

注意:如果您运行以下命令,它将无法工作,因为目录my_src不存在。

# In a catkin workspace
$ catkin_make --source my_src
$ catkin_make install --source my_src  # (optionally)

For more advanced uses of catkin_make see the documentation: catkin/commands/catkin_make

建立自己的package

如果您正在使用此页面构建自己的代码,请参阅后面的教程(c++)/(Python),因为您可能需要修改CMakeLists.txt。

你应该已经有了一个catkin工作空间和一个名为beginner_tutorials的新catkin包,它来自于前面的教程,创建了一个包。如果你还没有进入catkin的工作空间,请进入src文件夹:

#$ cd ~/catkin_ws/
$ cd ~/mycatkin/  //这是我自己创建的工作空间名字
$ ls src

显示:

beginner_tutorials  CMakeLists.txt

您应该看到有一个名为beginner_tutorials的文件夹,它是您在前面的教程中使用catkin_create_pkg创建的。我们现在可以使用catkin_make来构建这个包:

$ catkin_make  //在工作空间目录下,会自动对src目录下编译

编译结果不报错即成功:

chen@chen:~/mycatkin$ catkin_make
Base path: /home/chen/mycatkin
Source space: /home/chen/mycatkin/src
Build space: /home/chen/mycatkin/build
Devel space: /home/chen/mycatkin/devel
Install space: /home/chen/mycatkin/install
####
#### Running command: "cmake /home/chen/mycatkin/src -DCATKIN_DEVEL_PREFIX=/home/chen/mycatkin/devel -DCMAKE_INSTALL_PREFIX=/home/chen/mycatkin/install -G Unix Makefiles" in "/home/chen/mycatkin/build"
####
-- Using CATKIN_DEVEL_PREFIX: /home/chen/mycatkin/devel
-- Using CMAKE_PREFIX_PATH: /home/chen/mycatkin/devel;/home/chen/px4_ws/devel;/home/chen/catkin_ws/devel;/opt/ros/kinetic
-- This workspace overlays: /home/chen/mycatkin/devel;/home/chen/px4_ws/devel;/home/chen/catkin_ws/devel;/opt/ros/kinetic
-- Using PYTHON_EXECUTABLE: /usr/bin/python
-- Using Debian Python package layout
-- Using empy: /usr/bin/empy
-- Using CATKIN_ENABLE_TESTING: ON
-- Call enable_testing()
-- Using CATKIN_TEST_RESULTS_DIR: /home/chen/mycatkin/build/test_results
-- Found gmock sources under '/usr/src/gmock': gmock will be built
-- Found gtest sources under '/usr/src/gmock': gtests will be built
-- Using Python nosetests: /usr/bin/nosetests-2.7
-- catkin 0.7.18
-- BUILD_SHARED_LIBS is on
-- BUILD_SHARED_LIBS is on
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- ~~  traversing 1 packages in topological order:
-- ~~  - beginner_tutorials
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- +++ processing catkin package: 'beginner_tutorials'
-- ==> add_subdirectory(beginner_tutorials)
-- Configuring done
-- Generating done
-- Build files have been written to: /home/chen/mycatkin/build
####
#### Running command: "make -j4 -l4" in "/home/chen/mycatkin/build"
####

注意,catkin_make首先显示它为每个“空间”使用的路径。这些空间在REP128和关于catkin工作空间的wiki: catkin/workspaces文档中进行了描述。需要注意的重要一点是,由于这些默认值,在catkin工作区中创建了几个文件夹。看看ls:

chen@chen:~/mycatkin$ ls
build  devel  src

build文件夹是构建空间的默认位置,是调用cmake和make来配置和构建包的地方。devel文件夹是devel空间的默认位置,在安装包之前,devel空间是您的可执行文件和库所在的位置。

现在您已经构建了ROS包,让我们进一步讨论ROS节点。


(1)系统关联
        ROS package有时运行时需要连接外部库或者可执行程序。这些库或者程序的连接经常被关联到系统关联中。在一些情况下,这些系统关联不会被默认的安装,ROS提供了一个简单的工具--rosdep,用来下载和安装系统关联的。
      ROS rospack必须在相应的package manifest申明,参考小海龟的例子,
$ roscd turtlesim
$ cat manifest.xml
 
 

 

5.创建ROS msg 和 srv

参考网址:http://www.ros.org/wiki/ROS/Tutorials/CreatingMsgAndSrv

 
1,msg和srv介绍:
       msg:msg文件是描述ROS 消息的描述文件,是用来为消息生成不同语言下源代码。msg文件存储在该package路径下的msg文件路径。

msg文件包括以上几种类型:

  • int8, int16, int32, int64 (plus uint*)
  • float32, float64
  • string
  • time, duration
  • other msg files
  • variable-length array[] and fixed-length array[C]
       srv:srv文件是用来描述服务的,由请求和响反应两部分组成。srv文件存储在srv文件路径。
srv文件就像msg文件,另外还包括请求和响应两部分,由“----”分开,例如:
int 64 A
int 64 B
---
int64 Sum
其中,A,B是请求者,Sum是响应者。
 
 
2. 创建一个msg
 
例子:
(1) 我们在已经创建好的beginner_tutorials package上创建msg
$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg
然后,
$ gedit CMakeLists.txt --打开该package的CMakeList.txt,取消“# rosbuild_genmsg()”前的“#”号。

 


上面的示例.msg文件只包含一行。当然,您可以通过添加多个元素来创建更复杂的文件,每行一个元素,如下所示:

string first_name
string last_name
uint8 age
uint32 score

不过,还有一步。我们需要确保msg文件被转换成c++、Python和其他语言的源代码:

打开package.xml,并确保这两行是在它里面和未注释:

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

注意,在构建时,我们需要“message_generation”,而在运行时,我们只需要“message_runtime”。

在您喜欢的文本编辑器中打开CMakeLists.txt(前一篇教程中的rosed是一个不错的选择)。

将message_generation依赖项添加到find_package调用中,该调用已经存在于您的CMakeLists.txt中,以便您可以生成消息。您可以通过简单地将message_generation添加到组件列表中来实现这一点,如下所示:

# Do not just add this to your CMakeLists.txt, modify the existing text to add message_generation before the closing parenthesis 不要只是将其添加到您的CMakeLists.txt中,修改现有的文本,在右括号之前添加message_generation
find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

您可能会注意到,有时即使没有使用所有依赖项调用find_package,项目构建也很好。这是因为catkin将您的所有项目组合到一个项目中,所以如果前面的项目调用find_package,则您的项目将配置相同的值。但是忘记调用意味着您的项目在单独构建时很容易中断。-->啥子意思?

还要确保导出消息运行时依赖项。

catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)

找到以下代码块:

# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

通过删除#符号取消注释,然后用your .msg替换Message*.msg文件,这样它看起来像这样:

add_message_files(
  FILES
  Num.msg
)

通过手动添加your.msg文件,我们可以确保CMake知道在您添加其他.msg文件之后何时需要重新配置项目。

现在我们必须确保调用了generate_messages()函数。

对于ROS Hydro及以后的版本,您需要取消注释这些行:

# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

像这样:

generate_messages(
  DEPENDENCIES
  std_msgs
)

现在可以从msg定义生成源文件了。如果您现在想这样做,请跳过下面的小节,转到msg和srv的常用步骤。

使用rosmsg

这就是创建.msg所需要做的全部工作。让我们确保ROS可以使用rosmsg show命令查看它。

$ rosmsg show [message type]

例如:

$ rosmsg show beginner_tutorials/Num

输出:

int64 num

在前面的例子中,消息类型由两部分组成:

beginner_tutorials——定义消息的包

Num——msg Num的名称。

如果您不记得.msg在哪个包中,您可以省略包名。试一试:

$ rosmsg show Num

输出:

[beginner_tutorials/Num]:
int64 num

使用 srv

让我们使用我们刚刚创建的包来创建一个srv:

$ roscd beginner_tutorials
$ mkdir srv

我们将从另一个包中复制一个现有的srv定义,而不是手工创建一个新的srv定义。

为此,roscp是一个有用的命令行工具,用于将文件从一个包复制到另一个包。

$ roscp [package_name] [file_to_copy_path] [copy_path]

现在我们可以从rospy_tutorials包复制一个服务:

$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

不过,还有一步。我们需要确保srv文件被转换成c++、Python和其他语言的源代码

除非你已经这样做了,否则打开package.xml,并确保这两行是在它和未注释:

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

和前面一样,注意在构建时,我们需要“message_generation”,而在运行时,我们只需要“message_runtime”。

除非您已经在前面的步骤中为消息做了这样的操作,否则添加message_generation依赖项来在CMakeLists.txt中生成消息:

# Do not just add this line to your CMakeLists.txt, modify the existing line
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

(尽管名为message_generation,但它同时适用于msg和srv。)

对于服务和消息,您需要对package.xml进行相同的更改,因此请查看上面的附加依赖项。(修正一下,这里是在CMakelists.txt中更改的)

删除#来取消以下行的注释:

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

现在可以从服务定义生成源文件了。如果您现在想这样做,请跳过下面的小节,转到msg和srv的常用步骤。

使用 rossrv

这就是创建srv所需要做的全部工作。让我们确保ROS可以使用rossrv show命令查看它。

$ rossrv show <service type>

例如:

$ rossrv show beginner_tutorials/AddTwoInts

输出:

int64 a
int64 b
---
int64 sum

与rosmsg类似,您可以找到这样的服务文件,而不需要指定包的名称:

$ rossrv show AddTwoInts
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

这里显示了两个服务。第一个是您刚刚在beginner_tutorials包中创建的,第二个是rospy_tutorials包中预先存在的。

msg和srv的常用步骤

除非您在前面的步骤中已经这样做了,否则更改CMakeLists.txt。:

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

取消注释并添加您所依赖的包含消息使用的.msg文件的任何包(在本例中为std_msgs),使它看起来像这样:

generate_messages(
  DEPENDENCIES
  std_msgs
)

现在我们已经做了一些新的消息,我们需要再次使我们的包:

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

msg目录中的任何.msg文件都将生成用于所有受支持语言的代码。c++消息头文件将在~/catkin_ws/devel/include/beginner_tutorials/中生成。Python脚本将在~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg中创建。lisp文件出现在~/catkin_ws/devel/share/ commonlisp /ros/beginner_tutorials/msg/中。

类似地,srv目录中的任何.srv文件都将以支持的语言生成代码。对于c++,这将在与消息头文件相同的目录中生成头文件。对于Python和Lisp,在“msg”文件夹旁边会有一个“srv”文件夹。

消息格式的完整规范可从消息描述语言页面获得。

如果要构建使用新消息的c++节点,还需要声明节点和消息之间的依赖关系,如catkin msg/srv构建文档中所述。

寻求帮助

我们已经看到了不少ROS工具。跟踪每个命令需要的参数可能比较困难。幸运的是,大多数ROS工具都提供了它们自己的帮助。

$ rosmsg -h

可以看到一个列表不同的rosmsg子命令

Commands:
  rosmsg show     Show message description
  rosmsg list     List all messages
  rosmsg md5      Display message md5sum
  rosmsg package  List messages in a package
  rosmsg packages List packages that contain messages

也可以从子命令中获得帮助:

$ rosmsg show -h

这显示了rosmsg show需要的参数:

Usage: rosmsg show [options] <message type>

Options:
  -h, --help  show this help message and exit
  -r, --raw   show raw message text, including comments

回顾

1. 一些常用命令组合:

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

roscd = ros+cd: 将目录更改为ros包或堆栈

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

roscp = ros+cp: 从ros包中复制文件
rosmsg = ros+msg: 提供与ros消息定义相关的信息
rossrv = ros+srv:提供与ros服务定义相关的信息
catkin_make:生成(编译)一个ROS包

rosmake = ros+make:编译ros包(如果不使用catkin工作区)

2.这篇主要讲如何创建新的工作空间/mycatkin,在工作空间建立自己的ROS包/beginner_tutorials然后在包/beginner_tutorials里定义消息msg和服务srv。

(1)创建工作空间:

  $ source /opt/ros/kinetic/setup.bash //配置环境。假设已经安装catkin,并且是在kinetic中通过apt-get的形式安装的catkin

$ mkdir -p ~/mycatkin/src  //这里将新创建的工作空间命名为mycatkin
$ cd ~/catkin_ws/
$ catkin_make  //编译工作空间,这里可能涉及到源码放在不同目录下,如my_src,如何编译,可以往上翻
//编译工作空间,自动生成build和devel目录,并在src目录中生成一个CMakelists.txt。在devel中有许多setup.*bash文件,source这些文件可以将此工作空间覆盖在环境之上。

(2)将工作空间加入ROS环境中

    $ source devel/setup.bash
     //在新创建的工作空间目录下执行该操作,确保安装脚本正确地覆盖该工作空间,确保ROS_PACKAGE_PATH环境变量包含  您所在的目录。(或者直接在.bashrc中写入配置路径,不用每次开一个新终端都需要手动输入

(3)建立自己的ROS包

      再啰嗦一下:ROS的软件以Package的方式组织起来。package包含节点(Node)、ROS依赖库、数据套、配置文件、第三方软件、或者任何其他逻辑构成。package的目标是提供一种易于使用的结构以便于软件的重复使用。总得来说,ROS的package遵从Goldilocks原则:短小精干。所有的ROS packages包括很多类似的文件:manifests, CMakeLists.txt, mainpage.dox, 和Makefiles.

    a. 使用工具,例如roscreate-pkg(也可以使用其他工具,以后在慢慢研究)

    $ roscreate-pkg [package_name]

这里直接引用官网提供的这个例子:---创建beginner_tutorials package,他依赖std_msgs, roscpp, rospy
$ roscreate-pkg beginner_tutorials std_msgs roscpp rospy
得到结果:
Created package directory /opt/ros/cturtle/ros/beginner_tutorials
Created include directory /opt/ros/cturtle/ros/beginner_tutorials/include/beginner_tutorials
Created cpp source directory /opt/ros/cturtle/ros/beginner_tutorials/src
Created package file /opt/ros/cturtle/ros/beginner_tutorials/Makefile
Created package file /opt/ros/cturtle/ros/beginner_tutorials/manifest.xml
Created package file /opt/ros/cturtle/ros/beginner_tutorials/CMakeLists.txt
Created package file /opt/ros/cturtle/ros/beginner_tutorials/mainpage.dox
 
Please edit beginner_tutorials/manifest.xml and mainpage.dox to finish creating your package
 
最后一句话是说编辑package的清单,这里我们需要仔细阅读manifest.xml。
 
b. 将该路径添加到ros系统中(即更新ros查找路径)
$ export ROS_PACKAGE_PATH=YOUR_BEGINNER_TUTORIALS_PATH:$ROS_PACKAGE_PATH
注意注意!!!根据ROS官方的教程创建工作空间后,进入[src]目录,在其中创建一个名为“beginner_tutorials”的新程序包,并建立了它的依赖关系。
 
注意:这里我的新建工作空间位于/home/chen/mycatkin/src
$ export ROS_PACKAGE_PATH=/home/chen/mycatkin/src:ROS_PACKAGE_PATH
$ rospack find beginner_tutorials
输出:/home/chen/mycatkin/src/beginner_tutorials
 

The solution is before to do the command:

$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

We need to be located in : ~/catkin_ws/src

For some reason I was in ~/catkin_ws and thought it was the right place to create the Package.

之前我把beginner_tutorials包安装在了/mycatkin目录下,一直找不到,后来才发现应该在src目录下创建,上面是谷狗上的。
 
c. 我们可以查看package相关第一层依赖项
$ rospack depends1 beginner_tutorials  ----package第一层依赖项查询
结果如下:
std_msgs
rospy
roscpp
 
$ rospack depends1 rospy ----package依赖项rospy的第一层依赖项查询
结果如下:
roslib
roslang
 
$ rospack depends beginner_tutorials  ---package所有依赖项查询
genmsg_cpp
rospack
roslib
rosconsole
std_msgs
roslang
rospy
xmlrpcpp
roscpp
 
 
d. 建立和编译package
参考网址:http://www.ros.org/wiki/ROS/Tutorials/BuildingPackages

 前面用roscreate-pkg建立package,这里我们根据系统关联来编译这些packages.

catkin_make是一个命令行工具,它为标准的catkin工作流增加了一些便利。您可以想象catkin_make将对cmake的调用与标准cmake工作流中的make结合起来:

# In a catkin workspace
$ catkin_make [make_targets] [-DCMAKE_VARIABLES=...]

以上命令将构建在src文件夹中找到的所有catkin项目。如果你的源代码在不同的地方,如my_src,然后你会调用catkin_make这样:

注意:如果您运行以下命令,它将无法工作,因为目录my_src不存在。

# In a catkin workspace
$ catkin_make --source my_src
$ catkin_make install --source my_src  # (optionally)

e. 查看建立的package

如果您正在使用此页面构建自己的代码,请参阅后面的教程(c++)/(Python),因为您可能需要修改CMakeLists.txt。

你应该已经有了一个catkin工作空间和一个名为beginner_tutorials的新catkin包,它来自于前面的教程,创建了一个包。如果你还没有进入catkin的工作空间,请进入src文件夹:

#$ cd ~/catkin_ws/
$ cd ~/mycatkin/  //这是我自己创建的工作空间名字
$ ls src

显示:

beginner_tutorials  CMakeLists.txt

(4). 在自己的ROS包中创建ROS msg 和 srv

参考网址:http://www.ros.org/wiki/ROS/Tutorials/CreatingMsgAndSrv

       a. msg和srv介绍:
       msg:msg文件是描述ROS 消息的描述文件,是用来为消息生成不同语言下源代码。msg文件存储在该package路径下的msg文件路径。

msg文件包括以上几种类型:

  • int8, int16, int32, int64 (plus uint*)
  • float32, float64
  • string
  • time, duration
  • other msg files
  • variable-length array[] and fixed-length array[C]
       srv:srv文件是用来描述服务的,由请求和响反应两部分组成。srv文件存储在srv文件路径。
srv文件就像msg文件,另外还包括请求和响应两部分,由“----”分开,例如:
int 64 A
int 64 B
---
int64 Sum
其中,A,B是请求者,Sum是响应者。
 
b.  创建一个msg
在已经创建好的beginner_tutorials package上创建msg
$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg
然后,
$ gedit CMakeLists.txt --打开该package的CMakeList.txt,取消“# rosbuild_genmsg()”前的“#”号。(没有找到,尴尬)

上面的示例.msg文件只包含一行。当然,您可以通过添加多个元素来创建更复杂的文件,每行一个元素,如下所示:

string first_name
string last_name
uint8 age
uint32 score

不过,还有一步。我们需要确保msg文件被转换成c++、Python和其他语言的源代码:(这里也可以在创建完服务srv后再添加也可以

打开package.xml,并确保这两行是在它里面和未注释:

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

注意,在构建时,我们需要“message_generation”,而在运行时,我们只需要“message_runtime”。

将message_generation依赖项添加到find_package调用中,该调用已经存在于您的CMakeLists.txt中,以便您可以生成消息。您可以通过简单地将message_generation添加到组件列表中来实现这一点,如下所示:

# Do not just add this to your CMakeLists.txt, modify the existing text to add message_generation before the closing parenthesis 不要只是将其添加到您的CMakeLists.txt中,修改现有的文本,在右括号之前添加message_generation
find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

您可能会注意到,有时即使没有使用所有依赖项调用find_package,项目构建也很好。这是因为catkin将您的所有项目组合到一个项目中,所以如果前面的项目调用find_package,则您的项目将配置相同的值。但是忘记调用意味着您的项目在单独构建时很容易中断。-->啥子意思?

还要确保导出消息运行时依赖项。(没找到,尴尬)

catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)

找到以下代码块:(/beginner_tutorials/CMakelists.txt)

# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

通过删除#符号取消注释,然后用your .msg替换Message*.msg文件,这样它看起来像这样:

add_message_files(
  FILES
  Num.msg
)

通过手动添加your.msg文件,我们可以确保CMake知道在您添加其他.msg文件之后何时需要重新配置项目。

现在我们必须确保调用了generate_messages()函数。

对于ROS Hydro及以后的版本,您需要取消注释这些行:

# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

像这样:

generate_messages(
  DEPENDENCIES
  std_msgs
)

现在可以从msg定义生成源文件了。

使用rosmsg

这就是创建.msg所需要做的全部工作。让我们确保ROS可以使用rosmsg show命令查看它。

$ rosmsg show [message type]

例如:

$ rosmsg show beginner_tutorials/Num

输出:

int64 num

在前面的例子中,消息类型由两部分组成:

beginner_tutorials——定义消息的包

Num——msg Num的名称。

如果您不记得.msg在哪个包中,您可以省略包名。试一试:

$ rosmsg show Num

输出:

[beginner_tutorials/Num]:
int64 num

使用 srv

让我们使用我们刚刚创建的包来创建一个srv:

$ roscd beginner_tutorials
$ mkdir srv

我们将从另一个包中复制一个现有的srv定义,而不是手工创建一个新的srv定义

为此,roscp是一个有用的命令行工具,用于将文件从一个包复制到另一个包。

$ roscp [package_name] [file_to_copy_path] [copy_path]

现在我们可以从rospy_tutorials包复制一个服务:

$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

不过,还有一步。我们需要确保srv文件被转换成c++、Python和其他语言的源代码(之前添加过不用重复添加)

除非你已经这样做了,否则打开package.xml,并确保这两行是在它和未注释:

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

和前面一样,注意在构建时,我们需要“message_generation”,而在运行时,我们只需要“message_runtime”。

除非您已经在前面的步骤中为消息做了这样的操作,否则添加message_generation依赖项来在CMakeLists.txt中生成消息:(前面操作过就不用再重复)

# Do not just add this line to your CMakeLists.txt, modify the existing line
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

(尽管名为message_generation,但它同时适用于msg和srv。)

对于服务和消息,您需要对package.xml进行相同的更改,因此请查看上面的附加依赖项。(修正一下,这里是在CMakelists.txt中更改的)

删除#来取消以下行的注释:

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

现在可以从服务定义生成源文件了。如果您现在想这样做,请跳过下面的小节,转到msg和srv的常用步骤。

使用(查看) rossrv

以上完成创建srv所需要做的全部工作。让我们确保ROS可以使用rossrv show命令查看它。

$ rossrv show <service type>

例如:

$ rossrv show beginner_tutorials/AddTwoInts

输出:

int64 a
int64 b
---
int64 sum

与rosmsg类似,您可以找到这样的服务文件,而不需要指定包的名称:

$ rossrv show AddTwoInts
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

这里显示了两个服务。第一个是您刚刚在beginner_tutorials包中创建的,第二个是rospy_tutorials包中预先存在的。

msg和srv的常用步骤

除非您在前面的步骤中已经这样做了,否则更改CMakeLists.txt。:

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

取消注释并添加您所依赖的包含消息使用的.msg文件的任何包(在本例中为std_msgs),使它看起来像这样:

generate_messages(
  DEPENDENCIES
  std_msgs
)

现在我们已经做了一些新的消息,我们需要再次使我们的包:

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

msg目录中的任何.msg文件都将生成用于所有受支持语言的代码。c++消息头文件将在~/catkin_ws/devel/include/beginner_tutorials/中生成。Python脚本将在~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg中创建。lisp文件出现在~/catkin_ws/devel/share/ commonlisp /ros/beginner_tutorials/msg/中。

类似地,srv目录中的任何.srv文件都将以支持的语言生成代码。对于c++,这将在与消息头文件相同的目录中生成头文件。对于Python和Lisp,在“msg”文件夹旁边会有一个“srv”文件夹。

消息格式的完整规范可从消息描述语言页面获得。

如果要构建使用新消息的c++节点,还需要声明节点和消息之间的依赖关系,如catkin msg/srv构建文档中所述。

寻求帮助

我们已经看到了不少ROS工具。跟踪每个命令需要的参数可能比较困难。幸运的是,大多数ROS工具都提供了它们自己的帮助。

$ rosmsg -h

可以看到一个列表不同的rosmsg子命令

Commands:
  rosmsg show     Show message description
  rosmsg list     List all messages
  rosmsg md5      Display message md5sum
  rosmsg package  List messages in a package
  rosmsg packages List packages that contain messages

也可以从子命令中获得帮助:

$ rosmsg show -h

这显示了rosmsg show需要的参数:

Usage: rosmsg show [options] <message type>

Options:
  -h, --help  show this help message and exit
  -r, --raw   show raw message text, including comments

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章