# jMAVSim 与 SITL

jMAVSim 是一款简单的多旋翼飞行器/四旋翼飞行器模拟器,可让您飞行 直升机 在模拟世界中运行 PX4 的载具。它易于设置,可用于测试载具是否能够起飞、飞行、着陆,并对各种故障条件(如 GPS 故障)做出适当响应。

支持的载具:

  • 四边形

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

TIP

jMAVSim 还可用于 HITL 仿真 (如图).

# 安装

jMAVSim 设置包含在我们的 标准建造说明 (适用于 macOS、Ubuntu Linux 和 Windows)。

# 模拟环境

环路模拟软件在主机上运行整个系统并模拟自动驾驶仪。它通过本地网络与模拟器连接。设置如下

美人鱼图SITL 模拟器 (打开新窗口)

# 运行 SITL

在确保 模拟前提条件 只需启动即可:方便的 make target 将编译 POSIX 主机构建并运行模拟。

生产 px4_sitl_default jmavsim

这将显示 PX4 外壳:

[启动] shell id: 140735313310464
[启动] 任务名称:PX4 ______ __ __ ___
| ___ \ \ \ / / /   |
| |_/ /  \ V / / /| |
|  __/ /   \  / /_| |
| |     / /^\ \ \___  |
\_|     \/   \/     |准备飞行。>;

它还将弹出一个窗口,显示 jMAVSim (打开新窗口) 模拟器:

jMAVSim 3d 视图

# 飞向天空

系统将开始打印状态信息。一旦锁定位置,您就可以开始飞行(控制台显示信息后不久: EKF 开始全球定位系统融合).

要起飞,请在控制台输入以下内容:

pxh>; 指挥官起飞

您可以使用 QGroundControl 飞行任务或连接 操纵杆.

# 使用/配置选项

适用于所有模拟器的选项都包含在顶层程序中。 模拟 主题(其中一些可能在下文中重复)。

# 模拟传感器/硬件故障

模拟故障保险 解释了如何触发 GPS 故障和电池耗尽等安全故障。

# 设置自定义起飞位置

使用环境变量可以覆盖默认起飞位置: PX4_HOME_LAT, PX4_HOME_LONPX4_HOME_ALT.

例如,设置纬度、经度和高度:

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.

export PX4_SIM_SPEED_FACTOR=2 make px4_sitl_default jmavsim

欲了解更多信息,请参阅 模拟 > 运行模拟比实时更快.

# 使用操纵杆

通过以下方式支持操纵杆和拇指操纵杆 QGroundControl (在此查看设置说明).

# 模拟 Wifi 无人机

有一个特殊的目标,可以模拟无人机通过 Wifi 连接到本地网络:

生产 广播 jmavsim

模拟器会像真正的无人机一样在本地网络上广播自己的地址。

# 分别启动 JMAVSim 和 PX4

您可以分别启动 JMAVSim 和 PX4:

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

这样可以加快测试周期(重新启动 jMAVSim 需要的时间要长很多)。

# 无头模式

要在没有图形用户界面的情况下启动 jMAVSim,请设置环境变量 无头=1 如图所示:

无头=1 生产 px4_sitl jmavsim

# 多车模拟

JMAVSim 可用于多载具模拟: 使用 JMAVSim 进行多车模拟.

# 扩展和定制

要扩展或自定义模拟界面,请编辑 工具/jMAVSim 文件夹。代码可通过jMAVSim 存储库 (打开新窗口) 在 Github 上。

备注

构建系统会强制为所有依赖项(包括模拟器)检查出正确的子模块。它不会覆盖目录中文件的改动,但当这些改动提交后,子模块需要在固件仓库中用新的提交哈希值注册。要做到这一点 git add Tools/jMAVSim 并提交更改。这将更新模拟器的 GIT 哈希值。

# 连接 ROS

模拟可以 与 ROS 连接 与实际载具相同。

# 重要文件

  • 启动脚本在 系统启动.
  • 模拟根文件系统(";/"目录)创建在此处的构建目录内: build/px4_sitl_default/rootfs.

# 故障排除

# java.long.NoClassDefFoundError

线程 "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.lang.ClassNotFoundException: javax.vecmath.Tuple3d at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:566) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499) ...线程"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.lang.ClassNotFoundException: javax.vecmath.Tuple3d at java.base/java.net.URLClassLoader.findClass(URLClassLoader.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 应该可以正常工作。

# 发生了非法反射访问操作

该警告可以忽略(可能会显示,但模拟仍可正常运行)。

警告:发生非法反射访问操作 警告:javax.media.j3d.JoglPipeline (rsrc:j3dcore.jar) 对方法 sun.awt.AppContext.getAppContext() 的非法反射访问 警告:请考虑将此报告给 javax.media.j3d.JoglPipeline 的维护者。media.j3d.JoglPipeline警告:使用--illegal-access=warn启用对进一步非法反射访问操作的警告警告:所有非法访问操作将在未来版本中被拒绝由ld.so检测到的不一致:dl-lookup.c:112:check_match:断言 version->filename == NULL ||| !_dl_name_match_p (version->filename, map)' 失败!

# java.awt.AWTError:未找到辅助技术:org.GNOME.Accessibility.AtkWrapper

线程 "main" 中的异常; java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Native Method)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) 原因: java.awt.AWTError:(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)

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

编辑 无障碍属性 锉刀

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

并注释掉下面的一行:

#assistive_technologies=org.GNOME.Acessibility.AtkWrapper

更多信息,请查阅 此 GitHub 问题 (打开新窗口).一位贡献者在 askubuntu.com (打开新窗口).

# 线程 "main" java.lang.UnsupportedClassVersionError 中出现异常:

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

线程"main" java.lang.UnsupportedClassVersionError 中的异常:me/drton/jmavsim/Simulator 已由较新版本的 Java 运行时(类文件版本 59.0)编译,此版本的 Java 运行时只能识别 58.0 以下的类文件版本。

这个错误会告诉你,你的环境中需要更新版的 Java。类文件版本 58 对应 jdk14,版本 59 对应 jdk15,版本 60 对应 jdk 16 等。

要在 macOS 下修复该问题,我们建议通过自制软件安装 OpenJDK

安装 --cask采用topenjdk16