ROS仿真中 读取 turtlebot3 扫描雷达传感器数据 求 前方距离和最短距离(对应方向)

简介: ROS仿真中 读取 turtlebot3 扫描雷达传感器数据 求 前方距离和最短距离(对应方向)

获取传感器数据 以 scan为例

启动 waffle 的时候

  <arg name="model" default="waffle"/>

模型上有 激光扫描器 和 深度相机的地方
在这里插入图片描述
查看活跃的 topic

有深度相机的 图像 rgb相机的图像 激光
/camera/depth/image_raw
/camera/rgb/image_raw
/scan
在这里插入图片描述

tuttlebot3_world.launch 里 启动的是 这个 xacro文件

  <param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" />

在里面 又包含了 一个 gazebo 的文件

  <xacro:include filename="$(find turtlebot3_description)/urdf/common_properties.xacro"/>
  <xacro:include filename="$(find turtlebot3_description)/urdf/turtlebot3_waffle.gazebo.xacro"/>

里面有差速控制器 gazebo的插件

imu、laser、kinect

本次关注的有两个 laser && kinect
xacro如下

scan 发布的topic : scan 对应上

<gazebo reference="base_scan">
    <material>Gazebo/FlatBlack</material>
    <sensor type="ray" name="lds_lfcd_sensor">
      <pose>0 0 0 0 0 0</pose>
      <visualize>$(arg laser_visual)</visualize>
      <update_rate>5</update_rate>
      <ray>
        <scan>
          <horizontal>
            <samples>360</samples>
            <resolution>1</resolution>
            <min_angle>0.0</min_angle>
            <max_angle>6.28319</max_angle>
          </horizontal>
        </scan>
        <range>
          <min>0.120</min>
          <max>3.5</max>
          <resolution>0.015</resolution>
        </range>
        <noise>
          <type>gaussian</type>
          <mean>0.0</mean>
          <stddev>0.01</stddev>
        </noise>
      </ray>
      <plugin name="gazebo_ros_lds_lfcd_controller" filename="libgazebo_ros_laser.so">
        <topicName>scan</topicName> 
        frameLabelStart--frameLabelEnd 
      </plugin>
    </sensor>
  </gazebo>

camera 发布的topic : rgb/image_raw depth/image_raw 对应上了


  <gazebo reference="camera_rgb_frame">
    <sensor type="depth" name="realsense_R200">
      <always_on>true</always_on>
      <visualize>$(arg camera_visual)</visualize>
      <camera>
          <horizontal_fov>1.3439</horizontal_fov>
          <image>
              <width>1920</width>
              <height>1080</height>
              <format>R8G8B8</format>
          </image>
          <depth_camera></depth_camera>
          <clip>
              <near>0.03</near>
              <far>100</far>
          </clip>
      </camera>
      <plugin name="camera_controller" filename="libgazebo_ros_openni_kinect.so">
        <baseline>0.2</baseline>
        <alwaysOn>true</alwaysOn>
        <updateRate>30.0</updateRate>
        <cameraName>camera</cameraName>
        frameLabelStart--frameLabelEnd 
        <imageTopicName>rgb/image_raw</imageTopicName>
        <depthImageTopicName>depth/image_raw</depthImageTopicName>
        <pointCloudTopicName>depth/points</pointCloudTopicName>
        <cameraInfoTopicName>rgb/camera_info</cameraInfoTopicName>
        <depthImageCameraInfoTopicName>depth/camera_info</depthImageCameraInfoTopicName>
        <pointCloudCutoff>0.4</pointCloudCutoff>
            <hackBaseline>0.07</hackBaseline>
            <distortionK1>0.0</distortionK1>
            <distortionK2>0.0</distortionK2>
            <distortionK3>0.0</distortionK3>
            <distortionT1>0.0</distortionT1>
            <distortionT2>0.0</distortionT2>
        <CxPrime>0.0</CxPrime>
        <Cx>0.0</Cx>
        <Cy>0.0</Cy>
        <focalLength>0</focalLength>
        <hackBaseline>0</hackBaseline>
      </plugin>
    </sensor>
  </gazebo>

下面 就用 scan 数据

rostopic echo /scan

这将显示 一个持续的流 ,这个流 就是 话题上 LaserScan消息,大多是 LaserScan消息 的ranges ,这是要处理的内容
在这里插入图片描述
里面有设定的信息
在这里插入图片描述

ranges数组包含了 turtlebot 到最近障碍物的距离,从数组元素的序号可以算出这个障碍物的角度。

发布的消息类型是
在这里插入图片描述
官网的解释
在这里插入图片描述

订阅 /sacn topic

WanderRobot 类 私有变量 声明 订阅句柄

    ros::Subscriber Sub_WanderRobot_LaserScan_ ;

在构造函数里 赋值 订阅句柄

Sub_WanderRobot_LaserScan_ = nh_.subscribe("/scan",1,&WanderRobot::Sub_WanderRobot_LaserScan_Callback,this );

