---恢复内容开始---

1、stage simulator

它是一个轻量级的仿真软件,它的包名称是stage_ros,可以进入看看,其包含地图在子目录world下,

启动之:

rosrun stage_ros stageros 'rospack find stage_ros'/world/willow-four-erratics-...world

可以查看它发布的主题有哪些,通过rostopic list;

下面查看一下地图的格式:cat willow.erratic.world

其实在world文件中包含下面几个模块

下面是每一个模型详细的说明:

下面通过订阅和发布的主题来了解一下该如何使用这款仿真软件

控制机器人的运动

首先要安装sudo apt-get install ros-indigo-teleop-twist-keyboard

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

简单的保存gmapping以及保存map

下面运行gmapping包下面的slam_gmapping,然后scan订阅的主题是base_scan。

rosrun gmapping slam_gmapping scan:=base_scan

下面语句为保存地图

rosrun map_server map_saver

下面来看一下激光雷达的应用:障碍物的检测

假设激光雷达的测量范围是270度,上面的橘黄线表示x轴,绿线表示的是y轴,以-135度即range[0]作为起始,把它作为储存距离信息的第一个数,range[1080]作为最后一个。

下面是它的sensor_msgs/LaserScan.msg里面的相关信息,

std_msgs/Header header

float32 angle_min->-135度

float32 angle_max->+135度

float32 angle_increment->指的角度的分辨率,指扫一次角度的变换,为0.25度;

float32 time_increment可以理解为扫一步所花费的时间

float32 scan_time扫面的时间

float32 range_min扫描的最小距离

float32 range_max扫描的最长距离

float32[] ranges储存的是距离的信息

float32[] intensities如果前面有一块玻璃那么强度为1,如果完全为吸收掉则强度为0.

下面用stage_ros来做避障

在讲避障之前,看一下它的tf变换

运行该节点,且在rviz当中来看其变换

rosrun stage_ros stageros 'rospack find stage_ros'/world/willow-four-erratics-...world

rosrun rviz rviz

将fixed frame选择为odom

然后添加一个地图

以及

下面写一个避障的程序,碰到障碍物停下来,订阅主题为/turtlesim/cmd_vel

1、创建一个包

catkin_create_pkg my_stage roscpp std_msgs

2、编译catkin_make

3、源文件名:my_stage.cpp

