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

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

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

前言

最近需要进行异构多机器人方面的工作,在之前的工作中已经实现了多麦克纳姆轮小车在gazebo中的仿真。
(如何在Gazebo中实现多机器人仿真 https://www.guyuehome.com/4889)

本文主要介绍了多阿克曼结构小车,在gazebo的配置过程。项目参考了古月居的阿克曼小车项目,以阿克曼小车的模型为基础,针对多机器人的仿真目的进行修改。

原项目github地址:https://github.com/guyuehome/guyueclass/tree/main/simulation%26control/ackerman_simulation

(这个项目在古月学院也有课程,因为作者主要是参考模型,所以没有参考课程,直接基于github源码修改,感兴趣的同学可以去看看课程。
如何在Gazebo中实现阿克曼转向车的仿真 • 王泽恩https://class.guyuehome.com/detail/p_60541530e4b05a6195c158f0/6)

配置过程

1. launch文件修改

原有的仿真只考虑单机器人,需要对其launch文件做如下修改:

  • 加入group及ns属性
  • 去掉原有的全局/racecar的namepsace
  • 使用<tf_prefix>重新定义tf关系

原launch文件:

	<!-- 加载机器人模型描述参数 --><param name="robot_description" command="$(find xacro)/xacro --inorder '$(find racecar_description)/urdf/racecar.urdf.xacro'"/><!--运行joint_state_publisher节点,发布机器人关节状态--><!--<node name = "robot_state_publisher" pkg = "robot_state_publisher" type = "state_publisher">--><node name= "robot_state_publisher" pkg= "robot_state_publisher" type= "robot_state_publisher"><param name="publish_frequency" type="double" value="20.0" /><remap from="/joint_states" to="/racecar/joint_states"/></node><!-- 在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)"/> <!-- 从yaml文件加载联合控制器的参数 --><rosparam file="$(find bringup)/config/ctrl.yaml" command="load"/><!-- 加载控制器 spawner --><node name="controller_manager" pkg="controller_manager" type="spawner" respawn="false" output="screen" ns="/racecar" args="left_rear_wheel_velocity_controller       right_rear_wheel_velocity_controllerleft_front_wheel_velocity_controller      right_front_wheel_velocity_controllerleft_steering_hinge_position_controller   right_steering_hinge_position_controllerjoint_state_controller"/><node pkg="racecar_description" type="servo_commands.py" name="servo_commands" output="screen">
</node>

修改后的launch文件:

<!--机器人robot_0--><group ns="robot_0"><!-- 加载机器人模型描述参数 bodyframe作用是向xacro文件中传参-->	<param name="robot_description" command="$(find xacro)/xacro --inorder '$(find racecar_description)/urdf/racecar.urdf.xacro' bodyframe:=robot_0 ns:=robot_0"/><!-- 运行joint_state_publisher节点,发布机器人的关节状态  --> <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node> <!-- 运行robot_state_publisher节点,发布tf  --><!--<node name = "robot_state_publisher" pkg = "robot_state_publisher" type = "state_publisher">--><node name= "robot_state_publisher" pkg= "robot_state_publisher" type= "robot_state_publisher"><param name="publish_frequency" type="double" value="20.0" /><param name="tf_prefix" value="robot_0" /></node><!-- 在gazebo中加载机器人模型--><node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"args="-urdf -model robot_0 -param robot_description -x $(arg x_pos0) -y $(arg y_pos0) -z $(arg z_pos0)"/> <!-- 从yaml文件加载联合控制器的参数 --><rosparam file="$(find bringup)/config/ctrl.yaml" command="load"/><!-- 加载控制器 spawner --><node name="controller_manager" pkg="controller_manager" type="spawner" respawn="false" output="screen"args="left_rear_wheel_velocity_controller       right_rear_wheel_velocity_controllerleft_front_wheel_velocity_controller      right_front_wheel_velocity_controllerleft_steering_hinge_position_controller   right_steering_hinge_position_controllerjoint_state_controller"/><!-- 舵机控制转换节点 --><node pkg="racecar_description" type="servo_commands.py" name="servo_commands" output="screen"></node></group>

2. urdf文件中的修改

1) 在原有的racecar.urdf.xacro文件中,在line468 对gazebo_ros_control的插件进行了namespace定义,需要进行删去,否则在launch文件中我们加入的group的ns属性无法加上去,gazebo会出现卡死的情况(也是一开始让我非常疑惑的一点)。

  <gazebo><plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so"><legacyModeNS>true</legacyModeNS><robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType><!--robotNamespace>/racecar</robotNamespace--></plugin></gazebo>

