jMAVSim 与 SITL
jMAVSim 是一款简单的多旋翼飞行器/四旋翼飞行器模拟器,可让您飞行 直升机 在模拟世界中运行 PX4 的载具。它易于设置,可用于测试载具是否能够起飞、飞行、着陆,并对各种故障条件(如 GPS 故障)做出适当响应。
支持的载具:
- 四边形
本主题介绍如何设置 jMAVSim 以连接 SITL 版本的 PX4。
TIP
jMAVSim 还可用于 HITL 仿真 (如图).
安装
jMAVSim 设置包含在我们的 标准建造说明 (适用于 macOS、Ubuntu Linux 和 Windows)。
模拟环境
环路模拟软件在主机上运行整个系统并模拟自动驾驶仪。它通过本地网络与模拟器连接。设置如下
运行 SITL
在确保 模拟前提条件 只需启动即可:方便的 make target 将编译 POSIX 主机构建并运行模拟。
生产 px4_sitl_default jmavsim
这将显示 PX4 外壳:
[init] shell id:140735313310464
[init] 任务名称:PX4
______ __ __ ___
| ___ \ \ \ / / / |
| |_/ / \ V / / /| |
| __/ / \ / /_| |
| | / /^\ \ \___ |
\_| \/ \/ |_/
准备就绪 至 飞。
pxh>;
它还将弹出一个窗口,显示 jMAVSim 模拟器:
飞向天空
系统将开始打印状态信息。一旦锁定位置,您就可以开始飞行(控制台显示信息后不久: EKF 开始全球定位系统融合).
要起飞,请在控制台输入以下内容:
pxh>; 司令员 起飞
您可以使用 QGroundControl 飞行任务或连接 操纵杆.
使用/配置选项
适用于所有模拟器的选项都包含在顶层程序中。 模拟 主题(其中一些可能在下文中重复)。
模拟传感器/硬件故障
模拟故障保险 解释了如何触发 GPS 故障和电池耗尽等安全故障。
设置自定义起飞位置
使用环境变量可以覆盖默认起飞位置: PX4_HOME_LAT
, PX4_HOME_LON
和 PX4_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