ROS学习记录(二)阿克曼转向车运动学模型及在gazebo中搭建仿真环境

article/2025/8/18 23:05:00

前言:该篇是ROS学习记录的第二篇,如果还没关注过之前文章的读者,如有需要可以通过下方传送门去看之前的文章:

ROS学习记录(一) Plugin插件

这两天关注了古月老师的公众号,看到了其中一篇课程推荐:

好课推荐|《如何在Gazebo中实现阿克曼转向车的仿真》课程优惠中 (qq.com)

寻思着过段时间实验室买的新车是基于阿克曼转向的,而之前学的ROS小车导航定位等算法大多都是基于两轮差分的车辆模型。为了更贴近今后实验室的机器人平台及真实车辆的模型,又正好看到了古月老师推荐的课程,便咬咬牙和另外两位同僚花了点钱拼下了课程。古月老师的课程共五讲,那我这个系列接下来3篇左右的文章就记录一下我学习该课程的一些总结和思考。

今天这篇文章主要是阿克曼转向车辆运动学模型分析,及在gazebo中搭建阿克曼转向车辆的仿真环境。

一、阿克曼转向车辆运动学模型

1、车辆转向模型

通常来说,车辆转向模型大致可以分为四种:

① 差速转向模型;                           ② 麦克纳姆轮模型;

 

③ 履带模型;                                        ④ 阿克曼转向模型。

 图片来源:古月居课程及百度图片

不像其他三种转向模型可以实现原地旋转或通过轮胎、履带差速的方式控制车辆的转向和速度,阿克曼转向模型具有后轮驱动、前轮转向的特点,这可以很自然的让我们联想到日常乘坐的民用汽车,的确当今民用汽车所使用的都是阿克曼转向模型,因此了解阿克曼转向原理对后续不论是实验车或者真车的无人驾驶实验都是很重要的。

2、阿克曼转向运动学模型

由阿克曼转向的特点,可以将其转向模型表示成如下形式:

即要求车辆转向时,左右前轮的瞬时转向中心重合于后轮所在直线上的同一点,因此实际上车辆转弯时内侧轮的转向角度要略微大于外侧轮的转向角度,两个轮子呈一个梯形而非平行四边形:

 图片来源:https://www.icauto.com.cn/baike/71/716170.html

为了便于分析,通常可以将模型进行简化,即在前轮中心和后轮中心各假想一个轮胎来代表前后轮的运动,即所谓的单车模型:

    

控制量通常选取后轮速度v及前轮转角\delta ,状态量选取世界坐标系下的坐标xy及航向角\theta,则阿克曼转向的运动学模型可以表示为: 

