Skip to content

使用 SITL 运行 jMAVSim

WARNING

此仿真器由社区提供支持和维护(详见社区支持的仿真器)。 它可能与当前版本的 PX4 兼容,也可能不兼容,并且可能在未来版本中被移除。

有关核心开发团队支持的开发环境和工具的信息,请参阅工具链安装

jMAVSim 是一个简单的多旋翼/四旋翼仿真器,可让你在模拟世界中操控运行 PX4 的旋翼类飞行器飞行。 它易于设置,可用于测试飞行器的起飞、飞行、降落能力,以及在各种故障条件下(如 GPS 故障)的响应情况。

支持的飞行器类型:

  • 四旋翼

本主题介绍如何设置 jMAVSim 以连接 PX4 的 SITL 版本。

TIP

jMAVSim 也可用于硬件在环(HITL)仿真(详情见此)。

安装

jMAVSim 的设置已包含在我们针对 Ubuntu Linux 和 Windows 的标准构建说明中。按照以下说明在 macOS 上安装 jMAVSim。

macOS

要为 jMAVSim 仿真设置环境:

  1. 安装最新版本的 Java(例如 Java 15)。 你可以从 Oracle 下载 Java 15(或更高版本),也可以使用 Eclipse Temurin

    sh
    brew install --cask temurin
  2. 安装 jMAVSim:

    sh
    brew install px4-sim-jmavsim

    WARNING

    PX4 v1.11 及更高版本的 jMAVSim 仿真至少需要 JDK 15。

对于早期版本,macOS 用户可能会看到错误 Exception in thread "main" java.lang.UnsupportedClassVersionError:。 你可以在 使用 SITL 运行 jMAVSim > 故障处理 中找到解决方法。

:::

仿真环境

软件在环(SITL)仿真在主机上运行整个系统并模拟自动驾驶仪。它通过本地网络连接到仿真器。设置如下所示:

Mermaid 流程图:SITL 仿真器

运行 SITL

确保系统已安装仿真先决条件后,只需运行以下命令:便捷的 make 目标将编译 POSIX 主机版本并运行仿真。

sh
make px4_sitl_default jmavsim

这将打开 PX4 终端:

sh
[init] shell id: 140735313310464
[init] task name: px4

______  __   __    ___
| ___ \ \ \ / /   /   |
| |_/ /  \ V /   / /| |
|  __/   /   \  / /_| |
| |     / /^\ \ \___  |
\_|     \/   \/     |_/

Ready to fly.


pxh>

同时还会弹出一个窗口,显示 jMAVSim 仿真器的 3D 视图:

jMAVSim 3D 视图

让飞行器起飞

系统将开始输出状态信息。当你获得位置锁定(在控制台显示消息 EKF commencing GPS fusion 后不久),就可以开始飞行了。

要起飞,请在控制台输入以下命令:

sh
pxh> commander takeoff

你可以使用 QGroundControl 执行任务飞行,或连接游戏手柄

使用/配置选项

适用于所有仿真器的选项在顶层 仿真 主题中介绍(以下可能会重复其中一些内容)。

模拟传感器/硬件故障

模拟故障保护 介绍了如何触发如 GPS 故障和电池电量耗尽等安全故障保护机制。

设置自定义起飞位置

可以使用环境变量 PX4_HOME_LATPX4_HOME_LONPX4_HOME_ALT 覆盖默认的起飞位置。

例如,设置纬度、经度和海拔:

sh
export PX4_HOME_LAT=28.452386
export PX4_HOME_LON=-13.867138
export PX4_HOME_ALT=28.5
make px4_sitl_default jmavsim

更改仿真速度

可以使用环境变量 PX4_SIM_SPEED_FACTOR 相对于实时速度增加或降低仿真速度。

sh
export PX4_SIM_SPEED_FACTOR=2
make px4_sitl_default jmavsim

更多信息请参阅:仿真 > 以高于实时的速度运行仿真

使用游戏手柄

通过 QGroundControl 支持使用游戏手柄和拇指摇杆(此处为设置说明)。

模拟通过 Wifi 连接的无人机

有一个特殊的目标用于模拟通过本地网络上的 Wifi 连接的无人机:

sh
make broadcast jmavsim

仿真器会像真实无人机一样在本地网络上广播其地址。

分别启动 JMAVSim 和 PX4

你可以分别启动 JMAVSim 和 PX4:

sh
./Tools/simulation/jmavsim/jmavsim_run.sh -l
make px4_sitl none

