【Gazebo/ROS】阿克曼小车仿真环境设置中的心得体会

2023-05-16

最近科研需要在gazebo中做一个阿克曼小车的仿真,要求小车运动能够通过话题来控制,小车上要安装激光雷达、imu、相机等传感器用于SLAM定位建图。由于是第一次接触gazebo仿真,所以分享一下学习心得:

一、优秀资源

1\ 这位up做了现成的阿克曼小车模型,并出了视频演示运行效果 【模型代码】 【演示链接】

2\ 这位up出了一个从零搭建阿克曼小车的视频,让我弄懂了1\中代码的框架 【教学视频】

3\ 这位博主分享了自己对于gazebo与ROS联合进行小车仿真步骤的深入理解 【深入博文】

4\ 这里有一个开源的非平坦地面路径规划链路的项目,至此我基本理解完整过程 【开源项目】

二、心得体会

1\ 关于 .world的加载

如果world用到的模型全都是官方model,那么只需要把官方的model库下载下来,存到.gazebo的models下面就行了,但如果有些model是你自己定义的,例如自己定义的地图、障碍物等,那么你必须把对应的model文件放入.gazebo的models下面,当然,你也可以用prefix来设定gazebo对model的搜索路径,具体操作在13\

2\ 启动gazebo

roslaunch gazebo_ros emputy_world.launch 打开一个空白世界(直接输入gazebo也能打开gazebo软件,但是二者有区别的)

3\ 界面技巧

在gazebo中的view中,可以查看碰撞体积、等可视化

4\ 在环境中添加model

下面这句话是使用模型产生器spawn_model在gazebo中添加模型:<node name="spawn_model" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen" args="-urdf -x $(arg x) -y $(arg y) -z $(arg z) -model $(arg robot_name) -param robot_description"/>

其中,robot_description为:<param name="robot_description" command="$(find xacro)/xacro '$(arg urdf_robot_file)' roboname:='smart'" />

5\ 用topic简单控制gazebo中的小车动起来

如果想用rostopic控制gazebo里的小车动起来,在基本模型显示的基础上(empty_world + spawn_model + urdf_description),需要作的改动是:(1)在urdf中添加相应joint的transmission,从而定义joint的执行器类型 (2)在urdf中添加gazebo_ros_control插件(plugin),从而建立起外部控制gazebo中执行器的桥梁 (3)写一个config.yaml文件,来说明各joint的控制器和pid控制参数 (4)在roslaunch中,用controller_spawner功能生成一个控制器,并把控制器和urdf中定义的执行其连接在一起(根据config.yaml中的名字链接) ;当然如果想要实现这些功能,还要下载这些库才行:
    1. sudo apt install ros-melodic-gazebo-ros-control
    2. sudo apt install ros-melodic-ros-control
    3. sudo apt install ros-melodic-ros-controllers

6\ 获取car_model的状态

gazebo能够发布各joint的状态信息(主要是tf关系),如果想在5\的基础上,获取gazebo中,小车速度、姿态和位置,那么就需要在5/的基础上作以下操作:(1)在urdf中加joint_state_publisher插件(plugin),从而把joint和publisher关联在一起 (2)在roslaunch中,用robot_state_publisher功能生成一个状态发布器,从而实现对相关joint状态信息的发布 (3)在rostopic list中,找到“gazebo/model_states”话题,话题的组织形式是:列表[model1,model2,...] + pose + velocity,其中pose和velocity中会按照列表中model的顺序,分别给出,因此在接收这个话题消息后,首先要做的就是找到想要知道的model的index,然后根据index,索引到对应model的pose和velocity,然后进行重新发布即可 (4)上述操作的实质就是:gazebo可以发布其中所有model的pose和velocity,然后我们定义一个node节点,接受这个topic然后,定义回调函数来筛选所需信息,并且publish出自己想发布的信息就行了。

7\ 在urdf中添加gazebo中的额外属性

通常情况下,我们还会用<gazebo reference=“xxx”> 给机器人的xxx零件加上额外的属性,如摩擦力、颜色等,这些可以加在urdf中,到时候作为spawn_model的-param description传入模型

8\ 使用mesh模型

当我们想把更加好看的外部mesh模型作为机器人的一部分时,我们常使用<mesh filename="package://package_name/meshes/xxx.dae"/>来代替原来visual中的geometry中的box或者cylinder,注意这里的package://package_name相当于launch中的 $(find package_name)

