多线激光雷达+imu的gazebo仿真

前言:在做2D/3D slam的课题研究时,往往我们手里头没有昂贵的多线激光雷达和惯性传感器,ros提供了相应的传感器插件,通过插件可以在物理仿真环境下,模拟传感器运行时的效果。

文章目录

  • 多线激光雷达+imu的gazebo仿真
    • 1.搭建小车底盘模型
    • 2.添加多线激光雷达
    • 3.添加IMU
    • 4.测试仿真

1.搭建小车底盘模型

gazebo下xacro描述文件多加了碰撞标签和惯性矩阵,定义常见形状的惯性矩阵描述文件my_inertia.xacro,

<robot name="base" xmlns:xacro="http://wiki.ros.org/xacro"><!-- Macro for inertia matrix --><xacro:macro name="sphere_inertial_matrix" params="m r"><inertial><mass value="${m}" /><inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0"iyy="${2*m*r*r/5}" iyz="0" izz="${2*m*r*r/5}" /></inertial></xacro:macro><xacro:macro name="cylinder_inertial_matrix" params="m r h"><inertial><mass value="${m}" /><inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"iyy="${m*(3*r*r+h*h)/12}" iyz = "0"izz="${m*r*r/2}" /> </inertial></xacro:macro><xacro:macro name="Box_inertial_matrix" params="m l w h"><inertial><mass value="${m}" /><inertia ixx="${m*(h*h + l*l)/12}" ixy = "0" ixz = "0"iyy="${m*(w*w + l*l)/12}" iyz= "0"izz="${m*(w*w + h*h)/12}" /></inertial></xacro:macro>
</robot>

xacro文件格式对urdf文件格式进行了升级,提高了urdf格式代码的复用性。小车底盘的描述文件 my_car_Cylider.xacro如下:

<!--使用 xacro 优化 URDF 版的小车底盘实现:实现思路:1.将一些常量、变量封装为 xacro:property比如:PI 值、小车底盘半径、离地间距、车轮半径、宽度 ....2.使用 宏 封装驱动轮以及支撑轮实现,调用相关宏生成驱动轮与支撑轮-->
<!-- 根标签,必须声明 xmlns:xacro -->
<robot name="my_base" xmlns:xacro="http://www.ros.org/wiki/xacro"><!-- 封装变量、常量 --><xacro:property name="PI" value="3.141"/><!-- 宏:黑色设置 --><material name="black"><color rgba="0.0 0.0 0.0 1.0" /></material><!-- 底盘属性 --><xacro:property name="base_footprint_radius" value="0.001" /> <!-- base_footprint 半径  --><xacro:property name="base_link_radius" value="0.1" /> <!-- base_link 半径 --><xacro:property name="base_link_length" value="0.08" /> <!-- base_link 长 --><xacro:property name="earth_space" value="0.02" /> <!-- 离地间距 --><xacro:property name="base_link_m" value="1.0" /> <!-- 质量  --><!-- 底盘 --><link name="base_footprint"><visual><geometry><sphere radius="${base_footprint_radius}" /></geometry></visual></link><link name="base_link"><visual><geometry><cylinder radius="${base_link_radius}" length="${base_link_length}" /></geometry> <origin xyz="0 0 0" rpy="0 0 0" /><material name="yellow"><color rgba="0.5 0.3 0.0 0.5" /></material></visual><collision><geometry><cylinder radius="${base_link_radius}" length="${base_link_length}" /></geometry><origin xyz="0 0 0" rpy="0 0 0" /></collision><xacro:cylinder_inertial_matrix m="${base_link_m}" r="${base_link_radius}" h="${base_link_length}" /></link><joint name="base_link2base_footprint" type="fixed"><parent link="base_footprint" /><child link="base_link" /><origin xyz="0 0 ${earth_space + base_link_length / 2 }" /></joint><gazebo reference="base_link"><material>Gazebo/Yellow</material></gazebo><!-- 驱动轮 --><!-- 驱动轮属性 --><xacro:property name="wheel_radius" value="0.0325" /><!-- 半径 --><xacro:property name="wheel_length" value="0.015" /><!-- 宽度 --><xacro:property name="wheel_m" value="0.05" /> <!-- 质量  --><!-- 驱动轮宏实现 --><xacro:macro name="add_wheels" params="name flag"><link name="${name}_wheel"><visual><geometry><cylinder radius="${wheel_radius}" length="${wheel_length}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" /><material name="black" /></visual><collision><geometry><cylinder radius="${wheel_radius}" length="${wheel_length}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" /></collision><xacro:cylinder_inertial_matrix m="${wheel_m}" r="${wheel_radius}" h="${wheel_length}" /></link><joint name="${name}" type="continuous"><parent link="base_link" /><child link="${name}_wheel" /><origin xyz="0 ${flag * base_link_radius} ${-(earth_space + base_link_length / 2 - wheel_radius) }" /><axis xyz="0 1 0" /></joint><gazebo reference="${name}_wheel"><material>Gazebo/White</material></gazebo></xacro:macro><xacro:add_wheels name="base_l_wheel_joint" flag="1" /> <xacro:add_wheels name="base_r_wheel_joint" flag="-1" /><!-- 支撑轮 --><!-- 支撑轮属性 --><xacro:property name="support_wheel_radius" value="0.01" /> <!-- 支撑轮半径 --><xacro:property name="support_wheel_m" value="0.03" /> <!-- 质量  --><!-- 支撑轮宏 --><xacro:macro name="add_support_wheel" params="name flag" ><link name="${name}_wheel"><visual><geometry><sphere radius="${support_wheel_radius}" /></geometry><origin xyz="0 0 0" rpy="0 0 0" /><material name="black" /></visual><collision><geometry><sphere radius="${support_wheel_radius}" /></geometry><origin xyz="0 0 0" rpy="0 0 0" /></collision><xacro:sphere_inertial_matrix m="${support_wheel_m}" r="${support_wheel_radius}" /></link><joint name="${name}_wheel2base_link" type="continuous"><parent link="base_link" /><child link="${name}_wheel" /><origin xyz="${flag * (base_link_radius - support_wheel_radius)} 0 ${-(base_link_length / 2 + earth_space / 2)}" /><axis xyz="1 1 1" /></joint><gazebo reference="${name}_wheel"><material>Gazebo/Black</material></gazebo></xacro:macro><xacro:add_support_wheel name="front" flag="1" /><xacro:add_support_wheel name="back" flag="-1" /></robot>

