背景:

这个问题是关于为非商业研究同时模拟一台ErleCopter和一台ErleRover。我想让四旋翼飞行器跟随流动站,而流动站则负责跟随流动站。我试图在凉亭中生成车辆,并使用MAVProxy对其进行控制。 />

生成第二辆车会终止第一个MAVProxy实例,或者
无法将生成的第二辆车链接到MAVProxy的第二个实例。

我不确定该怎么办,因为我不确定这个问题是一个问题还是由两个子问题组成。第一个问题是产生机器人,第二个问题是独立控制两者(并获取两个车辆的状态参数并将其用作反馈)。

我相信导致该问题的一个因素是我试图在一台计算机上进行模拟和两个MAVProxy实例,则将Lenovo-y50-70与Ubuntu 14.04一起使用。两台计算机不容易立即获得,并且我所在的位置存在网络稳定性问题。是由rosrun转到第二个MAVproxy实例吗?”。带有两个MAVProxy实例,每个实例链接到每辆车),或官方文档,这是不可能的。

我尝试过的事情:此问题的早期编辑。为了清楚起见,该信息已删除,但是如果有兴趣,请再次参见此问题的早期版本。快速转到相关内容:

使用下面提到的命令,成功地生成了第二个机器人,如本视频中所述。

cd path_to_urdf_model_files
rosrun gazebo_ros spawn_model -file rover.urdf -urdf -model rover_object


注意:ROS Indigo与众不同;必须使用gazebo_ros而不是gazebo_worlds

机器人自转的怪异行为可能是由于MAVproxy所致;我以前曾经经历过。到目前为止,尝试建立到Copter和Rover的单独网络连接的尝试已经成功。原始结构如下所示:


rover_circuit.launch-> apm_sitl.launch-> node.launch(节点名称:
“ mavros”) br />
当前体系结构如下所示:


copter_circuit.launch-> apm_sitl_copter.launch-> node_copter.launch
(“ mavros_copter”)

rover_circuit1.launch-> apm_sitl_rover.launch-> node_rover.launch(“ mavros_rover”)


rover_ciruit1.launch如下所示:

<launch>

  <include file="$(find mavros)/launch/apm_sitl_rover.launch"></include>
  <arg name="enable_logging" default="true"/>
  <arg name="enable_ground_truth" default="true"/>
  <arg name="log_file" default="rover"/>
  <arg name="tf_prefix" default="$(optenv ROS_NAMESPACE)"/>
  <arg name="model" default="$(find ardupilot_sitl_gazebo_plugin)/urdf/rover.urdf"/>

  <param name="robot_description" command="
    $(find xacro)/xacro.py '$(arg model)'
    enable_logging:=$(arg enable_logging)
    enable_ground_truth:=$(arg enable_ground_truth)
    log_file:=$(arg log_file)"
  />
  <param name="tf_prefix" type="string" value="$(arg tf_prefix)" />

  <node name="spawn_rover" pkg="gazebo_ros" type="spawn_model"
    args="-param robot_description -urdf -model 'rover' " respawn="false" output="screen"></node>

</launch>


这是最小的启动文件,可以正常工作。我曾想到过rosrun apm_sitl_rover.launch和rosrun rover.urdf,但是我一直找不到合适的程序包来直接启动apm_sitl_rover.launch。容易启动附加了方法的启动文件。

命名问题和其他网络错误已解决。

尚待解决的问题:

我在启动和连接第二辆车时仍然遇到问题,但是现在看来,我已经缩小了范围,唯一的问题是使用UDP绑定端口,默认情况下为14555,由于第二个实例使用相同的绑定端口,因此第二个实例使Gazebo崩溃。 .cpp具有url_parse_host(bind_pair,bind_host,bind_port,“ 0.0.0.0”,14555);并且interface.cpp中包含的udp.h具有函数MAVConnUDP(),该函数具有bind_port = 14555,这导致出现“ udp1:绑定地址:14555”和"GCS: DeviceError:udp:bind: Address already in use"。试图评估sim_vehicle.sh,libmavconn和Gazebo之间的联系,我能够弄清楚sim_vehicle.sh在结尾行之一中调用mavproxy.py,而后者又使用了pymavlink。我目前无法找到进一步的关系。

