ROS学习笔记3-基础概念
2017-11-08 本文已影响0人
scott_yu779
命名空间
- frame_id
frame_id 是消息中与数据相关联的参考系id,例如在在激光数据中,frame_id对应激光数据采集的参考系
如下代码中的frame_id所示意思
#include <ros/ros.h>
#include <sensor_msgs/LaserScan.h>
int main(int argc, char** argv){
ros::init(argc, argv, "laser_scan_publisher");
ros::NodeHandle n;
ros::Publisher scan_pub = n.advertise<sensor_msgs::LaserScan>("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
<export>
<metapackage />
</export>
2、metapackage的cmakelist样式
Additionally a metapackage has a required, boilerplate CMakeLists.txt file:
cmake_minimum_required(VERSION 2.8.3)
project(<PACKAGE_NAME>)
find_package(catkin REQUIRED)
catkin_metapackage()
- 程序包和node的关系
一个程序包可以建好几个运行的node
程序包就像是class,node就是实例
NodeHandle句柄
私有命名空间~
~是nodename
nodename/name1/name2/...
默认是nodenamespace
node_namespace和node_name是两回事!
ros::NodeHandle nh("~my_private_namespace");
ros::Subscriber sub = nh.subscribe("my_private_topic",....);
以上例子会订阅<node_name>/my_private_namespace/my_private_topic
ros::NodeHandle nh("/my_global_namespace");
这种做法并不推荐,因为这样会使得节点无法被放入别的命名空间。只是有时在代码中使用全局名字有用。