当前位置: 首页 > news >正文

多个机器人同时加载在rviz及gazebo同一个场景中

1. 配置launch文件

gazebo的加载相对容易,但rviz中加载,需要构建完整的tf树(world → map(或map_merged)→ odom → base_footprint → base_link → base_scan)才能正常显示,launch文件主要是在构建tf树。

<launch><arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/><arg name="first_tb3"  default="tb3_0"/><arg name="second_tb3" default="tb3_1"/><arg name="third_tb3"  default="tb3_2"/><arg name="first_tb3_x_pos" default="-7.0"/><arg name="first_tb3_y_pos" default="-1.0"/><arg name="first_tb3_z_pos" default=" 0.0"/><arg name="first_tb3_yaw"   default=" 1.57"/><arg name="second_tb3_x_pos" default=" 7.0"/><arg name="second_tb3_y_pos" default="-1.0"/><arg name="second_tb3_z_pos" default=" 0.0"/><arg name="second_tb3_yaw"   default=" 1.57"/><arg name="third_tb3_x_pos" default=" 0.5"/><arg name="third_tb3_y_pos" default=" 3.0"/><arg name="third_tb3_z_pos" default=" 0.0"/><arg name="third_tb3_yaw"   default=" 0.0"/><include file="$(find gazebo_ros)/launch/empty_world.launch"><arg name="world_name" value="$(find turtlebot3_gazebo)/worlds/turtlebot3_house.world"/><arg name="paused" value="false"/><arg name="use_sim_time" value="true"/><arg name="gui" value="true"/><arg name="headless" value="false"/><arg name="debug" value="false"/></include>  <group ns = "$(arg first_tb3)"><arg name="robot_name" default="$(arg first_tb3)"/><arg name="tf_prefix" value="$(arg robot_name)"/><param name="robot_description" command="$(find xacro)/xacro $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro  tf_prefix:=$(arg robot_name)" /><node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen"><param name="publish_frequency" type="double" value="50.0" /><param name="tf_prefix" value="$(arg first_tb3)" /></node><node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model $(arg first_tb3) -x $(arg first_tb3_x_pos) -y $(arg first_tb3_y_pos) -z $(arg first_tb3_z_pos) -Y $(arg first_tb3_yaw) -param robot_description" /><!-- TF 变换:从融合地图到机器人局部地图 --><node pkg="tf" type="static_transform_publisher" name="map_merged_to_robot1_map"args="$0 0 0 0 0 0 map_merged $(arg tf_prefix)/map 100" />  <node pkg="tf" type="static_transform_publisher" name="robot1_map_to_robot1_odom"args="$0 0 0 0 0 0 $(arg tf_prefix)/map $(arg tf_prefix)/odom 100" />  </group><group ns = "$(arg second_tb3)"><arg name="robot_name" default="$(arg second_tb3)"/><arg name="tf_prefix" value="$(arg robot_name)"/><param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro  tf_prefix:=$(arg robot_name)" /><node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen"><param name="publish_frequency" type="double" value="50.0" /><param name="tf_prefix" value="$(arg second_tb3)" /></node><node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model $(arg second_tb3) -x $(arg second_tb3_x_pos) -y $(arg second_tb3_y_pos) -z $(arg second_tb3_z_pos) -Y $(arg second_tb3_yaw) -param robot_description" /><!-- TF 变换:从融合地图到机器人局部地图 --><node pkg="tf" type="static_transform_publisher" name="map_merged_to_robot2_map"args="$0 0 0 0 0 0 map_merged $(arg tf_prefix)/map 100" />  <node pkg="tf" type="static_transform_publisher" name="robot2_map_to_robot2_odom"args="$0 0 0 0 0 0 $(arg tf_prefix)/map $(arg tf_prefix)/odom 100" />  </group><group ns = "$(arg third_tb3)"><arg name="robot_name" default="$(arg third_tb3)"/><arg name="tf_prefix" value="$(arg robot_name)"/><param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro  tf_prefix:=$(arg robot_name)" /><node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" output="screen"><param name="publish_frequency" type="double" value="50.0" /><param name="tf_prefix" value="$(arg third_tb3)" /></node><node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model $(arg third_tb3) -x $(arg third_tb3_x_pos) -y $(arg third_tb3_y_pos) -z $(arg third_tb3_z_pos) -Y $(arg third_tb3_yaw) -param robot_description" /><!-- TF 变换:从融合地图到机器人局部地图 --><node pkg="tf" type="static_transform_publisher" name="map_merged_to_robot3_map"args="$0 0 0 0 0 0 map_merged $(arg tf_prefix)/map 100" />  <node pkg="tf" type="static_transform_publisher" name="robot3_map_to_robot3_odom"args="$0 0 0 0 0 0 $(arg tf_prefix)/map $(arg tf_prefix)/odom 100" />  </group><node pkg="tf" type="static_transform_publisher" name="world_to_map_merged"  args="0 0 0 0 0 0 world map_merged 100" /><!-- 启动RViz --><node pkg="rviz" type="rviz" name="rviz" required="true" args="-d $(find multi_robot)/config/multi_robot.rviz"/> </launch>

