小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
ros noetic 版本多机器人仿真
-
在ubuntu20.04当中运行turtlebot3的仿真,运行launch文件之后,查看tf树,发现tb3_0和tb3_0/base_footprint没有连在一起,urdf没有修改用的原来的,这是我的launch文件
<launch>
<!-- 机器人初始化位置参数 -->
<arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
<arg name="robot_name" default="tb3_0"/>
<arg name="robot_x_pos" default="0.0"/>
<arg name="robot_y_pos" default="0.0"/>
<arg name="robot_z_pos" default=" 0.0"/>
<arg name="robot_yaw" default=" 0.0"/>
<arg name="global_frame_id" default="$(arg robot_name)/map" /><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 robot_name)">
<!-- 导入机器人参数 --><param name="robot_description" command="$(find xacro)/xacro --inorder $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" /> <!-- 机器人位置发布节点 --> <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 robot_name)" /> </node> <!-- <param name="tf_prefix" value="$(arg robot_name)" /> --> <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model $(arg robot_name) -x $(arg robot_x_pos) -y $(arg robot_y_pos) -z $(arg robot_z_pos) -Y $(arg robot_yaw) -param robot_description" /> <!-- gmapping --> <!-- <include file="$(find turtlebot3_gazebo)/launch/multi_turtlebot3_slam.launch"> <arg name="ns" value="$(arg robot_name)"/> </include> -->
<node pkg="gmapping" type="slam_gmapping" name="turtlebot3_slam_gmapping" output="screen" >
<param name="base_frame" value="$(arg robot_name)/base_footprint"/>
<param name="odom_frame" value="$(arg robot_name)/odom"/>
<param name="map_frame" value="$(arg robot_name)/map"/>
<param name="map_update_interval" value="2.0"/>
<param name="maxUrange" value="4.0"/>
<param name="minimumScore" value="100"/>
<param name="linearUpdate" value="0.2"/>
<param name="angularUpdate" value="0.2"/>
<param name="temporalUpdate" value="0.5"/>
<param name="delta" value="0.05"/>
<param name="lskip" value="0"/>
<param name="particles" value="120"/>
<param name="sigma" value="0.05"/>
<param name="kernelSize" value="1"/>
<param name="lstep" value="0.05"/>
<param name="astep" value="0.05"/>
<param name="iterations" value="5"/>
<param name="lsigma" value="0.075"/>
<param name="ogain" value="3.0"/>
<param name="srr" value="0.01"/>
<param name="srt" value="0.02"/>
<param name="str" value="0.01"/>
<param name="stt" value="0.02"/>
<param name="resampleThreshold" value="0.5"/>
<param name="xmin" value="-10.0"/>
<param name="ymin" value="-10.0"/>
<param name="xmax" value="10.0"/>
<param name="ymax" value="10.0"/>
<param name="llsamplerange" value="0.01"/>
<param name="llsamplestep" value="0.01"/>
<param name="lasamplerange" value="0.005"/>
<param name="lasamplestep" value="0.005"/>
<!-- <remap from="scan" to="$(arg scan_topic)" />
<remap from="map" to="$(arg map_topic)" /> -->
</node></group>
</launch>
这是我的rqt_tf_tree
-
在你的描述中,你提到在tf树中
tb3_0
和tb3_0/base_footprint
没有连在一起。这通常意味着在tf变换发布中存在一些问题。以下是一些可能的解决步骤和检查点:-
检查URDF文件:
确保URDF文件中base_footprint
和机器人其他部分(如base_link
)之间的tf变换是正确的。通常,base_footprint
是相对于base_link
的,且变换通常是一个简单的平移,没有旋转。你可以在turtlebot3_description
包中找到URDF文件,并检查相关的<joint>
和<link>
定义。 -
检查
robot_state_publisher
节点:
robot_state_publisher
节点负责从URDF/XACRO文件中读取机器人描述,并发布tf变换。确保该节点正在运行,并且参数设置正确。你已经设置了tf_prefix
参数,这通常是正确的做法来区分多个机器人的tf树。 -
检查Gazebo中的模型加载:
确保Gazebo正确加载了URDF模型。你可以在Gazebo中查看模型是否正确显示,并且各个部分(如轮子、传感器等)是否都在正确的位置。 -
检查tf变换发布:
使用rosrun tf view_frames
命令生成tf树的可视化文件,并用evince frames.pdf
查看。这可以帮助你直观地看到tf树的结构和潜在的断开连接。 -
检查日志输出:
查看robot_state_publisher
和gazebo
的日志输出,看是否有任何错误或警告信息。这些信息可能会提供关于为什么tf变换没有正确发布的线索。 -
重新启动和清理:
有时候,重新启动ROS核心和Gazebo,以及清理工作空间(如使用catkin_make clean
),可以解决一些看似复杂的问题。 -
检查
spawn_model
命令:
确保spawn_model
命令正确执行,并且模型被放置在Gazebo中的预期位置。参数-x
,-y
,-z
,-Y
应该正确设置。 -
确保没有名称冲突:
如果你的环境中有多个机器人,确保每个机器人的名称和命名空间都是唯一的,以避免tf变换的冲突。
如果以上步骤都没有解决问题,你可能需要更深入地检查每个组件的配置和代码,特别是与tf变换相关的部分。希望这些步骤能帮助你解决问题!
以上为生成回答,仅供参考~
-
-
有一篇博客提到这个问题,https://wenda.ncnynl.com/question/116464,可以试一下。
我自己的工程中使用了robot_pose_ekf这个包做卡尔曼滤波,在这个包中配置tf名解决的这个问题。