1. MAVROS简介与Jetson Orin NX适配性
MAVROS是ROS(Robot Operating System)与MAVLink协议之间的桥梁,专门用于无人机和地面站之间的通信。在Jetson Orin NX这类高性能嵌入式平台上部署MAVROS,可以实现与PX4或ArduPilot飞控的高效数据交互。
为什么选择Jetson Orin NX作为无人机机载电脑?这块开发板搭载了NVIDIA最新的Orin系列处理器,算力高达100TOPS,却只有信用卡大小。我在实际项目中测试发现,它不仅能流畅运行MAVROS,还能同时处理视觉SLAM、路径规划等计算密集型任务。
MAVROS的核心功能包括:
- 实时传输飞控状态数据(位置、姿态、电池电压等)
- 接收来自地面站的控制指令
- 支持多种连接方式(USB、串口、网络)
- 提供丰富的ROS话题和服务接口
2. 安装ROS Noetic与MAVROS
2.1 基础环境准备
Jetson Orin NX默认搭载JetPack 5.1.2,对应Ubuntu 20.04系统。首先需要安装ROS Noetic:
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update sudo apt install ros-noetic-desktop-full -y安装完成后,记得在~/.bashrc中添加环境变量:
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc2.2 MAVROS安装步骤
官方提供了两种安装方式:二进制包和源码编译。对于大多数应用场景,推荐使用APT安装:
sudo apt-get install ros-noetic-mavros ros-noetic-mavros-extras -y这个命令会安装:
- mavros核心包
- 常用插件(如地理围栏、航点任务等)
- 基础配置文件
安装完成后,检查/usr/share/GeographicLib目录。我第一次安装时发现这个目录是空的,需要补充地理数据集。
3. 地理数据集配置
3.1 自动安装方法
官方提供了自动化脚本:
cd ~ wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh sudo chmod +x ./install_geographiclib_datasets.sh sudo ./install_geographiclib_datasets.sh这个脚本会自动下载并安装:
- EGM96高程模型(5'分辨率)
- EGM96重力模型
- EMM2015地磁模型
3.2 手动安装方法
如果自动安装失败(有时确实会遇到网络问题),可以手动下载:
下载egm96-5高程模型:
wget https://geographiclib.sourceforge.io/geoids/egm96-5.tar.bz2 tar xvjf egm96-5.tar.bz2 -C /usr/share/GeographicLib/下载egm96重力模型:
wget https://geographiclib.sourceforge.io/gravity/egm96.zip unzip egm96.zip -d /usr/share/GeographicLib/下载emm2015地磁模型:
wget https://geographiclib.sourceforge.io/magnetic/emm2015.zip unzip emm2015.zip -d /usr/share/GeographicLib/
最终目录结构应该是:
/usr/share/GeographicLib/ ├── geoids ├── gravity └── magnetic4. USB连接配置(/dev/ttyACM0)
4.1 启动文件配置
默认的px4.launch文件可能不适合所有场景,建议创建自定义启动文件:
sudo gedit /opt/ros/noetic/share/mavros/launch/px4_ACM0.launch文件内容如下:
<launch> <arg name="fcu_url" default="/dev/ttyACM0:921600" /> <arg name="gcs_url" default="" /> <arg name="tgt_system" default="1" /> <arg name="tgt_component" default="1" /> <include file="$(find mavros)/launch/node.launch"> <arg name="pluginlists_yaml" value="$(find mavros)/launch/px4_pluginlists.yaml" /> <arg name="config_yaml" value="$(find mavros)/launch/px4_config.yaml" /> <arg name="fcu_url" value="$(arg fcu_url)" /> <arg name="gcs_url" value="$(arg gcs_url)" /> <arg name="tgt_system" value="$(arg tgt_system)" /> <arg name="tgt_component" value="$(arg tgt_component)" /> </include> </launch>关键参数说明:
- fcu_url:指定设备节点和波特率(921600是推荐值)
- tgt_system:飞控系统ID,默认为1
4.2 权限设置与启动
第一次运行通常会遇到权限问题:
sudo chmod 777 /dev/ttyACM0 roslaunch mavros px4_ACM0.launch如果遇到持续性的权限问题,可以创建udev规则:
sudo gedit /etc/udev/rules.d/99-px4.rules添加以下内容:
SUBSYSTEM=="tty", ATTRS{idVendor}=="26ac", ATTRS{idProduct}=="0011", MODE="0666"然后重新加载udev规则:
sudo udevadm control --reload-rules sudo udevadm trigger5. 串口连接配置(/dev/ttyTHS0)
5.1 硬件连接指南
Jetson Orin NX的40针GPIO接口中:
- Pin 6 (GND) -> Pixhawk TELEM2 Pin6
- Pin 8 (UART1_TX) -> Pixhawk TELEM2 Pin3 (RX)
- Pin 10 (UART1_RX) -> Pixhawk TELEM2 Pin2 (TX)
注意:TX和RX需要交叉连接!
5.2 软件配置
创建串口启动文件:
sudo gedit /opt/ros/noetic/share/mavros/launch/px4_THS0.launch内容与USB版本类似,只需修改fcu_url:
<arg name="fcu_url" default="/dev/ttyTHS0:921600" />启动前同样需要设置权限:
sudo chmod 777 /dev/ttyTHS0 roslaunch mavros px4_THS0.launch5.3 性能对比
在实际测试中:
- USB连接:IMU数据频率约200Hz
- 串口连接:IMU数据频率约150Hz
如果对实时性要求高,建议优先使用USB连接。我在四旋翼项目中实测发现,USB连接的延迟比串口低15-20ms。
6. 通信验证与故障排查
6.1 基础检查命令
查看MAVROS节点是否正常运行:
rosnode list | grep mavros检查话题列表:
rostopic list | grep mavros测试IMU数据流:
rostopic hz /mavros/imu/data6.2 常见问题解决
连接超时:
- 检查飞控是否上电
- 确认波特率设置一致(建议统一使用921600)
- 尝试降低波特率(如57600)测试
数据异常:
rostopic echo /mavros/state查看connected字段是否为True
权限问题: 永久解决方案是创建用户组:
sudo usermod -a -G dialout $USER然后注销重新登录
7. 高级配置技巧
7.1 多飞控连接
如果需要连接多个飞控,可以修改启动文件:
<arg name="tgt_system" default="1" /> <!-- 第一个飞控ID --> <arg name="tgt_component" default="1" />为每个飞控创建独立的启动文件,指定不同的系统ID。
7.2 自定义消息转发
在px4_config.yaml中可以配置需要转发的话题。例如增加视觉定位数据:
mavros: ftp: true startup_px4_usb_quirk: true odometry: vision: true vision_pose: true7.3 日志记录配置
启用MAVLink日志记录:
rosrun mavros mavsys mode -c MANUAL rosrun mavros mavsafety arm rosrun mavros mavlog start ~/mavlink_log8. 实际应用案例
8.1 与PX4配合使用
在QGroundControl中设置参数:
- MAV_1_CONFIG = TELEM2
- MAV_1_MODE = On
- SER_TEL2_BAUD = 921600
8.2 与ROS导航栈集成
典型的数据转换示例:
#!/usr/bin/env python3 import rospy from sensor_msgs.msg import NavSatFix from mavros_msgs.msg import GlobalPositionTarget def gps_callback(data): target = GlobalPositionTarget() target.latitude = data.latitude target.longitude = data.longitude target.altitude = data.altitude pub.publish(target) rospy.init_node('gps_converter') pub = rospy.Publisher('/mavros/setpoint_raw/global', GlobalPositionTarget, queue_size=10) rospy.Subscriber('/gps/fix', NavSatFix, gps_callback) rospy.spin()8.3 性能优化建议
- 关闭不需要的插件(在px4_pluginlists.yaml中注释)
- 调整消息频率:
rosrun mavros mavcmd stream -s 0 -r 50 - 使用USB3.0接口(Jetson Orin NX的Type-C接口)