机器人与人工智能爱好者论坛

 找回密码
 立即注册
查看: 6292|回复: 0
打印 上一主题 下一主题

ROS下创建meta_package

[复制链接]

285

主题

451

帖子

1万

积分

超级版主

Rank: 8Rank: 8

积分
13711
跳转到指定楼层
楼主
发表于 2015-11-28 21:29:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
ROS下创建meta_package
2015-11-28 16:14   yaked
作者同意转载到本论坛,原文地址:http://blog.csdn.net/yaked/article/details/50083783

1.背景

        不知道大家有没有这样的经历,自己的catkin_ws/src下的package越来越多了,每次运行的时候,都得先去确认一下package的名字。有没有像ROS by example的代码rbx1那样,将这本书的所有package全部集中到一个metapackage下。比如我们实验室用的机器人是youbot,那么我可以把自己写的代码全部放在一个地方,比如叫youbot_yw,创建的package都放在它里面,比如vision, navigation等等。而另外一个同学他写的代码也可以放在一个属于他的metapackage里面,这样就知道代码到底是谁的了,也便于编译。但是我查了一下,ROS官网也没有关于这个的tutorial,因此我把rbx1的写法仔细看了一下,就形成了这篇文章,希望大家都能拥有自己的metapackage。


2.预备知识

        关于metapackage,观察rbx1的结构,要成为metapackage,它子目录下必须有一个和它同名的文件夹。然后才是一些正常的package,比如这里的rbx1_bringup等。

2.1建立自己的metapackage

  1. cd catkin_ws/src/
  2. mkdir -p yw_youbot/yw_youbot
复制代码
这里我创建的metapackage名字为yw_youbot,然后
  1. cd yw_youbot/yw_youbot
复制代码
建立CMakeList.txt和package.xml文件(你也可以直接把rbx1/rbx1下的拷贝过来,我就是这么干的,记得根据自己的情况修改project里的内容),我的CMakeList.txt内容如下

  1. cmake_minimum_required(VERSION 2.8.3)
  2. project(yw_youbot)
  3. find_package(catkin REQUIRED)
  4. catkin_metapackage()
复制代码

package.xml内容如下
  1. <package>
  2.   <name>yw_youbot</name>
  3.   <version>0.4.0</version>
  4.   <description>ROS By Example Volume 1</description>
  5.   <maintainer email="patrick@pirobot.org">Patrick Goebel</maintainer>

  6.   <license>BSD</license>

  7.   <url type="website">http://ros.org/wiki/rbx_vol_1</url>

  8.   <url type="bugtracker">https://github.com/pirobot/rbx1/issues</url>

  9.   <author email="patrick@pirobot.org">Maintained by Patrick Goebel</author>

  10.   <buildtool_depend>catkin</buildtool_depend>


  11.   <export>
  12.     <metapackage/>
  13.   </export>
  14. </package>
复制代码


至此,metapackage就建立完毕,虽然里面还没有任何package,有人会说这么简单,咱们编译看看
  1. cd ~/catkin_ws
  2. catkin_make
复制代码


2.2 创建一个hello_world来测试

        接下来就和我们平时正常的一样的,我们以前是在catkin_ws/src下创建package,现在我们在metapackage yw_youbot下创建一个package,这里的package名字为hello_world,依赖于系统的roscpp


  1. cd ~/catkin_ws/src/yw_youbot
  2. catkin_create_pkg hello_world roscpp
  3. cd hello_world/src
  4. gedit hello_world_node.cpp
复制代码

以上在src下建立来一个名为hello_world_node.cpp的文件,内容如下
  1. #include <ros/ros.h>

  2. int main(int argc, char** argv)
  3. {
  4.         ros::init(argc, argv, "hello_meta_package_node");
  5.         ros::NodeHandle nh;
  6.         
  7.         ROS_INFO("Hello ROS!");
  8.         
  9.         ros::spin();
  10. }
复制代码


打印一句hello ROS,编译的话,别忘了修改hello_world这个package下的CMakeList.txt如下
  1. cmake_minimum_required(VERSION 2.8.3)
  2. project(hello_world)

  3. find_package(catkin REQUIRED COMPONENTS
  4.   roscpp
  5. )

  6. catkin_package()

  7. include_directories( ${catkin_INCLUDE_DIRS})

  8. add_executable(hello_world_node src/hello_world_node.cpp)

  9. target_link_libraries(hello_world_node ${catkin_LIBRARIES})
复制代码


最后命令行编译
  1. cd ~/catkin_ws
  2. catkin_make
复制代码



启动roscore检查刚刚编译的程序
  1. roscore
复制代码


打开另一个终端
  1. rosrun hello_world hello_world_node
复制代码



至此,可以看见我们在metapackage下建立的hello_world 的package完全是可以运行的,其实,创建的过程完全是在第一部分,后面这个只是为了检验而已。

3. 写在最后

这里注意一个问题,rbx1的子目录rbx1中package.xml中是如下写的


  1. <package>
  2.   <name>rbx1</name>
  3.   <version>0.4.0</version>
  4.   <description>ROS By Example Volume 1</description>
  5.   <maintainer email="patrick@pirobot.org">Patrick Goebel</maintainer>

  6.   <license>BSD</license>

  7.   <url type="website">http://ros.org/wiki/rbx_vol_1</url>

  8.   <url type="bugtracker">https://github.com/pirobot/rbx1/issues</url>

  9.   <author email="patrick@pirobot.org">Maintained by Patrick Goebel</author>

  10.   <buildtool_depend>catkin</buildtool_depend>

  11.   <run_depend>rbx1_description</run_depend>
  12.   <run_depend>rbx1_speech</run_depend>
  13.   <run_depend>rbx1_dynamixels</run_depend>
  14.   <run_depend>rbx1_nav</run_depend>
  15.   <run_depend>rbx1_apps</run_depend>
  16.   <run_depend>rbx1_bringup</run_depend>
  17.   <run_depend>rbx1_vision</run_depend>

  18.   <export>
  19.     <metapackage/>
  20.   </export>
  21. </package>
复制代码


注意到上面的run_depend了吗?这里是run_depend的运行时依赖,其中的一些package会依赖另外的一些package。也就是说当我们metapackage下的package互相依赖时,是需要加入到与metapackage同名目录下的xml中的。

ROS官网我印象中看到过xml里export的相关内容,但是没有找到。有找到的小伙伴可以留言提醒一下,先谢谢了。

ROS官方的github上有一点关于metapackage xml的内容



我是笨鸟,我先飞!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|Archiver|手机版|小黑屋|陕ICP备15012670号-1    

GMT+8, 2024-5-1 19:04 , Processed in 0.057270 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表