\LARGE \left\{\begin{matrix}\dot{x}=vcos\theta \\ \dot{y}=vsin\theta \\ \dot{\theta }=\frac{vtan\theta }{L} \end{matrix}\right.

对应的里程计模型为:

\LARGE \left\{\begin{matrix}x_{t+1}=x_{t} + v_{t}cos(\theta _{t})d_{t} \\ y_{t+1}=y_{t} + v_{t}sin(\theta _{t})d_{t} \\ \theta_{t+1} = \theta_{t} + \omega_{t}d_{t} \end{matrix}\right.

 二、在gazebo中搭建仿真环境

1、源码下载

在工作空间中下载课程源码:Zeende/racecar_sim (gitee.com),共包含三个文件夹:

将其中的smartcar_plane能包复制到.gazebo/models文件夹下,该功能包包含了gazebo中的仿环境模型文件。

2、阿克曼转向模型

由于阿克曼转向前轮部分实际上是通过四连杆机构来进行控制,而urdf模型中无法直接添加四连杆机构,所以这里采用的方式是给车辆前轮设定一个旋转轴。除了轮胎本身可以绕水平轴旋转外,还可以绕着一根假象的与地面垂直的轴进行旋转,从而改变前轮转向角。

 图片来源:古月居课程

racecar.urdf.xacro车辆模型的描述文件中,可以找到对前轮部分垂直于地面旋转轴的描述的相关代码:

...<joint name="${lr_prefix}_steering_joint" type="revolute"><parent link="${lr_prefix}_steering_link"/><child link="${lr_prefix}_${fr_prefix}_axle_carrier"/><axis xyz="0 0 1"/><limit lower="${-degrees_45}" upper="${degrees_45}"effort="${servo_stall_torque}" velocity="${servo_no_load_speed}"/>
</joint>...

可以注意到这里添加的joint定义了一个<axis xyz="0 0 1"/>,即允许前轮绕z轴旋转,旋转的角度为<limit lower="${-degrees_45}" upper="${degrees_45}",即-45°到+45°,这里采用宏定义的方式将角度转化为了弧度:

...<xacro:property name="degrees_45" value="0.785398163"/><xacro:property name="degrees_90" value="1.57079633"/>
...

其它部分对轮胎的定义与差速小车相同。在最后需要将定义好的车辆前后轮模型进行引用:

...<xacro:front_wheel lr_prefix="left" fr_prefix="front"lr_reflect="1" fr_reflect="1"/><xacro:front_wheel lr_prefix="right" fr_prefix="front"lr_reflect="-1" fr_reflect="1"/><xacro:rear_wheel lr_prefix="left" fr_prefix="rear"lr_reflect="1" fr_reflect="-1"/><xacro:rear_wheel lr_prefix="right" fr_prefix="rear"lr_reflect="-1" fr_reflect="-1"/>
...

3、launch文件设置

① 在racecar_gazebo.launch文件中添加设置好的机器人模型:

...<!-- 加载机器人模型描述参数 --><param name="robot_description" command="$(find xacro)/xacro --inorder '$(find racecar_description)/urdf/racecar.urdf.xacro'"/><!-- 在gazebo中加载机器人模型--><node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"args="-urdf -model racecar -param robot_description -x $(arg x_pos) -y $(arg y_pos) -z $(arg z_pos)"/> 
...

需要注意的是,xacro文件无法直接加入到gazebo中,需要通过工具转化为参数放在robot_description中。

② 加载仿真环境模型

<!-- 设置launch文件的参数 --><arg name="paused" default="false"/><arg name="use_sim_time" default="true"/><arg name="gui" default="true"/><arg name="headless" default="false"/><arg name="debug" default="false"/>	
...<!--运行gazebo仿真环境--><include file="$(find gazebo_ros)/launch/empty_world.launch"><arg name="debug" value="$(arg debug)" /><arg name="gui" value="$(arg gui)" /><arg name="paused" value="$(arg paused)"/><arg name="use_sim_time" value="$(arg use_sim_time)"/><arg name="headless" value="$(arg headless)"/><arg name="world_name" value="$(find racecar_description)/worlds/racetrack.world"/></include>

③ 设置小车初始位置

...<!--模型车的起点放置位置--><arg name="x_pos" default="-0.5"/><arg name="y_pos" default="0"/><arg name="z_pos" default="0.0"/>
...

4、加载模型

在终端中运行launch文件

roslaunch bringup racecar_gazebo.launch

最终效果如下:

结语

本篇主要介绍了阿克曼转向车辆的运动学模型,及在gazebo中加载仿真环境。

目前为止程序中还没添加控制器及发布里程计数据,所以在rviz中仅能看到车辆模型,但无法通过keyboard控制,小车原地不动。

下一篇中我会根据古月老师的课程讲解,说明一下给小车添加ros_control功能以实现对小车控制的过程,及自定义发布里程计数据的程序。

文章如有侵权的地方,请及时与我联系修改。


http://chatgpt.dhexx.cn/article/Ec9KVoMA.shtml

相关文章

(ROS)ROS智能车自主导航roslaunch racecar_gazebo racecar_runway_navigation.launch报错

前提&#xff1a; 修改修改racecar_runway_navigation.launch文件后&#xff0c;运行roslaunch racecar_gazebo racecar_runway_navigation.launch 出现红色报错。 ERROR: cannot launch node of type [move_base/move_base]: move_base ROS path [0]/opt/ros/indigo/share/ro…

用ROS来做无人测试平台系列之国外的一些RACECAR

MIT RACECAR&#xff0c;最早开始做racecar的&#xff0c;主要基于双目摄像头激光雷达: http://fast.scripts.mit.edu/racecar/hardware/ UPENN F1 TENTH&#xff0c;同MIT racecar特别像&#xff0c;不过很多东西需自己组装&#xff0c;电调模块需自己焊接: http://f1tenth.o…

多移动机器人(阿克曼小车)在gazebo中的配置

多移动机器人&#xff08;阿克曼小车&#xff09;在gazebo中的配置 前言 最近需要进行异构多机器人方面的工作&#xff0c;在之前的工作中已经实现了多麦克纳姆轮小车在gazebo中的仿真。 &#xff08;如何在Gazebo中实现多机器人仿真 https://www.guyuehome.com/4889&#xf…

记实现多racecar仿真过程中遇到的问题(一)

最近尝试过使用多turtlebot3仿真之后&#xff0c;想测试一下多Ackermann结构车的仿真效果&#xff0c;在一番寻找下将目光锁定到了MIT-racecar。但是在使用过程中遇到了许多问题&#xff0c;在此记录一下。 运行环境&#xff1a; Ubuntu18.04(虚拟机)&#xff0c;ROS-melodic…

HackTheBox You know racecar 格式化字符串漏洞pwn题目

题目网址&#xff1a; https://app.hackthebox.com/challenges/racecar解压密码为hackthebox 文件信息收集 file racecar这是一个32位的程序&#xff0c;动态链接的 checksec vuln防护都开着的&#xff0c;从上到下依次是 32位程序 全部RELRO 开启栈保护 启用数据执行防护…

什么是Race Condition?

简介 race condition是多线程的应用程序中经常遇到的问题&#xff0c;本文章接下来会解释什么是race condition&#xff0c;如何检测到它们以及如何解决这类问题。 Race condition 从定义来说&#xff0c;race condition是代码中一些执行结果取决于其执行的相对时间或者多线…

免费教程·开源 | 从零开始制作ROS无人竞速车RACECAR教程

一、课程前提 自动驾驶汽车即将成为交通出行的主流工具之一&#xff0c;它以计算机、现代汽车产业技术为基础&#xff0c;以数字化、智能化为依托实现自动化驾驶&#xff0c;学习自动驾驶需要了解架构、环境感知、行为决策、规划路径&#xff0c;多传感器融合等一系列技术&…

Racecar 基于ROS通信机制的多点导航实验

基于ROS通信机制的多点导航实验 一、实验目的二、实验环境三、实验原理四、实验内容五、实验步骤1.获取rviz发送目标点的topic&#xff1b;2.对已经建好的图获取相应目标点的坐标&#xff08;多个&#xff0c;即小车要去的目标&#xff09;&#xff0c;还没建图先完成建图&…

C语言的整数除法

c语言的整数除法是向下取整的。

C语言 从5~100之间找出能被5或7整除的数

从5~100之间找出能被5或7整除的数 算法分析&#xff1a;注意“或”的理解&#xff1a;或此或彼或彼此 #include "stdio.h" main( ) { int i;for(i5;i<100;i)if(i%50||i%70)printf("%d\t",i); }有伙伴问倒序输出&#xff1a; 在线编译C语言&#xff1a;…

C语言实现计算数字能否被3个数整除

C语言实现计算数字能否被3个数整除 编程实现&#xff1a;输入一个整数&#xff0c;判断它能否被3&#xff0c;5&#xff0c;7整除&#xff0c;并输出以下信息之一&#xff1a; ①能同时被3&#xff0c;5&#xff0c;7整除&#xff1b; ②能被其中两数(要指出哪两个)整除&#x…

C语言-求能被7或11整除的整数

本关任务&#xff1a;编写程序求[1&#xff0c;1000]范围内能被7或11整除&#xff0c;但不能同时被7和11整除的整数。按每行8个数&#xff0c;每个数占5个字符且以左对齐的格式进行输出。 #include<stdio.h> int main() {int i1;int count0;for(i1;i<1000;i){if((i%7…

c语言学习-判断一个数是否能被3整除

判断一个数是否能被3整除 在主函数中输入整型数据n,判断该数是否能被3整除&#xff0c;如果能被3 整除&#xff0c;输出“yes”,否则输出“no” 程序流程图&#xff1a; void main() { int a; printf("please enteraguess number:\n"); scanf("%d",&…

C语言--编写程序,输入一个整数,判断它能否被3,5,7整除

编写程序&#xff0c;输入一个整数&#xff0c;判断它能否被3,5,7整除&#xff0c;并输出下列信息之一&#xff1a; 能同时被3,5,7整除&#xff1b;能被x和y两个数整除&#xff1b;能被x整除&#xff1b;不能被3,5,7任一个数整除。 #include <stdio.h> void main() { in…

【C语言】数据整除判断

题目&#xff1a;C语言编程实现——输入一个整数&#xff0c;判断它能否被 3&#xff0c;5&#xff0c;7 整除&#xff0c;并输出以下信息之一&#xff1a; ①能同时被 3&#xff0c;5&#xff0c;7 整除&#xff1b; ②能被其中两数&#xff08;要指出哪两个&#xff09;整除…

C语言—整除问题、求余、赋值、逻辑运算符易错点

前言 &#x1f428;这一篇主要是讲那些老师可能不会讲&#xff0c;但是很多初学者都容易踩坑的地方 &#x1f914; 根据自己踩过的的坑整理了一下&#x1f927; 文章目录 前言一、整除问题1️⃣第一种情况&#xff1a;整数相除&#xff0c;抹去小数位2️⃣第二种情况&#xff…

东南大学本 硕 博论文中期答辩 毕业答辩ppt模板2021版

东南大学本硕博开题、中期、毕业论文答辩ppt模板 ppt模板样式如下&#xff1a; 如果对您有用 &#xff0c;欢迎点赞&#xff0c;关注和收藏&#xff0c;谢谢各位路官。 下载地址 https://download.csdn.net/download/Vertira/19026191

计算机硕士系统毕业论文答辩ppt,计算机硕士论文答辩ppt

为毕业生写计算机硕士论文答辩ppt提供计算机硕士论文答辩ppt范文参考,涵盖硕士、大学本科毕业论文范文和职称论文范文,包括论文选题、开题报告、文献综述、任务书、参考文献等,是优秀免费计算机硕士论文答辩ppt网站。 费孝通的博士论文答辩“花天酒地” 费孝通的博士论文答辩…

毕业生必看:硕士答辩注意事项!

通过本次硕士答辩感触最深的就是能从中学习到很多东西&#xff0c;而最主要的就是专家在审查论文的时候会有哪些点&#xff1f;在提问的过程中会提到什么问题&#xff1f;还有就是各位师弟师妹们在陈述自己论文的时候要结合自己PPT重点的引导专家看论文等等&#xff0c;具体本次…

热搜!硕士答辩看到一篇非常惊喜的论文,网友直呼:求导师分享全文

点击上方“视学算法”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 本文整理自微博、中国青年报&#xff08;ID&#xff1a;zqbcyol &#xff09;、澎湃新闻、中国知网 近日&#xff0c;#硕士答辩看到一篇非常惊喜的论文#词条登上微博热搜&…