创造一个简单的ROS package 和 建立和编译package

来源:互联网 发布:中小企业数据备份 编辑:程序博客网 时间:2024/05/16 18:38

from:http://blog.sina.com.cn/s/blog_661159d50100ocj9.html


参考网址:

1,http://www.ros.org/wiki/ROS/Tutorials/CreatingPackage
2,http://bbs.axnzero.com/viewthread.php?tid=657


      ROS的软件以Package的方式组织起来。package包含节点(Node)、ROS依赖库、数据套、配置文件、第三方软件、或者任何其他逻辑构成。package的目标是提供一种易于使用的结构以便于软件的重复使用。总得来说,ROS的package遵从Goldilocks原则:短小精干。所有的ROSpackages包括很多类似的文件: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_tutorialspackage,他依赖std_msgs, roscpp, rospy

(1) 利用 rorcreate-pkg 创建 package
$ roscreate-pkg beginner_tutorials std_msgs roscpp rospy

eg:
 roscreate-pkg roscv sensor_msgs opencv2 cv_bridge roscpp std_msgs image_transport turtlesim ardrone_brown std_srvs

得到结果:
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 editbeginner_tutorials/manifest.xml and mainpage.dox to finish creatingyour package

这里我们需要仔细阅读manifest.xml,所以这里我把生成的manifest.xml贴于下面:
<package>
<descriptionbrief="beginner_tutorials"> beginner_tutorials </description>
<author>root</author>
<license>BSD</license>
<reviewstatus="unreviewed" notes=""/>
<url>http://ros.org/wiki/beginner_tutorials</url>
<dependpackage="std_msgs"/>
<dependpackage="rospy"/>
<dependpackage="roscpp"/>
</package>

(2) 将该路径添加到rox系统中(即更新ros查找路径)
$ exportROS_PACKAGE_PATH=YOUR_BEGINNER_TUTORIALS_PATH:$ROS_PACKAGE_PATH
对于我机子而已,是这样添加:
exportROS_PACKAGE_PATH=./:$ROS_PACKAGE_PATH
然后我确认是否在ROS可以找到:
$ rospackfind beginner_tutorials
结果如下:
/opt/ros/cturtle/ros/beginner_tutorials

