gazebo多机器人仿真和move_base,diff_drive等gazebo包配置

gazebo中的多机器人仿真指的是在gazebo中加入多个urdf,并控制机器人运动。下面是我总结的一些名称的命名规律

1 joint名称

在spawn_model中,通过-model model_name添加参数,则joint名称为: model_name::joint_name,该名称可以通过gazebo仿真查看,和命名空间无关。

2 topic名称

topic名称的修改是通过在launch file中加入命名空间实现的。值得注意的是:topic名称只需要修改一次,如果在最外层group加入了ns参数,或者通过include标签加入了ns参数,则里面包含的文件和节点都不应该添加命名空间ns参数。

举例:

  <include file="$(find agv_gazebo)/launch/agv_gazebo.launch" ns="agv_car0">
	<arg name="ns" value="agv_car0"/>
  </include>

那么在agv_gazebo.launch中所有的节点包括group就不应该再次添加ns标签。而我传入ns参数的原因是为了修改gazebo包中的一些参考系名称,所以传入了ns.

3 节点名称

节点名称也受命名空间影响,因此不同命名空间下的可以有同名的节点,不需要修改节点名称。如果指定节点name属性为node_name,那么实际情况下,节点名称会变为: ns\node_name

4 urdf中gazebo包配置相关的

如何将参数传入urdf或者xacro文件中:在加载入参数服务器时候添加参数,比如:

<param name="robot_description" 
		command="$(find xacro)/xacro '$(find agv_gazebo)/urdf/agv_car.urdf.xacro' ns:=$(arg ns)" />

然后在xacro文件中通过$(arg xxx)使用该参数,注意xacro中使用变量的方法是${xxx}

4.1 坐标系frame

可能在配置gazebo包,比如diff_drive中遇到,该值不受命名空间影响,需要自己修改为需要的值。比如说:

<odometryFrame>$(arg ns)/odom</odometryFrame>

4.2 配置topic

受到命名空间影响,不需要自己配置,比如

<odometryTopic>odom</odometryTopic>

实际发布的位置是ns/odom

4.3 配置 robotNamespace

需要自己配置,不受命名空间影响

<robotNamespace>$(arg ns)</robotNamespace>

5 launch文件中配置

5.1 坐标系frame配置

都需要自己添加,不受命名空间影响。比如

<param name="odom_frame_id" value="$(arg ns)/odom"/>

以及

<param name="local_costmap/robot_base_frame" value="$(arg ns)/base_footprint"/>

5.2 传感器配置

move_base中的scan需要自己添加命名空间:

<param name="scan" value="{sensor_frame: $(arg ns)/laser, data_type: LaserScan, topic: $(arg ns)/scan, marking: true, clearing: true}"/>

值得注意的是,这个laser的坐标系出现的位置是在urdf中指定的:

<plugin name="gazebo_rplidar" filename="libgazebo_ros_laser.so">
  <topicName>scan</topicName>
  <frameName>$(arg ns)/laser</frameName>
</plugin>

这个例子也很好体现了在urdf中,命名空间只影响topic,不影响frame

6 坐标系分析

有两种可行的坐标系,分别是每个机器人有一个独立的odom坐标系,以及共用一个odom坐标系,odom坐标系是里程计坐标系,不知道这两种的区别。我使用的是独立的odom坐标系。

独立的odom坐标系,例子是:https://blog.csdn.net/weixin_44388819/article/details/125875872

gmapping包会自动public
如果没用gmapping则用tf public
gazebo diff_drive包public
map
ns1/odom
ns2/odom
ns1/base_link
ns1/base_footprint

下面看下公用的odom参考系,例子是: https://www.guyuehome.com/4889

自己用tf public
gazebo diff_drive包public
map
odom
ns1/base_link
ns2/base_link
ns1/base_footprint

这里需要注意了:

  • 在urdf里面配置gazebo的diff_drive中parent标签和child标签必须填两种中的一种,
  • 如果是第二种,则需要自己用tf发布map和odom的关系,而且odom前面不能有命名空间。

我一开始同时参考他们两个例子,结果发现不对。后来发现两个例子的思路是有区别的。

猜你喜欢

转载自blog.csdn.net/HGGshiwo/article/details/128793520