这允许更快的测试周期(重启 jMAVSim 需要的时间要长得多)。

无头模式

要在不显示 GUI 的情况下启动 jMAVSim,请按如下方式设置环境变量 HEADLESS=1

sh
HEADLESS=1 make px4_sitl jmavsim

基于 jMAVSim 的多飞行器仿真

jMAVSim 可用于多飞行器仿真:使用 jMAVSim 进行多飞行器仿真

扩展和定制

要扩展或定制仿真接口,请编辑 Tools/jMAVSim 文件夹中的文件。代码可通过 Github 上的 jMAVSim 代码仓库 访问。

INFO

构建系统会强制检出所有依赖项(包括仿真器)的正确子模块。 它不会覆盖目录中文件的更改,但是,当提交这些更改时,需要在固件仓库中使用新的提交哈希注册子模块。为此,执行 git add Tools/jMAVSim 并提交更改。 这将更新仿真器的 GIT 哈希。

与 ROS 交互

该仿真可以像在真实飞行器上一样与 ROS 交互

重要文件

  • 启动脚本在 系统启动 中讨论。
  • 模拟的根文件系统(“/” 目录)在构建目录内的此处创建:build/px4_sitl_default/rootfs

故障处理

java.lang.NoClassDefFoundError

sh
Exception in thread "main" java.lang.NoClassDefFoundError: javax/vecmath/Tuple3d
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:374)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56)
Caused by: java.lang.ClassNotFoundException: javax.vecmath.Tuple3d
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:466)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:566)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
... 3 more
Exception in thread "main" java.lang.NoClassDefFoundError: javax/vecmath/Tuple3d
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:374)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56)
Caused by: java.lang.ClassNotFoundException: javax.vecmath.Tuple3d
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:466)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:566)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)

一旦 jMAVSim 子模块 更新到较新的 jar 库,此错误应该不再出现,Java 11 或 Java 14 应该可以正常工作。

发生了非法反射访问操作

此警告可以忽略(可能会显示该警告,但仿真仍将正常工作)。

sh
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by javax.media.j3d.JoglPipeline (rsrc:j3dcore.jar) to method sun.awt.AppContext.getAppContext()
WARNING: Please consider reporting this to the maintainers of javax.media.j3d.JoglPipeline
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Inconsistency detected by ld.so: dl-lookup.c: 112: check_match: Assertion version->filename == NULL || ! _dl_name_match_p (version->filename, map)' failed!

java.awt.AWTError: Assistive Technology not found: org.GNOME.Accessibility.AtkWrapper

sh
Exception in thread "main" java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
Caused by: java.awt.AWTError: Assistive Technology not found: org.GNOME.Accessibility.AtkWrapper
at java.awt.Toolkit.loadAssistiveTechnologies(Toolkit.java:807)
at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:886)
at java.awt.Window.getToolkit(Window.java:1358)
at java.awt.Window.init(Window.java:506)
at java.awt.Window.(Window.java:537)
at java.awt.Frame.(Frame.java:420)
at java.awt.Frame.(Frame.java:385)
at javax.swing.JFrame.(JFrame.java:189)
at me.drton.jmavsim.Visualizer3D.(Visualizer3D.java:104)
at me.drton.jmavsim.Simulator.(Simulator.java:157)
at me.drton.jmavsim.Simulator.main(Simulator.java:678)

如果你看到此错误,请尝试以下解决方法:

编辑 accessibility.properties 文件:

sh
sudo gedit /etc/java-8-openjdk/accessibility.properties

并注释掉以下所示的行:

sh
#assistive_technologies=org.GNOME.Acessibility.AtkWrapper

更多信息,请查看 此 GitHub 问题。 一位贡献者在 askubuntu.com 上找到了此解决方法。

Exception in thread "main" java.lang.UnsupportedClassVersionError

编译 jMAVsim 时,你可能会遇到以下错误:

sh
Exception in thread "main" java.lang.UnsupportedClassVersionError: me/drton/jmavsim/Simulator has been compiled by a more recent version of the Java Runtime (class file version 59.0), this version of the Java Runtime only recognizes class file versions up to 58.0

此错误表明你需要在环境中使用更新版本的 Java。 类文件版本 58 对应 jdk14,版本 59 对应 jdk15,版本 60 对应 jdk 16 等等。

要在 macOS 下修复此问题,我们建议通过 homebrew 安装 OpenJDK

sh
brew install --cask adoptopenjdk16