2.添加多线激光雷达

多线激光雷达的配置文件my_sensor_vodyne.xacro

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="velodyne"><!-- Gazebo requires the velodyne_gazebo_plugins package --><gazebo reference="vodyne"><sensor type="ray" name="vodyne16"><pose>0 0 0 0 0 0</pose><visualize>false</visualize><update_rate>10</update_rate><ray><scan><horizontal><samples>1800</samples> <!-- Change this to 500 if gazebo keeps timing out --><resolution>0.2</resolution><min_angle>-${M_PI}</min_angle><max_angle> ${M_PI}</max_angle></horizontal><vertical><samples>16</samples><resolution>2</resolution><min_angle>-${15*M_PI/180.0}</min_angle><max_angle> ${15*M_PI/180.0}</max_angle></vertical></scan><range><min>0.055</min><max>100.0</max><resolution>0.1</resolution></range><noise><type>gaussian</type><mean>0.0</mean><stddev>0.0</stddev></noise></ray><plugin name="gazebo_ros_laser_controller" filename="libgazebo_ros_velodyne_laser.so"><topicName>/velodyne_points</topicName><frameName>vodyne</frameName><min_range>0.9</min_range><max_range>130.0</max_range><gaussianNoise>0.0</gaussianNoise></plugin></sensor></gazebo>
</robot>

在gazebo环境下添加多线激光雷达物理模型my_vodyne_gazebo.xacro

<!--小车底盘添加雷达
-->
<robot name="my_vodyne" xmlns:xacro="http://wiki.ros.org/xacro"><!-- 雷达属性 --><xacro:property name="M_PI" value="3.1415926"/><xacro:property name="laser_length" value="0.03" /> <!-- 雷达长度 --><xacro:property name="laser_radius" value="0.03" /> <!-- 雷达半径 --><xacro:property name="laser_x" value="0.0" /> <!-- 雷达安装的x坐标 --><xacro:property name="laser_y" value="0.0" /> <!-- 雷达安装的y坐标 --><xacro:property name="laser_z" value="0.055" /> <!-- 雷达安装的z坐标:支架高度 / 2 + 雷达高度 / 2  --><xacro:property name="laser_m" value="0.1" /> <!-- 雷达质量 --><!-- 雷达关节以及link --><link name="vodyne"><visual><geometry><cylinder radius="${laser_radius}" length="${laser_length}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /><material name="black" /></visual><collision><geometry><cylinder radius="${laser_radius}" length="${laser_length}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /></collision><xacro:cylinder_inertial_matrix m="${laser_m}" r="${laser_radius}" h="${laser_length}" /></link><joint name="vodynetoBaselink" type="fixed"><parent link="base_link" /><child link="vodyne" /><origin xyz="${laser_x} ${laser_y} ${laser_z}" /></joint><gazebo reference="vodyne"><material>Gazebo/Blue</material></gazebo>
</robot>