2) lidar.xacro, imu.xacro, camera.xacro中的topicname,都需要去掉全局“/”,否则无法加上命名空间。

3. yaml文件中的修改

在launch文件中我们需要从yaml文件加载联合控制器的参数,在原有的yaml文件中,文件的第一行写了racecar:,这样就导致yaml文件中的所有的参数都会加上racecar/的命名空间前缀,导致出错。我们需要将第一行的racecar:删去。

#racecar:# Publish all joint states --公布所有--------------------joint_state_controller:type: joint_state_controller/JointStateControllerpublish_rate: 50....

4.servo_commands.pykeyboard_teleop.py中的修改

这两个文件中的修改都一样,就是将所有的/racecar命名空间去掉,同时将所有全局消息改成局部消息(去掉前面的全局“/”)。

例如:

/ackermann_cmd_mux/output ---> ackermann_cmd_mux/output
/left_rear_wheel_velocity_controller/command ---> left_rear_wheel_velocity_controller/command

servo_commands.py

pub_vel_left_rear_wheel = rospy.Publisher('left_rear_wheel_velocity_controller/command', Float64, queue_size=1)
pub_vel_right_rear_wheel = rospy.Publisher('right_rear_wheel_velocity_controller/command', Float64, queue_size=1)
pub_vel_left_front_wheel = rospy.Publisher('left_front_wheel_velocity_controller/command', Float64, queue_size=1)
pub_vel_right_front_wheel = rospy.Publisher('right_front_wheel_velocity_controller/command', Float64, queue_size=1)pub_pos_left_steering_hinge = rospy.Publisher('left_steering_hinge_position_controller/command', Float64, queue_size=1)
pub_pos_right_steering_hinge = rospy.Publisher('right_steering_hinge_position_controller/command', Float64, queue_size=1)
...
rospy.Subscriber("ackermann_cmd_mux/output", AckermannDriveStamped, set_throttle_steer)

keyboard_teleop.py

  pub = rospy.Publisher("ackermann_cmd_mux/output", AckermannDriveStamped,queue_size=1)

可以通过加命名空间对任一机器人进行键盘控制

ROS_NAMESPACE=robot_0 rosrun racecar_description keyboard_teleop.py

效果

在这里插入图片描述

总结

其实单机器人到多机器人的配置过程都大同小异,其关键在于运用,将ns属性加给每一个机器人,使不同的机器人加载同一个urdf模型文件,同时可以用不同的namespace对其进行区分。

这一次配置的重点,就是在顶层加入namespace后,发现会有各种各样的bug,那么问题很清晰,肯定是下一层的配置文件中存在着不同的命名空间,导致上层命名失败。根据这个思路,一步步排查即可。

原项目作者的模型建的很好,只是可能没考虑到多机器人的运用,在他的基础上进行开发,也减少了很多重复造轮子的工作。之后作者也会一直更新基于多异构机器人平台的项目开发过程。

“山路若抖缓步迈,斗酒洒羁绊”


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

相关文章

记实现多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;#硕士答辩看到一篇非常惊喜的论文#词条登上微博热搜&…

Git远程仓库—Github

一、创建远程仓库 以下操作为演示在Github网站上创建远程仓库 1.登陆注册Github2.创建仓库入口 3.编辑仓库信息 4.仓库创建完成 5.查看仓库地址 远程仓库地址 https://github.com/qruihua/info.git 二、配置SSH 选择SSH操作 如果某台电脑需要与Github上的仓库交互&#xff0c…

Git远程仓库与分支管理

文章目录 Git远程仓库什么是远程仓库什么是GitHub环境搭建添加远程库从远程库克隆 Git分支管理创建与合并分支解决冲突分支管理策略Bug分支Feature分支多人协作Rebase Git远程仓库 什么是远程仓库 远程仓库就是 在公网服务器上的仓库。 Git离线提交的原理就是&#xff1a;修改…

【Linux】使用git 连接到远程gitee仓库

一.创建gitee仓库 登陆到自己的gitee&#xff0c;点击新建仓库 输入仓库名称&#xff0c;注意gitee初次创建仓库时只能设置成私有的 创建后的页面是这样的&#xff0c;复制HTTPS 二.git三板斧 1.安装git 打开xshell&#xff0c;输入命令&#xff1a; yum install git 可以输入…