1、Kinect

1)安装

sudo apt-get install ros-indigo-openni-camera

sudo apt-get install ros-indigo-openni-launch

2)驱动

https://github.com/avin2/SensorKinect

运行之后添加PointCloud2在该框架下的主题选择为/camera/depth_register ,以及把Fixed Frame改成camera_link

以后尽量不使用虚拟机,因为它对真实设备的支持不怎么好。

2、Ladar

使用国产的rqlidar,成本比较低,

驱动的下载https://github.com/robopeak/rplidar_ros,放在catkin的workspace下面的src目录下,然后对其进行编译catkin_make

运行:

roslaunch rplidar_ros rplidar.launch

注意事项:

在运行之前需要修改port的权限

sudo chmod 777 ttyUSB0(或者AMC0或者AMC1)

运行roslaunch rplidar_ros view_rplidar.launch

3、Arduino

它是一个开源的硬件,是ROS支持最好的一款单片机,

运行之后会产生一系列的库文件,

4、发布传感器信息(fake sensor)

首先我们讲解的是fake odometry以及fake laser。

posewithcovariance 的消息定义是一个point类型(x,y,z)以及一个四元组的类型(x,y,z,w),以及一个6*6的协方差矩阵

TwistWithCovariance的消息定义是一个角速度和线速度,以及一个6*6的协方差矩阵

1、创建一个软件包

catkin_create_pkg fake_sensor roscpp  tf

2、编译之catkin_make

3、创建一个源文件odometry.cpp

#include<ros/ros.h>

#include<tf/transform_boradcaster.h>//tf转换的头文件

#include<nav_msgs/Odometry.h>//导航信息的头文件

int main(int argc,char **argv)

{

  ros::init(argc,argv,"state_publisher");//节点名字为state_publisher

  ros::NodeHandle n;

  //创建一个publisher,用来发布消息类型为nav_msgs::Odometry,发布到主题为odom上

  ros::Publisher odom_pub=n.advertise<nav_msgs::Odometry>("odom",10);

  //创建三个变量来初始化位置

  double x=0.0;

  double y=0.0;

  double th=0.0;

  //初始化速度

  double vx=0.4;

  double vy=0;

  double vth=0.2;//角速度

  //创建两个时间对象用来记录发生的时间,用时间相减就的到δt

  ros::Time current_time=ros::Time::now();

  ros::Time last_time=ros::Time::now();

  //创建一个tf树中广播器用来广播tf变换

  tf::TransformBroadcaster broadcaster;

  ros::Rate rate(10);//消息发布的频率

  //储存广播的tf变换

  geometry_msgs::TransformStamped odom_trans;

  //对其成员变量赋值

  odom_trans.header.frame_id="odom";//父坐标系为odom

  //child的frame_id设为如下,那么子坐标系为base_footprint

  odom_trans.child.frame_id="base_footprint";

  //下面来完成位置信息的变换

  while(ros::ok())

  {

  //更新一下current_time

  current_time=ros::Time::now();

  //计算位置变换和姿态的变换

  double dt=(current_time-last_time).toSec();//当前时间减去过去时间,并转换成秒

  double delta_x=(vx*cos(th)-vy*sin(th))*dt;

  double delta_y=(vx*sin(th)+vy*cos(th))*dt;

  double delta_th=vth*dt;

  //下面更新x,y,以及theta的值

  x+=delta_x;

  y+=delta_y;

  th+=delta_th;

  //创建一个四元组,下面返回的是一个geometry_msgs::Quaternion类型的消息

  geometry_msgs::Quaternion odom_quat=tf::createQuaternionMsgFromYaw(th);

  //下面更新一下transform消息

  odom_trans.header.stamp=current_time;

  odom_trans.transform.translation.x=x;

  odom_trans.transform.translation.y=y;

  odom_trans.transform.translation.z=0;

  odom_trans.transform.rotation=odo_quat;

  nav_msgs::Odometry odom;

  odom.header.stamp=current_time;

  odom.header.frame_id="odom";

  odom.child.frame_id="base_footprint";

  odom.pose.pose.position.x=x;

  odom.pose.pose.position.y=y;

  odom.pose.pose.position.z=0;

  odom.twist.twist.linear.x=vx;

  odom.twist.twist.linear.y=vy;

  odom.twist.twist.linear.z=0;

  odom.twist.twist.angular.z=vth;

  odom.twist.twist.angular.x=0;

  odom.twist.twist.angular.y=0;

  last_time=current_time;

  //把odometry_transform消息发布出去,以及把odom消息发布在odometry上

  broadcaster.sendTransform(odom_trans);

  odom_pub.publish(odom);

  }

  rate.sleep();

  return 0;

}