3.添加IMU

imu的配置文件my_sensor_imu.xacro

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro"> <gazebo reference="imu"><gravity>true</gravity><sensor name="imu_sensor" type="imu"><always_on>true</always_on><update_rate>100</update_rate><visualize>true</visualize><topic>__default_topic__</topic><plugin filename="libgazebo_ros_imu_sensor.so" name="imu_plugin"><topicName>imu</topicName><bodyName>imu</bodyName><updateRateHZ>100.0</updateRateHZ><gaussianNoise>0.0</gaussianNoise><xyzOffset>0 0 0</xyzOffset>     <rpyOffset>0 0 0</rpyOffset><frameName>imu</frameName>        </plugin><pose>0 0 0 0 0 0</pose></sensor></gazebo>
</robot>

在gazebo环境下添加imu物理模型my_imu_gazebo.xacro

<robot name="imu" xmlns:xacro="http://wiki.ros.org/xacro">  <xacro:property name="imu_offset_x" value="0" /><xacro:property name="imu_offset_y" value="0" /><xacro:property name="imu_offset_z" value="0.02" /><xacro:property name="imu_size"     value="0.01" /><xacro:property name="imu_m" value="0.01" /> <!-- imu质量 --><!-- imu --><joint name="imutoVodyne" type="fixed"><origin xyz="${imu_offset_x} ${imu_offset_y} ${imu_offset_z}" rpy="0 0 0" /><parent link="vodyne"/><child link="imu"/></joint><link name="imu"><visual><origin rpy="0 0 0" xyz="0 0 0" /><geometry><box size="${imu_size} ${imu_size} ${imu_size}"/></geometry>                <material name= "red" ><color rgba="1.0 0.0 0.0 1.0" /></material></visual><collision><geometry><box size="${imu_size} ${imu_size} ${imu_size}" /></geometry><origin xyz="0.0 0.0 0" rpy="0.0 0.0 0.0" /></collision><xacro:Box_inertial_matrix m = "${imu_m}" l = "${imu_size}" w = "${imu_size}" h = "${imu_size}"/></link><gazebo reference="imu"><material>Gazebo/Red</material></gazebo>
</robot>

4.测试仿真

将小车底盘、多线激光雷达、Imu组合到一起的xacro文件 my_car_vodyne_imu.xacro

<!-- 组合小车底盘与imu 激光雷达-->
<robot name="my_car_camera_laser" xmlns:xacro="http://wiki.ros.org/xacro" reference= "base_footprint_radius"><!--注意inliude的顺序!--><xacro:include filename="my_inertial.xacro" /><xacro:include filename="my_car_Cylider.xacro" /><xacro:include filename="my_vodyne_gazebo.xacro" /><xacro:include filename="my_imu_gazebo.xacro" /><!--rplidar仿真的xacro文件--><xacro:include filename="$(find myrobot_gazebo)/urdf/sensor/my_sensor_rplidar.xacro" /><!--摄像头仿真的xacro文件--><!--xacro:include filename="$(find myrobot_gazebo)/urdf/sensor/my_sensor_camera.xacro" /--><!--imu仿真的xacro文件--><xacro:include filename="$(find myrobot_gazebo)/urdf/sensor/my_sensor_imu.xacro" /><!--vodyne仿真的xacro文件--><xacro:include filename="$(find myrobot_gazebo)/urdf/sensor/my_sensor_vodyne.xacro" /></robot>

编写launch文件 my_car_vodyne_imu.launch

<launch><!-- 将 Urdf 文件的内容加载到参数服务器 --><param name="robot_description" command="my_car_vodyne_imu.xacro" /><!-- 启动 gazebo --><include file="$(find gazebo_ros)/launch/empty_world.launch"></include><!-- 在 gazebo 中显示机器人模型 --><node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  /><!--发布机器人的状态--><node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" output="screen" /><node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen" />
</launch>

打开终端,启动launch文件,可以看到组合到一起的效果
另开一个终端 输入

rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'

gazebo下测试的效果

