ROS基础

工作空间

典型的目录空间:1.代码空间src;2.编译空间build;3.开发空间devel;4.安装空间install。
初始化工作空间:catkin_init_workspace


功能包

ROS不允许功能包的嵌套,多个功能包必须平行放置在代码空间中。
创建功能包:catkin_create_pkg [depend1] [depend2]


工作空间的覆盖

ROS优先查找ROS_PACKAGE_PATH环境变量中最前端的工作空间


话题

  • Publisher的实现过程
  1. 初始化ROS节点
  2. 向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型
  3. 按照一定的频率循环发布消息
  • Subscriber的实现过程
  1. 初始化ROS节点
  2. 订阅需要的话题
  3. 循环等待话题消息,接受到消息后进入回调函数
  4. 在回调函数中完成消息处理

subscribe的回调函数传入多个参数需要使用boost::bind,其中_x是占位符,用引用形式向回调函数传参并不会改变实参的值,具体原因未知
ros::Subscriber trackbox_sub = nh.subscribe("/camshift/track_box", 1, boost::bind(&directionCalc, _1, dir));
如果需要保存回调函数得到的值,并改变某些变量的值,需要使用subscribe的第四个参数,即用一个类实例来完成传参的功能。

ros::Subscriber trackbox_sub = nh.subscribe("/camshift/track_box", 1, &CalcDirection::getCenter, &calcdir);

// 其中CalcDirection的定义如下
class CalcDirection{
    public:
        void getCenter(const opencv_apps::RotatedRectStampedConstPtr &ptarget);
        void init(int width, int height, double area_threshold, int tolerance);
        void calcDirection(ball_follow::Direction &dir);            

        opencv_apps::Point2D _center;
        int _width, _height;
        int _tolerance;
        double _area, _area_threshold;
};

Subscriber的回调函数订阅的话题需要用指针获取,如
void directionCalc(const opencv_apps::RotatedRectStampedConstPtr &target)


服务

  • Server的实现过程
  1. 初始化ROS节点
  2. 创建Server实例
  3. 循环等待服务请求,进入回调函数
  4. 在回调函数中完成服务功能的处理并反馈应答数据
  • Client的实现过程
  1. 初始化ROS节点
  2. 创建Client实例
  3. 发布服务请求数据
  4. 等待Server处理之后的应答结果

命名空间

ROS中的节点、参数、话题和服务统称计算图源。计算图元中常用以下三种名称

节点 相对名称(默认) 全局名称 私有名称
/node1 Bar->/bar /bar->/bar ~bar->node1/bar
wg/node2 Bar->/wg/bar /bar->/bar ~bar->/wg/node2/bar
/wg/node3 foo/bar->/wg/foo/bar /foo/bar->/foo->bar ~foo->bar->/wg/node3/foo/bar

你可能感兴趣的:(ROS基础)