回顾一下在odometry里面做了哪些内容

首先创建了一个消息类型为nav_msgs::Odometry的发布者,发布主题为odom;

然后又创建了一个tf::TransformBroadcaster广播tf_transform变换.

接着创建了两个对应的消息,一个是geometry_msgs::TransformStamped用来储存tf变换的内容以及一个nav_msgs::Odometry的odom消息,用于更新它的位置信息以及姿态信息;然后通过odom_pub.publish(odom)发布出去。

以及利用broadcaster.sendTransform()方法发送odom_trans的tf变换。

下面修改CMakeLists.txt文件

add_executable(odometry src/odometry.cpp)

target_link_libraries(odometry ${catkin_LIBRARIES})

编译之catkin_make

运行之

rosrun fake_sensor odometry

rosrun rviz rviz

添加一个主题odometry

固定坐标系Fixed frame选择odom

由于没有为orientation赋值,改正之后

再添加一个tf看一下的他带来的相对变换

固定坐标系是odom,目标坐标系是base_footprint。

下面再来看一下激光雷达该怎么写!!!!!!!!!!

1、创建一个源文件

laser.cpp

#include<ros/ros.h>

#include<sensor_msgs/LaserScan.h>//导航信息的头文件

int main(int argc,char **argv)

{

  ros::init(argc,argv,"laser_scan_publisher");//节点名字为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];

  //创建一个count用来计数为ranges,intensities赋值

  int count;

  ros::Rate rate(1);

  //为ranges以及intensities赋值

  while(n.ok())

  {

  //利用for循环来赋值

  for(unsigned int i=0;i<num_readings;++i)

  {

    ranges[i]=count;

    intensities[i]=count+100;

  }

  ros::Time scan_time=ros::Time::now();

  //再创建一个laserscan的消息

  sensor_msgs::LaserScan scan;

  scan.header.stamp=scan_time;

  scan.header.frame_id="base_link"

  scan.angle.min=-1.57;//假设扫面范围是3.14弧度

  scan.angle.max=+1.57;

  scan.angle.increment=3.14/num_readings;

  scan.time_increment=(1/laser_frequency)/num_readings;//扫描一次的时间,频率分之一再除以step的总数

  scan.range_max=100;//扫描最大距离

  scan.range_min=0;//扫描最小距离

 // scan.ranges.resize(num_readings);

 // scan.intensities::sensor_msgs::LaserScan();

  //再由for循环给laserscan的ranges以及intensities赋值

  for(unsigned int i=0;i<num_readings;++i)

  {

    scan.ranges[i]=ranges[i];

    scan.intensities[i]=intensities[i];

  }

   //上面消息处理完了,下面发布消息

   scan_pub.publish(scan);

   ++count;

  rate.sleep();

}

}

看一下以上完成的工作:

首先创建了一个ros::publisher的发布者scan_pub,发布在scan主题上的sensor_msgs::LaserScan消息,然后创建两个数组并赋值,创建一个消息,把消息内的数组与上面的数组赋值,最后再发布消息。

进入到CMakeLists.txt文件

add_executable(laser src/laser.cpp)

target_link_libraries(laser ${catkin_LIBRARIES})

编译之catkin_make

运行rosrun fake_sensor laser

运行rostopic echo /scan -n 1