领先的问题/解决方法

由于我有很强的直觉,这是最后阶段,所以我现在解决通过使用interface_copter.cpp和interface_rover.cpp来解决此问题。我认为,如果我可以得到以下问题的答案,那么我可以找出成功发射失败的原因并链接第二(或后续)车辆: sh触发libmavconn程序包并最终触发Gazebo吗?
是否有一个软件架构图描述了从sim_vehicle.sh到关节和控制器的完整结构?

评论

我和普拉萨德之间来回往来相当多,我对问题做了很繁重的编辑,以期尽可能地简洁明了,就我所了解的问题而言,这是最好的。 @PrasadRaghavendra,如果您认为我遗漏了一些东西或删除了某些人可能会帮助您解决的问题,请让我知道或编辑问题以重新纳入。

我意识到,抛弃所有关于尝试过的东西没有用的评论可能会很痛苦,但是我像技术论文一样看待这个问题-很少有人有时间或渴望阅读所有尝试过和失败的事情。每个人都想知道的是:您现在在哪里,您尝试过什么,使您来到这里,目前面临的问题是什么?希望此编辑能够反映出这一点。

#1 楼

我觉得我需要做很多工作才能理解这个问题。您正在尝试模拟两辆车,并且...出了什么问题?您正在尝试在凉亭中对它们进行仿真,对吗?

您是否在ROS网站上看到了此答案,该网站显示一次仿真中启动了两个机器人?正如我所提到的,阅读您的帖子非常困难,这可以解释为什么它很少受到关注。例如,您显示的第一个代码块是什么?什么是第二个代码块?

在两个代码块中,您都有以下行:

<arg name="model" default="$(find ardupilot_sitl_gazebo_plugin)/urdf/erlecopter_base.xacro"/>
<arg name="model" default="$(find ardupilot_sitl_gazebo_plugin)/urdf/rover.urdf"/-->


两个代码块都具有这些行。也就是说,您已将“模型”分配给Erlecopter,然后已将“模型”分配给流动站。 “模型”的两个实例都出现在同一名称空间中,因此我不确定如何区分它们。

再次,我将带您参考ROS论坛上的答案

我将在此处复制文章的一部分,以供将来的访问者参考:


答案是基于turtlebot机器人,但是当然它可以与任何机器人一起使用。尽管通常在此示例中,我们将为每个机器人将它们设置为相同的值,但为达到目的,您会有所不同。他们确实必须共享地图(通常是robot_description)。


(添加了重点)必须启动模拟,在我们的情况下是凉亭。为了使事情更具可读性,我将启动文件分成了几个文件。

一个机器人的启动文件。我们将其命名为one_robot.launch:


<launch>
    <arg name="robot_name"/>
    <arg name="init_pose"/>

    <node name="spawn_minibot_model" pkg="gazebo" type="spawn_model"
     args="$(arg init_pose) -urdf -param /robot_description -model $(arg robot_name)"
     respawn="false" output="screen" />

    <node pkg="robot_state_publisher" type="state_publisher" 
          name="robot_state_publisher" output="screen"/>

    <!-- The odometry estimator, throttling, fake laser etc. go here -->
    <!-- All the stuff as from usual robot launch file -->
</launch>



以上启动文件要提及的两件事:


创建两个要传递给机器人初始化的参数:名称和位置
请注意-param / robot_description带有斜杠,即是完全限定的,因为它将被共享。

有了机器人声明,我们现在可以使用名称空间了。您用于多个机器人的主要启动文件应如下图所示(robots.launch): 。完整的答案更加深入。

就在该帖子的评论上方是一个链接(显示更多信息)。

请务必阅读完整的答案,因为它会详细介绍设置导航和可视化所要采取的步骤。

如果尝试这些步骤并遇到特定的错误,请告诉我们该错误的确切含义。 “这没用”或“这有错误”之类的注释没有帮助。

我希望这对您有用!如果我错过了问题范围/方向的记号,请尝试澄清您遇到的确切错误。