第九课,ROS仿真1
---恢复内容开始---
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的更多相关文章
- NeHe OpenGL教程 第九课:移动图像
		转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ... 
- 【C语言探索之旅】 第二部分第九课: 实战"悬挂小人"游戏 答案
		内容简介 1.课程大纲 2.第二部分第九课: 实战"悬挂小人"游戏 答案 3.第二部分第十课预告: 安全的文本输入 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题, ... 
- 【C语言探索之旅】 第一部分第九课:函数
		内容简介 1.课程大纲 2.第一部分第九课:函数 3.第一部分第十课预告: 练习题+习作 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏. ... 
- Python第九课学习
		Python第九课学习 数据结构: 深浅拷贝 集合set 函数: 概念 创建 参数 return 定义域 www.cnblogs.com/yuanchenqi/articles/5782764.htm ... 
- Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation
		原文:Elasticsearch7.X 入门学习第九课笔记-----聚合分析Aggregation 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. ... 
- 如何用three.js搭建处理3D园区、3D楼层、3D机房管线(机房升级版)-第九课(二)
		接着上一篇文章,<如何用webgl(three.js)搭建处理3D园区.3D楼层.3D机房管线问题(机房升级版)-第九课(一)> 继续讲解关于三维数据中心管线可视化的解决方案. 上一篇我们 ... 
- 第十课,ROS仿真2
		Rviz 属性 1.下面以turtlebot_stage inRviz为例 首先安装 sudo apt-get install ros-indigo-turtlebot-simulator 运行 ro ... 
- OpenGL学习进程(12)第九课:矩阵乘法实现3D变换
		本节是OpenGL学习的第九个课时,下面将详细介绍OpenGL的多种3D变换和如何操作矩阵堆栈. (1)3D变换: OpenGL中绘制3D世界的空间变换包括:模型变换.视图变换.投影变换和视口 ... 
- Ng第九课:神经网络的学习(Neural Networks: Learning)
		9.1 代价函数 9.2 反向传播算法 9.3 反向传播算法的直观理解 9.4 实现注意:展开参数 9.5 梯度检验 9.6 随机初始化 9.7 综合起来 9.8 自主驾驶 9.1 ... 
随机推荐
- Biology(湖南集训)
			题目大意:n个字符串,m个操作,可以插入字符串,也可以询问某T个字符串的最长后缀 题解:Trie+lca Trie树的插入与查询操作.把字符串反转就相当于求公共前缀. lca的深度就是公共前缀的长度. ... 
- jquery  如何使用innerHTML
			$("#responsediv") 是个Jquery对象,它Val()是对Value属性赋值对它无意义,Jquery没有innerHTML这个属性,应该这样写$("#re ... 
- Eclipse使用EclEmma看单元测试的代码覆盖率
			在开发过程中,我们应该养成编写本地单元测试用例的好习惯,甚至做到测试驱动开发.EclEmma是Eclipse的一个插件,是一款测试用例的代码覆盖率统计工具,能明确到哪一行在测试过程中被调用到了.这里不 ... 
- 运行maven打出来的jar包报错:Unable to locate Spring NamespaceHandler for XML schema namespace
			问题背景:新建了一个maven项目,打了一个可运行jar包,依赖了spring几个jar包,一跑就报错了 E:\workspace\point-circle\target>java -jar p ... 
- windows调试本地启动的tomcat
			我们一般都通过Eclipse进行tomcat的本地调试,但有些特殊情况下需要直接本地启动tomcat(进入tomcat的bin目录下执行startup.bat),此时我们可以利用类似远程调试模式的方式 ... 
- substr的学习(PHP学习)
			substr的用法: 首先看PHP手册 ,手册上是这样说的 string substr ( string $string , int $start [, int $length ] ) 执行subst ... 
- VS2010环境下MFC使用DataGrid绑定数据源
			如果MFC的软件中 使用DataGrid控件后,在别的电脑上不能运行行,需要拷贝一个 MSDATGRD.ocx 和msstdfmt.dll 文件在软件的目录中,并写一个批处理文件 reg.dat 文 ... 
- Linux添加路由
			在Linux的VM中可以添加.删除路由. 中如图的拓扑结构中需要在中间的VM上添加路由,使最左边的VM和最右边的VM实现互通. 在这台VM上需要添加IP Forwarding的功能,在操作系统中也需要 ... 
- Java课程设计——坦克大战
			坦克大战——坦克类 一. 团队课程设计博客链接 https://www.cnblogs.com/chenhuilin/p/10275664.html 二.个人负责模块和任务说明 模块:坦克类(玩家坦克 ... 
- 你知道PORT吗?
			在TCP协议中,有端口(PORT)的概念,很多人都不知道端口到底是什么.之前介绍过物理地址,也就是网卡地址,做个不恰当的比喻,物理地址(MAC)地址,相当于身份证(唯一),家庭地址是几幢几单元相当于I ... 