9\ 根据阿克曼的输入(速度和打角)解算四轮的转速和转角

在5\的基础上,实现实现对车辆的话题控制(可以使用C++,也可以使用python,这里使用pyhton):(1)总的思路是生成一个发布话题的节点,接收我们发布的小车速度和转角的话题命令,并将之分解为小车四轮的转速和转角 (2)根据阿克曼模型,对模型的输入量为:小车后轮速度 和 小车中轴线处的虚拟车轮的打角;(3)处理输入量1:给打角加限制。根据轴距和车轮间距,可由实际车轮的最大打角半径,算出输入量中的最大打角 (4)处理输入量2:将车速转换为后轮角速度。后轮的线速度就是车速,要换算成后轮的角速度,才能后发送给后轮的执行器 (5)判断输入打角是否为0:如果为0,那就很简单,直接给前轮发送0角度,给后轮发送输入处理量2——后轮角速度 (6)判断输入打角是否为0:如果不为0,首先根据输入处理量2——后轮角速度由半径比例拓展到两个后轮的角速度(内圈慢,外圈快);然后根据前轮的actan值,得到两个前轮的打角;另,如果前轮也有驱动力,也可以根据前轮转弯半径和车速计算出两个前轮的驱动角速度 (7)将各轮的控制量按照对应的msgs格式发送到对应的话题就行了。

10\ 阿克曼模型的核心

在其他量已知的情况下,打角和转弯半径是相互决定的,知道其中一个,即可求另一个

11\ 在rviz中看到小车