// 回调函数
void WanderRobot::Sub_WanderRobot_LaserScan_Callback(const sensor_msgs::LaserScan::ConstPtr &WanderRobot_LaserScan_msg)
{

 
}

在main()函数里加轮询函数

    ros::spinOnce();

求前方的障碍物距离距离

向量第1个元素 就是 前方的距离 179 是 后方的距离

range_ahead_ = ranges[0];

求最近障碍物的距离 与方向

此问题转化为 求 ros 里面 vector 的 向量里的最小元素 及 位置

首先求 ranges 的向量长度

这里有个插曲

ranges msg里 对于类型是
在这里插入图片描述
msg里float32[ ] 变量是 向量 类型 不是数组 ,求长度不能用sizeof(),直接 变量.size() 就行

std::vector<float> ranges = WanderRobot_LaserScan_msg->ranges;
len_ = ranges.size();

求最短距离

也就是 求 ros 里面 vector 的 向量里的最小元素

这里也有个要注意的
ROS 可以调用 std 库下的 min_element()函数 ,来求向量里最小元素
min_element()函数 需要输入两个参数 起始地址 和 结束地址
在C++ 11 , std 库 中 有 向量变量.begin() 向量变量.end() 来求 向量起始结束地址 。
但是 ROS 1 里 可能使用的 不是 C++ 11 ,或者怎么样的, 反正没有 这两个函数

直接用取址 运算符

代码 : &ranges[len_-1] 这个是不是还是要 +1,这个要看 min_element 函数 ,先不管了 ,漏一个就漏一个

float* closest_range =   std::min_element(&ranges[0], &ranges[len_-1]) ;
   float  closest_range_ = *closest_range ;

最短距离对于角度

就是求 vector 的 向量里的最小元素 的位置

用地址求
最小元素的地址 - 向量起始地址 再除以 单位向量的所占内存

   int  closest_range_seq = (closest_range - &ranges[0])/sizeof(ranges[0]);

知道 元素 位置了 角度就好算了

float bearing_closest_range_degree = (angle_min + closest_range_seq*(angle_max-angle_min)/len_ )/DEG2RAD ;
相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
相关文章
|
9月前
|
Ubuntu 机器人 定位技术
ros_gazebo/turtlebot3 室内仿真导航,提取camera/image和pose位姿真值,并将topic 时间同步对齐,最后制作成kitti 格式的数据集。
ros_gazebo/turtlebot3 室内仿真导航,提取camera/image和pose位姿真值,并将topic 时间同步对齐,最后制作成kitti 格式的数据集。
267 0
|
9月前
|
机器学习/深度学习 机器人 中间件
ubuntu16.04下ROS操作系统学习笔记(五)gazebo物理仿真环境搭建、加载服务端模型数据减少报错
ubuntu16.04下ROS操作系统学习笔记(五)gazebo物理仿真环境搭建、加载服务端模型数据减少报错
135 0
|
9月前
|
机器学习/深度学习 数据可视化 网络协议
ubuntu16.04下ROS操作系统学习笔记(二)命令工具了解和仿真小海龟
ubuntu16.04下ROS操作系统学习笔记(二)命令工具了解和仿真小海龟
168 0
|
10月前
|
传感器 XML 数据可视化
[ros robot] --- 机器人系统仿真
[ros robot] --- 机器人系统仿真
315 0
|
传感器
ROS 之 robot_pose_ekf 多传感器融合
ROS 之 robot_pose_ekf 多传感器融合
169 0
|
存储
ROS学习-记录和回放数据
ROS学习-记录和回放数据
340 0
ROS学习-记录和回放数据
|
传感器 存储 机器人
ROS TF 将传感器数据转换为机器人坐标系下
ROS TF 将传感器数据转换为机器人坐标系下
ROS TF 将传感器数据转换为机器人坐标系下
|
开发工具 git
ROS 环境下 安装 turtlebot3 功能包及其仿真包 并测试 —— 全流程(报错及解决)
ROS 环境下 安装 turtlebot3 功能包及其仿真包 并测试 —— 全流程(报错及解决)
ROS 环境下 安装 turtlebot3 功能包及其仿真包 并测试   —— 全流程(报错及解决)
ros仿真 无人机航向控制算法优化
ros仿真 无人机航向控制算法优化
ros仿真 无人机航向控制算法优化
|
存储 传感器 算法
3D激光SLAM:ALOAM中KITTI数据集处理--转换成ROS可用数据
KITTI数据集由德国卡尔斯鲁厄理工学院和丰田美国技术研究院联合创办,是目前国际上最大的自动驾驶场景下的计算机视觉算法评测数据集。该数据集用于评测立体图像(stereo),光流(optical flow),视觉测距(visual odometry),3D物体检测(object detection)和3D跟踪(tracking)等计算机视觉技术在车载环境下的性能。KITTI包含市区、乡村和高速公路等场景采集的真实图像数据,每张图像中最多达15辆车和30个行人,还有各种程度的遮挡与截断。
3D激光SLAM:ALOAM中KITTI数据集处理--转换成ROS可用数据

推荐镜像

更多