第十一课,ROS与传感器的更多相关文章

  1. Kali Linux Web 渗透测试视频教程—第十一课-扫描、sql注入、上传绕过

    Kali Linux Web 渗透测试视频教程—第十一课-扫描.sql注入.上传绕过 文/玄魂 原文链接:http://www.xuanhun521.com/Blog/2014/10/25/kali- ...

  2. NeHe OpenGL教程 第三十一课:加载模型

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. NeHe OpenGL教程 第二十一课:线的游戏

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. NeHe OpenGL教程 第十一课:飘动的旗帜

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. python第三十一课--递归(2.遍历某个路径下面的所有内容)

    需求:遍历某个路径下面的所有内容(文件和目录,多层级的) import os #自定义函数(递归函数):遍历目录层级(多级) def printDirs(path): dirs=os.listdir( ...

  6. [ROS]一些传感器数据读取融合问题的思考

    思考问题: 1. 如何实现传感器数据的融合,或者说时间同步? 比如里程计读数和雷达数据融合? void SlamGMapping::startLiveSlam() { entropy_publishe ...

  7. 斯坦福第十一课:机器学习系统的设计(Machine Learning System Design)

    11.1  首先要做什么 11.2  误差分析 11.3  类偏斜的误差度量 11.4  查全率和查准率之间的权衡 11.5  机器学习的数据 11.1  首先要做什么 在接下来的视频中,我将谈到机器 ...

  8. Asp.Net Web API 2第十一课——在Web API中使用Dependency Resolver

    前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html 本文主要来介绍在Asp.N ...

  9. 第三十一课:JSDeferred详解2

    这一课,我们先接着上一课讲一下wait方法,以及wait方法是如何从静态方法变化实例方法的. 首先我们先看wait方法为啥可以从静态方法变成实例方法,请看register源码: Deferred.re ...

随机推荐

  1. 使用微软的MSBuild.exe编译VS .sln .csproj 文件

    最近在看一些算法和测试一些程序,以及帮团队测试程序,团队使用了vs开发环境创建的sln项目文件,我使用的是公司的机器,没有任何权限安装程序等操作,但是又需要编译一些程序,所以我想到了,使用MSBuil ...

  2. php通过存储过程传入汉字参数并写入数据库

    写入数据库,汉字为???样式的乱码,后根据网上介绍的方法,参数前加N,数据库汉字内容变成空白. 解决方法,在PHP中先转为base64,再在mysql中base64解码,前提先保证mysql中有bas ...

  3. 第14篇 PSR-3规范(日志)

    1. Specification 1.1 Basics The LoggerInterface exposes eight methods to write logs to the eight RFC ...

  4. java动态画圈圈。运用多线程,绘图

    总结:只是意外的收获吧.之前一篇是老师教的,一个点,从底层开始升起,到鼠标按下的地方开始画圈圈, 现在改变了一下,因为点上升的一个循环和画圈的循环是分开的 现在让点点自己跑,并且边跑边画圈.而且在fo ...

  5. PTA 词频统计(30 分)

    词频统计(30 分) 请编写程序,对一段英文文本,统计其中所有不同单词的个数,以及词频最大的前10%的单词. 所谓“单词”,是指由不超过80个单词字符组成的连续字符串,但长度超过15的单词将只截取保留 ...

  6. PHP命名空间带来的干扰

    有时候,不想受命名空间约束,就可以整一个全局类. protected function sendDayuSms($tel,$code,$template_type,$product = "[ ...

  7. python开发IO模型:阻塞&非阻塞&异步IO&多路复用&selectors

    一 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非 ...

  8. C/S模式客户端连接服务器连接不上的问题

    C/S模式客户端连接服务器连接不上的问题 1.服务器电脑防火墙关闭 2.服务器端SQL SERVER2008R: 配置工具--SQL SERVER配置管理器 MSSQLSERVER协议.客户端协议(S ...

  9. fiddler代理hosts配置

    1 需求背景 fidder开启后,C:\Windows\System32\drivers\etc\hosts配置失效问题:fiddler本身代理hosts配置表,修改后,可以省去在手机等代理使用者的系 ...

  10. 1.4 Application应用

    使用celery第一件要做的最为重要的事情是需要先创建一个Celery实例,我们一般叫做celery应用,或者更简单直接叫做一个app.app应用是我们使用celery所有功能的入口,比如创建任务,管 ...