跳至内容

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 外壳:

[init] shell id:140735313310464
[init] 任务名称:PX4

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

准备就绪 飞。


pxh>;

它还将弹出一个窗口,显示 jMAVSim 模拟器:

jMAVSim 3d 视图

飞向天空

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

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

pxh>; 司令员 起飞

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

使用/配置选项

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

模拟传感器/硬件故障

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

设置自定义起飞位置

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

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

出口 PX4_HOME_LAT=28.452386
出口 PX4_HOME_LON=-13.867138
出口 PX4_HOME_ALT=28.5
生产 px4_sitl_default jmavsim

改变模拟速度

模拟速度可以通过环境变量 px4_sim_speed_factor.

出口 px4_sim_speed_factor=2
生产 px4_sitl_default jmavsim

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

使用操纵杆

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

模拟 Wifi 无人机

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

生产 广播 jmavsim

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

分别启动 JMAVSim 和 PX4

您可以分别启动 JMAVSim 和 PX4:

./Tools/simulation/jmavsim/jmavsim_run.sh -l
生产 px4_sitl

这样可以加快测试周期(重新启动 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
 java.base/java.lang.Class.forName0(本地 方法)
 java.base/java.lang.Class.forName(Class.java:374)
 org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56)
原因 by: java.lang.ClassNotFoundException: javax.vecmath.Tuple3d
 java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:466)
 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:566)
 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
... 3 更多
例外情况 线程 "main"; java.lang.NoClassDefFoundError: javax/vecmath/Tuple3d
 java.base/java.lang.Class.forName0(本地 方法)
 java.base/java.lang.Class.forName(Class.java:374)
 org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56)
原因 by: java.lang.ClassNotFoundException: javax.vecmath.Tuple3d
 java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:466)
 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:566)
 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
警告: 使用 --非法访问=警告 以便 警告 进一步 非法 反光 访问 运营
警告: 全部 非法 访问 运营 拒绝 a 未来 释放
不一致 侦测到 ld.so: dl-lookup.c: 112: 检查匹配: 断言 版本->;文件名 == NULL || ! _dl_name_match_p (version->filename、 地图)' 失败!

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

例外情况 线程 "main"; java.lang.reflect.InvocationTargetException
 sun.reflect.NativeMethodAccessorImpl.invoke0(本地 方法)
 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 java.lang.reflect.Method.invoke(Method.java:498)
 org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
原因 by: java.awt.AWTError: 辅助 技术 找到了 org.GNOME.Accessibility.AtkWrapper
 java.awt.Toolkit.loadAssistiveTechnologies(Toolkit.java:807)
 java.awt.Toolkit.getDefaultToolkit(Toolkit.java:886)
 java.awt.Window.getToolkit(Window.java:1358)
 java.awt.Window.init(Window.java:506)
 java.awt.Window.Windows(Window.java:537)
 java.awt.Frame.(Frame.java:420)
 java.awt.Frame.(Frame.java:385)
 javax.swing.JFrame.(JFrame.java:189)
 me.drton.jmavsim.Visualizer3D。(Visualizer3D.java:104)
 me.drton.jmavsim.Simulator.(Simulator.java:157)
 me.drton.jmavsim.Simulator.main(Simulator.java:678)

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

编辑 无障碍属性 锉刀

苏都 编辑 /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 一直 编译 a 更多 最近 版本 Java 运行时间文件 版本 59.0),该版本的 Java Runtime 只能识别 58.0 及以下版本的类文件

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

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

 安装 --酒桶 adoptopenjdk16