想要在rviz中看到gazebo中的汽车模型和相关信息,最重要的是要关注tf坐标变换:(1)打开空白rviz,加入robotmodel,在参数服务器中填入事先写好的param(已在launch中定义好了,放在参数服务器中,叫做robot_description:<param name="robot_description" command="$(find xacro)/xacro '$(arg urdf_robot_file)' roboname:='smart'" />)  (2)使用rosrun rqt_tf_tree rqt_tf_tree查看当前tf树,发现没有/world坐标系,因此需要创建一个tf.TransformBroadcaster来广播world和base_link的关系,这个位置关系是随时间发生变化的,因此还要读取小车的位置和姿态(这个位置和姿态是6\中,最初由joint_state_publisher发布全体model,后续经过自定义节点发布的car_model的PoseStamped,我们只需要把这个消息接受起来,然后使用回调函数,把这个位姿信息当成world和baselink的关系广播出来即可) (3)在rviz中,将Fixed Frame设置为/world,即可在rviz中显示小车在world坐标系下的运动(如果想要显示小车的Pose,那么记得把5\中发布的car_model信息的frame_id 设置为 '/world'

12\ 踩坑

在重构代码时遇到各种各样样的问题,主要是以下几点

(1)urdf和xaro文件中,不能有中文注释,如果要写了,那就要加utf-8:<?xml version="1.0" encoding="utf-8"?>(2)对于那些fixed的joint,直接在launch中写一个robot_state_publisher就行了,但是如果还有其他运动型joint,就需要在xacro中插入joint_state_publisher的plugin,并把想要输出的tf的jointname写上去逗号\回车隔开,且其中最需要注意的是namespace要对应上,对于fixed,publisher默认输出的位置是/joint_states,而对于运动型,是在urdf中的plugin中决定的,robotNamespace+/joint_states,一定要把两者对应起来,否则会变成两颗tf树,无法在rviz中完整显示(具体可看这篇博文https://blog.csdn.net/blue_skyLZW/article/details/112394119) (3)在controller的config.ymal文件中,旋转joint不配置pid参数是可以的,只会报红然后生成一个理想控制器,但摆动joint如果不定义pid参数,会直接无法生成控制器,最好都把pid参数放进去,当然二者的存放方式要根据 (4)出现小车在地面慢慢滑动的问题:在车轮joint上加入摩擦力标签来让小车在零输入时稳定下来 <dynamics damping="0.0" friction="1.0"/> (5)小车打角、轮子转动出现较大波动,考虑两个问题:激光雷达等传感器点束过于密集,导致卡顿;控制器的pid参数需要调整(在config.yaml中调整) (6)出现[TF_REPEATED_DATA ignoring data with redundant timestamp for frame base_footprint at time...]的warning信息:??? (7)出现车轮跟不上车体运动的情况:??? 【目前6和7可以通过直接world->baselink解决,但是到basefootprint我不知道要怎么弄了】(8)激光雷达采样点过于密集引起卡顿:这个暂时还没有好的办法,只能减少采样点数和缩短最大投射距离

13\ 将模型放在本地

在工作空间存放模型(考虑到模型的可移植性),步骤是:(1)在功能包package中建立一个models文件夹,然后把model文件都存在这个文件夹中 (2)在功能包的配置文件package.xml中的<export>标签中,加入<gazebo_ros gazebo_model_path="${prefix}/models"/> (解释一下,环境变量${prefix}表示指的是package.xml所在位置的路径信息)(3)此外,如果这个package.xml是自动生成的,还需要加上<depend>gazebo_ros</depend>和<exec_depend>gazebo</exec_depend> (4)改完package.xml要catkin_make以下才能生效 (5)当然,也可以使用另外的方式加载模型,但本方法是最推荐的。其他方法的参考链接放在这里【https://blog.csdn.net/benchuspx/article/details/116404058】

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Gazebo/ROS】阿克曼小车仿真环境设置中的心得体会 的相关文章

  • android.mk编译规则,1个mk文件编译多个模块

    目录 Android mk 自我理解 Android mk 是什么 Android mk 语法规则 规则解释 xff1a Android mk 编译多个模块实例 xff0c 详见如下 xff1a Android mk 语法规则 xff1a
  • Wireshark抓包分析 TCP三次握手/四次挥手详解

    Wireshark抓包分析 TCP三次握手 四次挥手详解 2019 11 13阅读 1 9K0 作者 xff1a 踏歌追云 来源 xff1a https urlify cn jYVZn2 本文结合wireshark抓包 xff0c 对TCP
  • tls1.3【转载】

    tr tls1 3 发表于 2021 01 04 20 39 更新于 2021 04 29 17 15 tls1 3翻译备忘 摘要 该文档定义了TLS Transport Layer Security 协议的1 3版本 TLS可以让C S应
  • TLS中ChangeCipherSpec为什么是个单独的协议类型【转】

    发表于 2020 03 14 22 27 更新于 2021 04 29 17 15 RFC5246中说 Note To help avoid pipeline stalls ChangeCipherSpec is an independen
  • linux下多线程获取互斥锁,多线程运行时机

    linux内核 CPU 调度决定的线程运行的时间是难以预见 若在复杂程序中发生这一不确定行为 xff0c 则意味着此类错误将偶尔发作 xff0c 难以重现 xff0c 因此也很难发现
  • 数字签名算法MD5和SHA-1的比较

    什么是MD5 xff0c 什么是SHA 1 xff0c 如何校验这些Hash 还有拿单个ISO文件的MD5 xff0c SHA 1讯问是不是原版的问题 xff0c 在这里 xff0c 对以上问题做一个终结解释 xff01 了解 hash H
  • JavaEE.sql.Delete删除语句

    DELETE 语法格式 DELETE FROM table name WHERE condition S1 常用用法 DELETE FROM test master WHERE bindNo 61 39 bn002 39 S2 清空表 DE
  • Docker 容器使用

    Docker 容器使用 可以通过命令 docker command help 更深入的了解指定的 Docker 命令使用方法 容器使用 获取镜像 如果我们本地没有 ubuntu 镜像 xff0c 我们可以使用 docker pull 命令来
  • 【ADRC】跟踪微分器

    在上一篇文章中 xff0c 分析了PID算法的基本数学原理 xff0c 从PID算法的原理与实际应用 xff0c 是可以看出其PID的优点与缺点的 xff0c ADRC算法 自抗扰控制 也可以说是针对PID算法的一些缺点 xff0c 或者说
  • 树莓派3B+安装系统(Raspbian)以及配置环境

    1 硬件准备 1 树莓派3B 43 xff08 E14 xff09 2 一张64G的闪迪存储卡 3 一个读卡器 4 普通电脑显示器 xff0c 键盘 xff0c 鼠标 5 一台可以正常工作的Window系统的电脑 2 安装系统 1 树莓派系
  • 微策略的笔试题

    觉得在收获Offer的季节应该为自己积累些人品了 xff0c 在这里将今天的情况向所有求Offer的童鞋分享下 从上个周末开始反应迟钝的我终于有了些求Offer的感觉 xff0c 几天参加了4场面试 xff0c 基本上没觉得有很大的挑战 x
  • 【无标题】嘉立创EDA,stm32F4控制板。

  • 使用docker-compose连接mysql以及8.0版本遇到的身份验证问题解决方案

    docker compose 使用Docker部署环境非常方便 xff0c Compose项目是 Docker 官方的开源项目 xff0c 负责实现对 Docker 容器集群的快速编排 它允许用户通过一个单独的docker compose
  • EKF—SLAM推导

    转自 http blog csdn net qq 30159351 article details 53408740 这是SLAM最传统的基础 xff0c 是SLAM最原始的方法 xff0c 虽然现在使用较少 xff0c 但是还是有必要了解
  • PX4原生固件源码分析(挖坑)--1、代码结构

    写在开头 最近开始学习PX4源码 xff0c 并进行二次开发 xff0c 苦于网上缺少有关PX4源码的分析 xff0c 于是在这开个坑 xff0c 记录自己学习PX4的过程 xff0c 以此自勉 xff0c 笔者第一次写博客 xff0c 若
  • PX4原生固件源码分析(开填)--2、uORB消息

    写在开头 众所周知 xff0c PX4是通过Mavlink协议进行通信 xff0c 但是Mavlink只是用于外部的通信 xff0c 也就是和QGC地面站进行通信 xff0c 那么PX4中各任务模块相对独立 xff0c 它们之间是怎么通信的
  • 【超详细】基于大疆RoboMaster开发板C型的BMI088数据读取

    超详细 基于大疆RoboMaster开发板C型的BMI088数据读取 这里以博世传感器公司产出的BMI088型号的IMU为例 xff0c 其里面有3轴高精度加速度计和3轴高精度陀螺仪 xff0c 其他的特性不再介绍 同时这里的IMU是安装在
  • IMU综述

    IMU xff08 Inertial measurement unit xff09 xff0c 惯性测量单元 其作用是测量本身的加速度以及角速度 xff0c 有时还通过磁力计来测量朝向 xff0c 当包含磁力计时 xff0c IMU一般被称
  • 【超详细】磁力计数据读取--以IST8310为例

    这里以iSentek公司产出的IST8310型号的磁力计为例 xff0c 尺寸为 3 0 3 0 1 0mm xff0c 支持快速 I2C 通信 xff0c 可达 400kHz xff0c 14 位磁场数据 xff0c 测量范围可达1600
  • 【ADRC】扩张状态观测器(ESO)

    扩张状态观测器是自抗扰控制中非常重要的一个环节 xff0c 在我学习这部分内容后 xff0c 在写本篇文章时 xff0c 大致可以按照三个步骤来做实验 xff0c 推导 xff0c 由这三个步骤来由浅入深地去理解扩张状态观测器 ESO xf

随机推荐

  • 冰冻三尺非一日之寒-自学篇 浅谈个人学习方法

    昨晚还在看比赛 xff08 war3 xff09 xff0c 小源跑过来问我明天1024 xff0c 不写篇文章么 xff0c 想想也是 xff0c 1024这也算个热点 xff0c 赶紧来蹭蹭 xff0c 哈 xff0c 开个玩笑 上次谈
  • 栈中存储什么?

    一条线程对应一个栈 xff0c 一个方法对应一个栈帧 栈中 xff0c 存储的是一个一个的栈帧 xff0c 栈帧存储的是什么呢 xff1f 局部变量表 xff1a 存储的局部变量 xff0c 0位置代表this 操作数栈 xff1a 作用是
  • pdf导入pcb

    分为下面几步 xff1a 1 Illustrator 打开pdf 文件 导出为dxf 2 autocad 打开 xff0c 看看比例对不对 xff0c 缩放比例正确以后 xff0c 保存 旋转命令为rotate 测量为di 放大为sc 3
  • 如何在raspiberry pi上运行x86程序

    如何在raspiberry pi上运行x86程序 第一步 xff1a 下载ExaGear 步骤 xff1a 首选项 gt Add Remove Software gt 搜索ExaGear gt 下载搜索出来的四个包 第二步 xff1a 下载
  • 基于TINY4412的Andorid开发-------简单的LED灯控制【转】

    基于TINY4412的Andorid开发 简单的LED灯控制 阅读目录 Content 一 编写驱动程序二 编写代码测试驱动程序三 编写HAL代码四 编写Framework代码五 编写JNI代码六 编写App 参考资料 xff1a Andr
  • 计算机视觉——opencv-python

    opencv xff1a question1 10 main contentoriginal materialtrouble shootingq1 通道交换q2 灰度化q3 二值化q3 大津二值化算法 xff08 Otsu 39 s Met
  • 数字一阶低通滤波器simulink仿真

    数字一阶低通滤波器simulink仿真 原理程序所用公式滤波系数计算方法 仿真根据公式搭建使用simulink自带模型 原理 程序所用公式 y n 61 q x n 43 1 q y n 1 其中 xff0c y n 表示当前的输出 xff
  • SDFormat

    http sdformat org
  • putty远程连接不上虚拟机里的linux

    昨天跟着阿铭的视频在虚拟机中搭建了centos6 xff0c 然后用putty远程连接成功 今天中午鼓弄putty 的时候 xff0c 连接就报错了 xff1a network error xff1a connection refuse 网
  • 【ADRC】根据ADRC的思想改进PID

    根据前面两篇关于ADRC的文章以及PID原理的文章 xff0c 我们可以利用ADRC的思想来对PID算法做一些改进来看看效果 xff0c 可以将改进的PID称之为非线性PID 主要可以利用跟踪微分器 xff0c 针对PID的两个缺陷来进行改
  • STM32F1 TCA9548A 驱动多个IIC器件

    TCA9548A的用途就是IIC扩展 xff0c 每个TCA9548A可以扩展出8路IIC TCA9548A芯片带有地址选择引脚A0 A1 A2 xff0c 根据高低电平不同 xff0c 从MCU的一路IIC最多可以接入8个TCA9548A
  • 无限 for 循环的实现【Python】

    for 循环怎么才能无限循环下去呢 xff1f 1 最 low 的方法 xff1a 一个无限的列表 理解 for 在干什么 xff0c 在遍历 xff0c 那我们给他一个无限长的东西 xff0c 不就无限循环了 list span clas
  • VirtualBox 安装增强功能时无工具栏

    最近在学Ros xff0c 老师虚拟机用的是VirtualBox xff0c 在安装增强功能时 xff0c 找不到窗口顶部的工具栏 xff0c 如图 1 1所示 查了不少解决方案 xff0c 总结如下 图 1 1 Virtu alBox虚拟
  • Eigen库中的Identity()函数作用

    今天学习Eigen库 xff0c 看到示例代码中有这样一行 xff1a Matrix3d rotation matrix 61 Matrix3d Identity Matrix3d xff1a Eigen库中typedef的数据类型 xff
  • SLAM十四讲-ch3-vistalizegeometry编译问题

    最近在学高翔博士的 SLAM十四讲 xff0c 在ch3中运行vistalizegeometry这个demo的时候 xff0c 出现如下报错信息 xff08 图片版报错看不清的话 xff0c 文末 附文字版的报错信息 xff09 xff1a
  • C++库fmt缺失导致编译失败的解决方案【SLAM十四讲/ch4】

    最近学习高翔博士的SLAM十四讲 xff0c 学到ch4的时候 xff0c 实际运行demo报错 查看CMakeLists txt xff0c 发现Ubuntu20 04需要额外安装fmt库才可以编译通过 解决方法 xff1a 直接去fmt
  • SLAM十四讲编译全过程记录与错误与解决方案汇总

    章节目录 ch2 ch3 ch4 ch5 ch7 ch8 ch9 ch10 ch11 ch2 编译正常 xff0c log如下 xff1a slambook2 master ch2 mkdir build amp amp cd build
  • ROS安装:一键解决人生烦恼

    首先 xff0c 这个方法不是我发明的 xff0c 详情请见文末链接 不管你是unbuntu 16 18 20 xff0c 不管你是新安装的系统 xff0c 还是ROS装了一部分进行不下去的烂摊子都适用 xff01 直接输入下面这一行代码
  • 【Eigen库使用】角轴、旋转矩阵、欧拉角、四元数转换

    零 前言 在slam中经常用到的四种描述机器人orientation的变量 xff0c 他们之间可以相互转化 xff0c 使用Eigen库可以很容易的做到这一点 xff0c 需要特别关注的是 xff1a 欧拉角与其余量之间的转换关系 xff
  • 【Gazebo/ROS】阿克曼小车仿真环境设置中的心得体会

    最近科研需要在gazebo中做一个阿克曼小车的仿真 xff0c 要求小车运动能够通过话题来控制 xff0c 小车上要安装激光雷达 imu 相机等传感器用于SLAM定位建图 由于是第一次接触gazebo仿真 xff0c 所以分享一下学习心得