ROS学习笔记3-基础概念

命名空间

引用
http://blog.csdn.net/u014587147/article/details/75647002

  • frame_id
    frame_id 是消息中与数据相关联的参考系id,例如在在激光数据中,frame_id对应激光数据采集的参考系
    如下代码中的frame_id所示意思
#include 
#include 
 
int main(int argc, char** argv){
  ros::init(argc, argv, "laser_scan_publisher");
 
  ros::NodeHandle n;
  ros::Publisher scan_pub = n.advertise("scan", 50);
 
  unsigned int num_readings = 100;
  double laser_frequency = 40;
  double ranges[num_readings];
  double intensities[num_readings];
 
  int count = 0;
  ros::Rate r(1.0);
  while(n.ok()){
    //generate some fake data for our laser scan
    for(unsigned int i = 0; i < num_readings; ++i){
      ranges[i] = count;
      intensities[i] = 100 + count;
    }
    ros::Time scan_time = ros::Time::now();
 
    //populate the LaserScan message
    sensor_msgs::LaserScan scan;
    scan.header.stamp = scan_time;
    scan.header.frame_id = "laser_frame";
    scan.angle_min = -1.57;
    scan.angle_max = 1.57;
    scan.angle_increment = 3.14 / num_readings;
    scan.time_increment = (1 / laser_frequency) / (num_readings);
    scan.range_min = 0.0;
    scan.range_max = 100.0;
 
    scan.ranges.resize(num_readings);
    scan.intensities.resize(num_readings);
    for(unsigned int i = 0; i < num_readings; ++i){
      scan.ranges[i] = ranges[i];
      scan.intensities[i] = intensities[i];
    }
 
    scan_pub.publish(scan);
    ++count;
    r.sleep();
  }
}
  • NodeHandle参数范围

引用博客
NodeHandle问题

问题如下:

ros::init(argc, argv, "my_node_name");  
ros::NodeHandle nh1("~");  //"~"代表 node_name
ros::NodeHandle nh2("~foo");  

nh1的命名空间(namespace)是 /my_node_name,而nh2的namespace是 /my_node_name/foo
这里只是一个例子,一个ros的node只有一个NodeHandle,它提供这个node的对于topic的收发功能

程序包的概念剖析

  • ros的公共包在什么位置
    例如:kinetic的一般性的包 比如 rviz,turtlesim所在位置目录如下
    /opt/ros/kinetic/share
  • rosrun所运行的 包的 可执行node所在位置
    /opt/ros/kinetic/lib
  • 一个catkin程序包由什么组成
    1、该程序包必须包含catkin compliant package.xml文件
    这个package.xml文件提供有关程序包的元信息。
    2、程序包必须包含一个catkin 版本的CMakeLists.txt文件,而Catkin metapackages中必须包含一个对CMakeList.txt文件的引用。
    3、每个目录下只能有一个程序包。
    这意味着在同一个目录下不能有嵌套的或者多个程序包存在。

最简单的程序包也许看起来就像这样:

my_package/
CMakeLists.txt
package.xml
  • metapackage
    如何标记一个包为metapackage
    在 package.xml如果看到下面字样,则为metapackage

   
 

2、metapackage的cmakelist样式
Additionally a metapackage has a required, boilerplate CMakeLists.txt file:

cmake_minimum_required(VERSION 2.8.3)
project()
find_package(catkin REQUIRED)
catkin_metapackage()
  • 程序包和node的关系
    一个程序包可以建好几个运行的node
    程序包就像是class,node就是实例

NodeHandle句柄

引用
ROS Nodehandle句柄

私有命名空间~
~是nodename
nodename/name1/name2/...

默认是nodenamespace
node_namespace和node_name是两回事!
ros::NodeHandle nh("~my_private_namespace");
ros::Subscriber sub = nh.subscribe("my_private_topic",....);
以上例子会订阅/my_private_namespace/my_private_topic

ros::NodeHandle nh("/my_global_namespace");
这种做法并不推荐,因为这样会使得节点无法被放入别的命名空间。只是有时在代码中使用全局名字有用。

你可能感兴趣的:(ROS学习笔记3-基础概念)