#include<ros/ros.h>
#include<sensor_msgs/LaserScan.h>
#include<geometry_msgs/Twist.h>//控制机器人运动的消息
//写一个类来控制机器人运动
class Stopper
{
public:
//静态常量 运动速度
const static double FORWARD_SPEED_MPS =0.5;
//静态常量 最小的扫描角度
const static double MIN_SCAN_ANGLE_RAO=-/*M_PI;
//定义一个最大扫描角度
const static double MAX_SCAN_ANGLE_RAO=+/*M_PI;
//声明一个常量,希望的zhang ai wu de 最近距离为0.5米
const static float MIN_PROXIMITY_RANGE_M=0.5;
//构造函数
Stopper();
//写一个函数
   void startMoving();

  //声明私有成员
  ros::NodeHandle node;
  ros::Publisher commandPub;//用于发布速度信息
  ros::Subscriber laserSub;//用来订阅base_scan,用来获得激光雷达的数据
  bool keepMoving;//声明一个布尔类型的指示器
  void moveForward();//控制机器人向前运动
  void scanCallback(const sensor_msgs::LaserScan::ConstPtr& scan);//定义laser_scan的回调函数
};
  //实现构造函数
  Stopper::Stopper()
  {
    //首先把keepMoveing赋值为TRUE
    keepMoving=true;
    commandPub=node.advertise<geometry_msgs::Twist>("cmd_vel",10);//发布消息主题为
    //订阅消息订阅主题为base_scan
    laserSub=node.subscribe("base_scan",1,&Stopper::scanCallback,this);
  }
//move_forward函数的实现
  void Stopper::moveForward()
  {
    geometry_msgs::Twsit msg;
    msg.linear.x=FORWARD_SPEED_MPS;
    commandPub.publish(msg);//发布这个消息
  }
//回调函数的实现
void Stopper::scanCallback(const sensor_msgs::LaserScan::ConstPtr &scan)
{
  int minIndex,maxIndex;//定义最小以及最大索引
  minIndex=ceil((MIN_SCAN_ANGLE_RAO-scan->angle_min)/scan->angle_increment);//为指定扫描的最小角度减去激光雷达扫描的最小角度除以增量
  maxIndex=floor((MAX_SCAN_ANGLE_RAO-scan->angle_min)/scan->angle_increment);
//把最近的距离设为下标为minIndex
  for(int currIndex=minIndex+1;currIndex<=maxIndex;currIndex++)
  {
    if(scan->ranges[currIndex]<closestRange)
    {
      closestRange=scan->ranges[currIndex];//从minIndex到maxIndex寻找最小距离并赋值给closestRange
    }
  }
  //输出最小距离
  ROS_INFO_STREAM("Closest range:" <<closestRange);
//如果最近的距离比期望的最小距离还要近的话,就输出STOP
  if(closestRange<MIN_PROXIMITY_RANGE_M)
  {
    ROS_INFO("Stop!");
    keepMoving=false;
  }
}
//StopMoving函数
void Stopper::startMoving()
{
  ros::Rate rate(10);
  ROS_INFO("start moving!");
  while(ros::ok()&&keepMoving)
  {
    moveforward();
    ros::spinOnce();
    rate.sleep();
  }
} int main(int argc,char **argv)
{
  ros::init(argc,argv,"stopper");
  Stopper stopper;
  stopper.startMoving();
  return 0;
}

下面进入CMakeLists.txt文件里面去修改
add_executable(my_stage src/my_stage.cpp)

target_Link_libraries(my_stage ${catkin_LIBRARIES})

下面去编译

catkin_make;

下面去启动stage仿真器

rosrun stage_ros stageros `rospack find stage_ros`/world/willow-erratic.world

运行之:

rosrun my_stage my_stage

它是一直往前走直到遇到障碍物之后就停止下来。

---恢复内容结束---

1、stage simulator

它是一个轻量级的仿真软件,它的包名称是stage_ros,可以进入看看,其包含地图在子目录world下,

启动之:

rosrun stage_ros stageros 'rospack find stage_ros'/world/willow-four-erratics-...world

可以查看它发布的主题有哪些,通过rostopic list;

下面查看一下地图的格式:cat willow.erratic.world

其实在world文件中包含下面几个模块

下面是每一个模型详细的说明:

下面通过订阅和发布的主题来了解一下该如何使用这款仿真软件

控制机器人的运动

首先要安装sudo apt-get install ros-indigo-teleop-twist-keyboard

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

简单的保存gmapping以及保存map

下面运行gmapping包下面的slam_gmapping,然后scan订阅的主题是base_scan。

rosrun gmapping slam_gmapping scan:=base_scan

下面语句为保存地图

rosrun map_server map_saver

下面来看一下激光雷达的应用:障碍物的检测

假设激光雷达的测量范围是270度,上面的橘黄线表示x轴,绿线表示的是y轴,以-135度即range[0]作为起始,把它作为储存距离信息的第一个数,range[1080]作为最后一个。

下面是它的sensor_msgs/LaserScan.msg里面的相关信息,

std_msgs/Header header

float32 angle_min->-135度

float32 angle_max->+135度

float32 angle_increment->指的角度的分辨率,指扫一次角度的变换,为0.25度;

float32 time_increment可以理解为扫一步所花费的时间

float32 scan_time扫面的时间

float32 range_min扫描的最小距离

float32 range_max扫描的最长距离

float32[] ranges储存的是距离的信息

float32[] intensities如果前面有一块玻璃那么强度为1,如果完全为吸收掉则强度为0.

下面用stage_ros来做避障

在讲避障之前,看一下它的tf变换

运行该节点,且在rviz当中来看其变换

rosrun stage_ros stageros 'rospack find stage_ros'/world/willow-four-erratics-...world

rosrun rviz rviz

将fixed frame选择为odom

然后添加一个地图

以及

下面写一个避障的程序,碰到障碍物停下来,订阅主题为/turtlesim/cmd_vel

1、创建一个包

catkin_create_pkg my_stage roscpp std_msgs

2、编译catkin_make

3、源文件名:my_stage.cpp

#include<ros/ros.h>
#include<sensor_msgs/LaserScan.h>
#include<geometry_msgs/Twist.h>//控制机器人运动的消息
//写一个类来控制机器人运动
class Stopper
{
public:
//静态常量 运动速度
const static double FORWARD_SPEED_MPS =0.5;
//静态常量 最小的扫描角度
const static double MIN_SCAN_ANGLE_RAO=-/*M_PI;
//定义一个最大扫描角度
const static double MAX_SCAN_ANGLE_RAO=+/*M_PI;
//声明一个常量,希望的zhang ai wu de 最近距离为0.5米
const static float MIN_PROXIMITY_RANGE_M=0.5;
//构造函数
Stopper();
//写一个函数
   void startMoving();

  //声明私有成员
  ros::NodeHandle node;
  ros::Publisher commandPub;//用于发布速度信息
  ros::Subscriber laserSub;//用来订阅base_scan,用来获得激光雷达的数据
  bool keepMoving;//声明一个布尔类型的指示器
  void moveForward();//控制机器人向前运动
  void scanCallback(const sensor_msgs::LaserScan::ConstPtr& scan);//定义laser_scan的回调函数
};
  //实现构造函数
  Stopper::Stopper()
  {
    //首先把keepMoveing赋值为TRUE
    keepMoving=true;
    commandPub=node.advertise<geometry_msgs::Twist>("cmd_vel",10);//发布消息主题为
    //订阅消息订阅主题为base_scan
    laserSub=node.subscribe("base_scan",1,&Stopper::scanCallback,this);
  }
//move_forward函数的实现
  void Stopper::moveForward()
  {
    geometry_msgs::Twsit msg;
    msg.linear.x=FORWARD_SPEED_MPS;
    commandPub.publish(msg);//发布这个消息
  }
//回调函数的实现
void Stopper::scanCallback(const sensor_msgs::LaserScan::ConstPtr &scan)
{
  int minIndex,maxIndex;//定义最小以及最大索引
  minIndex=ceil((MIN_SCAN_ANGLE_RAO-scan->angle_min)/scan->angle_increment);//为指定扫描的最小角度减去激光雷达扫描的最小角度除以增量
  maxIndex=floor((MAX_SCAN_ANGLE_RAO-scan->angle_min)/scan->angle_increment);
//把最近的距离设为下标为minIndex
  for(int currIndex=minIndex+1;currIndex<=maxIndex;currIndex++)
  {
    if(scan->ranges[currIndex]<closestRange)
    {
      closestRange=scan->ranges[currIndex];//从minIndex到maxIndex寻找最小距离并赋值给closestRange
    }
  }
  //输出最小距离
  ROS_INFO_STREAM("Closest range:" <<closestRange);
//如果最近的距离比期望的最小距离还要近的话,就输出STOP
  if(closestRange<MIN_PROXIMITY_RANGE_M)
  {
    ROS_INFO("Stop!");
    keepMoving=false;
  }
}
//StopMoving函数
void Stopper::startMoving()
{
  ros::Rate rate(10);
  ROS_INFO("start moving!");
  while(ros::ok()&&keepMoving)
  {
    moveforward();
    ros::spinOnce();
    rate.sleep();
  }
} int main(int argc,char **argv)
{
  ros::init(argc,argv,"stopper");
  Stopper stopper;
  stopper.startMoving();
  return 0;
}

下面进入CMakeLists.txt文件里面去修改
add_executable(my_stage src/my_stage.cpp)

target_Link_libraries(my_stage ${catkin_LIBRARIES})

下面去编译

catkin_make;

下面去启动stage仿真器

rosrun stage_ros stageros `rospack find stage_ros`/world/willow-erratic.world

运行之:

rosrun my_stage my_stage

它是一直往前走直到遇到障碍物之后就停止下来。

第九课,ROS仿真1的更多相关文章

  1. NeHe OpenGL教程 第九课:移动图像

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

  2. 【C语言探索之旅】 第二部分第九课: 实战"悬挂小人"游戏 答案

    内容简介 1.课程大纲 2.第二部分第九课: 实战"悬挂小人"游戏 答案 3.第二部分第十课预告: 安全的文本输入 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题, ...

  3. 【C语言探索之旅】 第一部分第九课:函数

    内容简介 1.课程大纲 2.第一部分第九课:函数 3.第一部分第十课预告: 练习题+习作 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. ...

  4. Python第九课学习

    Python第九课学习 数据结构: 深浅拷贝 集合set 函数: 概念 创建 参数 return 定义域 www.cnblogs.com/yuanchenqi/articles/5782764.htm ...

  5. Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation

    原文:Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ...

  6. 如何用three.js搭建处理3D园区、3D楼层、3D机房管线(机房升级版)-第九课(二)

    接着上一篇文章,<如何用webgl(three.js)搭建处理3D园区.3D楼层.3D机房管线问题(机房升级版)-第九课(一)> 继续讲解关于三维数据中心管线可视化的解决方案. 上一篇我们 ...

  7. 第十课,ROS仿真2

    Rviz 属性 1.下面以turtlebot_stage inRviz为例 首先安装 sudo apt-get install ros-indigo-turtlebot-simulator 运行 ro ...

  8. OpenGL学习进程(12)第九课:矩阵乘法实现3D变换

    本节是OpenGL学习的第九个课时,下面将详细介绍OpenGL的多种3D变换和如何操作矩阵堆栈.     (1)3D变换: OpenGL中绘制3D世界的空间变换包括:模型变换.视图变换.投影变换和视口 ...

  9. Ng第九课:神经网络的学习(Neural Networks: Learning)

    9.1  代价函数 9.2  反向传播算法 9.3  反向传播算法的直观理解 9.4  实现注意:展开参数 9.5  梯度检验 9.6  随机初始化 9.7  综合起来 9.8  自主驾驶 9.1   ...

随机推荐

  1. fir分布式滤波的fpga实现

    此设计的结构包括:1.移位寄存器链,n阶的有n-1个寄存器. 2.第一次累加部分.由fir滤波系数对称可得到对称的寄存器相加可以减小电路规模,所以第一次累加很有必要. 3,锁存并移位部分.此部分是为了 ...

  2. 给System.Timer类的Elapsed事件加锁

    背景: 最近在做一个项目,程序是命令行程序,在主程序中开一个线程,这个线程用到了System.Timer类的Elapsed事件,根据指定时间间隔循环去查询数据库,找符合条件的记录,把记录组织成xml对 ...

  3. Linux 绑定双网卡

    1.立即关闭iptables并禁用开机自启动[root@mysql01 ~]# /etc/init.d/iptables stop[root@mysql01 ~]# chkconfig iptable ...

  4. [Client] looks like we got no XML document in....

    无wsdl方式应用webservice时,服务端包含了 include_once'inc/utility_all.php '一直报[Client] looks like we got no XML d ...

  5. 完整的qt安装教程

    大家可能认为qt收费了 其实不是 大家直接点击 这个 Community 这里的下载 Download 然后呢 就跳转到这个界面 点击 Qt Offline Installer 就会跳到这个地方 滑下 ...

  6. mysql实战优化之二:limit优化(大表翻页查询时) sql优化

    mysql的表test中有20105119行数据.建立索引:data_status,place_cargo_status 场景1: SELECT id, resource_id, resource_t ...

  7. 异步通知与异步I/O

    异步通知:很简单,一旦设备准备好,就主动通知应用程序,这种情况下应用程序就不需要查询设备状态,这是不是特像硬件上常提的"中断的概念".上边比较准确的说法其实应该叫做"信号 ...

  8. 16c550芯片编写的优化

    参考了 <Altera FPGA/CPLD 设计>高级篇, 关于状态机的推荐写法实现的功能是一样的但是编译使用的逻辑门如下图: 下图是我自己编的状态机需要的逻辑: 下图是使用推荐的有限状态 ...

  9. 实用webpack-dev-server

    webpack-dev-server的作用 文件作出改动之后,保存,立即开始编译文件 编译后的文件是保存在内存中的,在项目文件夹中看不到编译后的文件 编译完成之后立即自动刷新浏览器 测试webpack ...

  10. JAVA,模拟HTTP登录(略有修改) ----转载自http://zhoujingxian.iteye.com/blog/439738

    /* * 网上的一个模拟登录或者模拟注册程序 * 2013-8-5 */ package Socket_Http; import java.io.BufferedReader; import java ...