(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

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


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


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

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

    turtlesim is a tool made for teaching ROS andROS-PKGS. 

  </description>
  <author>JoshFaust</author>
  <license>BSD</license>
  <reviewstatus="unreviewed" notes=""/>
  <url>http://ros.org/wiki/turtlesim</url>
  <dependpackage="roscpp"/>
  <dependpackage="roslib"/>
  <dependpackage="rosconsole"/>
  <dependpackage="std_srvs"/>
  
  <rosdepname="wxwidgets"/>

  <export>
   <cpp cflags="-I${prefix}/msg/cpp-I${prefix}/srv/cpp"/>
  </export>

  <platformos="ubuntu" version="9.04"/>
  <platformos="ubuntu" version="9.10"/>
  <platformos="ubuntu" version="10.04"/>
</package>-----得到turtlesim需要exwidgets

rosdep命令 ----根据ROS packages来安装系统变量
用法:
$ rosdepinstall [package]
例子:
$ rosdepinstall turtlesim
得到结果:
executing this script:   -----如果已经安装
 set -o errexit
#No Packages to install

set -o errexit  -----如果没有安装
set -o verbose


if [ ! -f /opt/ros/lib/libboost_date_time-gcc42-mt*-1_37.a ] ;then
  mkdir -p~/ros/ros-deps
  cd ~/ros/ros-deps
  wget --tries=10http://pr.willowgarage.com/downloads/boost_1_37_0.tar.gz
  tar xzfboost_1_37_0.tar.gz
  cd boost_1_37_0
  ./configure--prefix=/opt/ros
  make
  sudo make install
fi


if [ ! -f /opt/ros/lib/liblog4cxx.so.10 ] ; then
  mkdir -p~/ros/ros-deps
  cd ~/ros/ros-deps
  wget --tries=10http://pr.willowgarage.com/downloads/apache-log4cxx-0.10.0-wg_patched.tar.gz
  tar xzfapache-log4cxx-0.10.0-wg_patched.tar.gz
  cdapache-log4cxx-0.10.0
  ./configure--prefix=/opt/ros
  make
  sudo make install
fi

if [ ! -f /opt/ros/lib/libboost_date_time-gcc42-mt*-1_37.a ] ;then
  mkdir -p~/ros/ros-deps
  cd ~/ros/ros-deps
  wget --tries=10http://pr.willowgarage.com/downloads/boost_1_37_0.tar.gz
  tar xzfboost_1_37_0.tar.gz
  cd boost_1_37_0
  ./configure--prefix=/opt/ros
  make
  sudo make install
fi


if [ ! -f /opt/ros/lib/liblog4cxx.so.10 ] ; then
  mkdir -p~/ros/ros-deps
  cd ~/ros/ros-deps
  wget --tries=10http://pr.willowgarage.com/downloads/apache-log4cxx-0.10.0-wg_patched.tar.gz
  tar xzfapache-log4cxx-0.10.0-wg_patched.tar.gz
  cdapache-log4cxx-0.10.0
  ./configure--prefix=/opt/ros
  make
  sudo make install
fi
  
2,编译packages
     当所有的系统关联都已经被安装,我们就可以开始用 rosmake命令编译我们创建好的package

rosmake命令 ---编译package

(1)编译单个package
用法: 
$ rosmake[package]
例子: 
$ rosmakebeginner_tutorials
得到结果:
[ rosmake ] Packages requested are: ['beginner_tutorials']                  
[ rosmake ] Logging todirectory/home/jason/.ros/rosmake/rosmake_output-20110110-092837
[ rosmake ] Expanded args ['beginner_tutorials'] to:
['beginner_tutorials']    
[ rosmake ] Checking rosdeps compliance for packagesbeginner_tutorials.  This may take a fewseconds.
[ rosmake ] rosdep check passed all system dependencies inpackages           
[rosmake-0] Starting>>> roslib [ make ]                                 
[rosmake-0] Finished<<< roslib ROS_NOBUILDin package roslib                
[rosmake-1] Starting>>> roslang [ make ]                                
[rosmake-0] Starting>>> rosconsole [ make]                               
[rosmake-0] Finished<<< rosconsoleROS_NOBUILD in package rosconsole         
[rosmake-0] Starting>>> std_msgs [ make ]                               
[rosmake-1] Finished<<< roslangROS_NOBUILD in package roslang
 No Makefile in package roslang
[rosmake-0] Finished<<< std_msgsROS_NOBUILD in package std_msgs            
[rosmake-0] Starting>>> xmlrpcpp [ make ]                               
[rosmake-1] Starting>>> rospy [ make ]                                  
[rosmake-1] Finished<<< rospy ROS_NOBUILDin package rospy                  
[rosmake-0] Finished<<< xmlrpcppROS_NOBUILD in package xmlrpcpp            
[rosmake-0] Starting>>> roscpp [ make ]                                 
[rosmake-0] Finished<<< roscpp ROS_NOBUILDin package roscpp                
[rosmake-0] Starting>>> beginner_tutorials[ make ]                        
[rosmake-1] Starting>>> rosout [ make ]                                 
[rosmake-1] Finished<<< rosout ROS_NOBUILDin package rosout                
[ rosmake ] All 2 linesbeginner_tutorials: 0.1 sec ] [ 1Active 10/11 Complete ]
{-------------------------------------------------------------------------------
  mkdir: cannot createdirectory `build': Permission denied
-------------------------------------------------------------------------------}
[ rosmake ] Output from build of package beginner_tutorialswritten to:
[ rosmake ]   /home/jason/.ros/rosmake/rosmake_output-20110110-092837/beginner_tutorials/build_output.log
[rosmake-0] Finished<<< beginner_tutorials[FAIL] [ 0.09 seconds ]           
[ rosmake ] Halting due to failure in packagebeginner_tutorials. 
[ rosmake ] Waiting for other threads to complete.
[ rosmake ] Results:                                                  
[ rosmake ] Built 11 packages with 1 failures.                            
[ rosmake ] Summary output to directory                                  
[ rosmake ]/home/jason/.ros/rosmake/rosmake_output-20110110-092837 

(2)编译多个packages
用法:
$ rosmake[package1] [package2] [package3]
例子:
$ rosdepinstall turtle_teleop rxtools
$ rosmaketurtle_teleop roscpp_tutorials rospy_tutorials rxtools


原创粉丝点击