多线激光雷达+imu的gazebo仿真相关推荐

  1. 【环境配置】Turtlebot2 激光雷达+深度相机 GAZEBO仿真

    前言 最近老师接了一个项目,做一个机器人仿真环境,我是负责移动机器人这部分的.老师的要求是以Turtlebot2为参考,后面可能涉及实机演示.在仿真的过程中我发现Turtlebot2仿真环境是以Kin ...

  2. gazebo中给机器人添加16线激光雷达跑LIO-SAM

    目录: 前言 1.下载雷达仿真包 2.添加雷达支架描述文件 3.添加雷达描述文件 4.启动仿真 5.添加IMU模块 6.添加RGB-D相机 7.LIO-SAM仿真 安装依赖 安装GTSAM 编译LIO ...

  3. gazebo中机器人搭载16线激光雷达建图导航

    gazebo中机器人搭载16线激光雷达建图导航 如果用过古月的教程大家就会知道,古月教程中的机器人采用的是单线激光雷达,但有的时候仿真需要多线激光雷达,这里就教一下怎么搭载16线激光雷达建图导航. 首 ...

  4. ROS自学实践(5):GAZEBO建模及添加相机和激光雷达传感器并进行仿真

    在搭建完机器人小车的模型之后,需要向其添加传感器,以便提取传感器的数据,进行后续的工作. 一.相机 1.添加camera_gazebo.xacro文件 同添加机器人模型一样,添加一个相机也需要进行定义 ...

  5. 使用速腾16线激光雷达与IMU 实现Cartographer 3D建图

    平台:ubuntu18.04 + rosmelodic 设备: 速腾16线激光雷达(RS-Helios-16P).IMU(WHT901B-485),使用方法见前文 1.创建backpack_2d_rs ...

  6. 多线激光雷达~三维建图

    感觉资料好像不太多啊. ROS与SLAM入门教程-多线雷达(velodyne 16)BLAM 三维建图 谷歌cartographer使用速腾聚创3d激光雷达数据进行三维建图 [激光雷达]3D激光雷达传 ...

  7. 教程 | 阿克曼结构移动机器人的gazebo仿真(五)

    第四章.用xacro优化URDF并配置gazebo仿真插件 1►前言 上节用简易模型写了一个小车的URDF代码,这一节将用xacro对其进行优化,这里我并不打算用宏对参数进行封装,因为我个人觉得这样看 ...

  8. Gazebo仿真平台模型搭建与修改

    ROS进阶教程(一)Gazebo仿真平台模型搭建与修改 文件讲解 Models 文件 World文件 Launch文件 模型编辑 可视化操作 配置文件编辑 仿真操作流程 完成model建模 world ...

  9. 教程 | 阿克曼结构移动机器人的gazebo仿真(一)

    第一章.从SOLIDWORKS中导出URDF 二轮差速小车已经完结.接下去要进入阿克曼结构移动机器人的仿真.阿克曼小车的结构也就是我们看到最多的应用最广的车型,也称为car-like robot.在这 ...

最新文章

  1. 人力资源部如何运用OKR?看三大层面最新OKR模板
  2. POJ - 1190 生日蛋糕(dfs+剪枝)
  3. java语言模拟_Java语言模拟操作系统.doc
  4. c语言基类型,C语言基本类型边界值
  5. 洛克人红色思考型机器人叫什么_稻船敬二新企划《红色灰烬》 依然是机器人风格...
  6. 【初涉C语言】程序员欢迎来到C语言的世界!
  7. php 异步处理类,php异步处理类
  8. 在xcode6.1和ios10.10.1环境下实现app发布
  9. CGI form标签学习
  10. java swing如何设置jtextarea对齐方式_【爵士钢琴】一次搞懂爵士经典Swing节奏!
  11. try catch中getRequestDispatcher跳转
  12. mysql 慢_MySQL很慢... 怎么破??-阿里云开发者社区
  13. c++ 多线程 垃圾回收器_新一代垃圾回收器ZGC的探索与实践
  14. 编译Windows版本ffmpeg:msys2方式失败
  15. mysql里的char和varchar
  16. win10系统安装sql不上服务器,win10安装sql2000没有反应怎么办_win10安装不了sql2000的解决方法...
  17. 如何同时使用双网卡进行两个网络上网
  18. HTML头部文档相关标记,html头部基本标记详解
  19. Graph Neural Controlled Differential Equations for Traffic Forecasting(AAAI2022)
  20. pg_auto_failover 之三 automated failover

热门文章

  1. npm报错stack Error: EACCES: permission denied, mkdir
  2. 《程序员养成记》第1集 做程序员需要天赋吗?
  3. 故障处理 软件 需求_YamahaYamaha机器人RCX340控制器报警故障维护【AVG机器人系统】_智能云仓储库存wms管理分配货_电子标签价签拣货系统_工控erp上位机软件开发设计...
  4. 计算机设备机房防静电标准,机房防静电地板设计标准是什么?
  5. 47、以Orienmask实例分割算法为例子,学习TensorRT的Python和C++开发
  6. 把matlab双坐标轴的颜色设置为黑色
  7. 数据库实验二之数据查询
  8. python3小项目——爬取智联招聘信息(二)
  9. flex4 中获取Microphone,抑制回声和使用Speex编码音频的方法
  10. mysql字符集和校对规则