# 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 外壳:
[启动] shell id: 140735313310464
[启动] 任务名称:PX4 ______ __ __ ___
| ___ \ \ \ / / / |
| |_/ / \ V / / /| |
| __/ / \ / /_| |
| | / /^\ \ \___ |
\_| \/ \/ |准备飞行。>;
它还将弹出一个窗口,显示 jMAVSim (打开新窗口) 模拟器:
# 飞向天空
系统将开始打印状态信息。一旦锁定位置,您就可以开始飞行(控制台显示信息后不久: EKF 开始全球定位系统融合).
要起飞,请在控制台输入以下内容:
pxh>; 指挥官起飞
您可以使用 QGroundControl 飞行任务或连接 操纵杆.
# 使用/配置选项
适用于所有模拟器的选项都包含在顶层程序中。 模拟 主题(其中一些可能在下文中重复)。
# 模拟传感器/硬件故障
模拟故障保险 解释了如何触发 GPS 故障和电池耗尽等安全故障。
# 设置自定义起飞位置
使用环境变量可以覆盖默认起飞位置: PX4_HOME_LAT
, PX4_HOME_LON
和 PX4_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/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/tmp/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,等等。
要在 macOS 下修复该问题,我们建议通过自制软件安装 OpenJDK
酿 安装 --cask采用topenjdk15