2. 修改urdf模型

nano ~/catkin_ws/src/turtlebot3/turtlebot3_description/urdf/turtlebot3_waffle_pi.gazebo.xacro

为各机器人增加tb3/odom->tb3/base_footprint的tf映射,防止odom->base_footprint全局tf映射。

  <gazebo><plugin name="turtlebot3_waffle_pi_controller" filename="libgazebo_ros_diff_drive.so"><commandTopic>cmd_vel</commandTopic><odometryTopic>$(arg tf_prefix)/odom</odometryTopic><odometryFrame>$(arg tf_prefix)/odom</odometryFrame><odometrySource>world</odometrySource><publishOdomTF>true</publishOdomTF><robotBaseFrame>$(arg tf_prefix)/base_footprint</robotBaseFrame><publishWheelTF>false</publishWheelTF><publishTf>true</publishTf><publishWheelJointState>true</publishWheelJointState><legacyMode>false</legacyMode><updateRate>30</updateRate><leftJoint>wheel_left_joint</leftJoint><rightJoint>wheel_right_joint</rightJoint><wheelSeparation>0.287</wheelSeparation><wheelDiameter>0.066</wheelDiameter><wheelAcceleration>1</wheelAcceleration><wheelTorque>10</wheelTorque><rosDebugLevel>na</rosDebugLevel></plugin></gazebo>

3. 执行

roslaunch turtlebot3_gazebo multi_turtlebot3_rviz.launch

在这里插入图片描述

在这里插入图片描述


文章转载自:

http://nSxrE5oT.drfcj.cn
http://G33GlSUO.drfcj.cn
http://j3nw8Tbj.drfcj.cn
http://Hp4IiJwU.drfcj.cn
http://C07vZ5kw.drfcj.cn
http://Esp7BQPa.drfcj.cn
http://ueSAH7TM.drfcj.cn
http://MkNuMtQv.drfcj.cn
http://N3ZAqW3H.drfcj.cn
http://d1MH6VcB.drfcj.cn
http://CYAqNyQz.drfcj.cn
http://qKnO87W2.drfcj.cn
http://X81LAIQo.drfcj.cn
http://Wz4Hi15F.drfcj.cn
http://QKW2e9jh.drfcj.cn
http://O6wIYrnf.drfcj.cn
http://fAjyVQWX.drfcj.cn
http://OhlFUuBj.drfcj.cn
http://WJFh5EX7.drfcj.cn
http://PnoVyhJv.drfcj.cn
http://rtNEO9kJ.drfcj.cn
http://iFcMCSpy.drfcj.cn
http://2TUv0OfP.drfcj.cn
http://5z5WLUgY.drfcj.cn
http://IkCioTlU.drfcj.cn
http://ai967Ith.drfcj.cn
http://H4CbMVVm.drfcj.cn
http://lSd2qaU9.drfcj.cn
http://YyaMbVjF.drfcj.cn
http://pH12I5pr.drfcj.cn
http://www.dtcms.com/a/248329.html

相关文章:

  • Blender 简介 ~ 总结,如何下载Blend格式模型
  • UDS协议中0x31服务(Routine Control)详解及应用
  • 网络安全防护:点击劫持
  • uniapp中vue3 ,uview-plus使用!
  • 【SystemVerilog 2023 Std】第5章 词法约定 Lexical conventions (2)
  • 3款工具打造递进图:快速入门与个性化定制的实用指南
  • 【DNS解析】DNS解析从入门到精通
  • 音视频的前端知识
  • Git更新master分支完整指南:从拉取到推送的全流程
  • ArcGIS Pro 3.4 二次开发 - 工作流
  • Rust 学习笔记1
  • Mysql 函数concat、concat_ws和group_concat
  • 深入解析 MySQL 架构:从基础到高级
  • c++ std::function
  • 语法疫苗:SynCode如何为LLM生成装上“防崩溃引擎”
  • leetcode-hot-100 (链表)
  • 如何使用Postman做接口自动化测试
  • 某靶场CTF题目:利用Apache APISIX默认Token漏洞(CVE-2020-13945)获取Flag
  • lua读取请求体
  • 保姆级安装OpenResty教程
  • 开发指南121-微服务的弹性伸缩
  • opencv 之 视频类 VideoCapture、VideoWriter详细介绍
  • 【论文阅读33】滑坡易发性 PINN ( EG2025 )
  • 论文笔记 <交通灯><多智能体>CoLight管理交通灯
  • 当机床开始“思考”,传统“制造”到“智造”升级路上的法律暗礁
  • “第三届全国技能大赛”倒计时100天—千眼狼高速摄像机为焊接与增材制造项目提供可视化评判依据
  • Cloud Events:事件驱动架构的未来标准化
  • 腐烂之息-(Breath of Decay VR ) 硬核VR游戏
  • 欧洲宇航局如何为航天员提供虚拟现实训练内容
  • vue3 解析excel字节流文件 以表格形式显示页面上 带公式