为无人机飞控铺路:在Jetson Nano上从零安装ROS Melodic(附国内源加速与rosdep初始化终极方案)

张开发
2026/4/19 14:13:01 15 分钟阅读

分享文章

为无人机飞控铺路:在Jetson Nano上从零安装ROS Melodic(附国内源加速与rosdep初始化终极方案)
无人机飞控开发实战Jetson Nano上的ROS Melodic高效部署指南当Jetson Nano遇到PX4飞控一场关于嵌入式AI与自主飞行的技术交响曲就此展开。作为NVIDIA旗下最具性价比的边缘计算设备Jetson Nano凭借其128核Maxwell GPU和低功耗特性成为无人机机载电脑的理想选择。而ROSRobot Operating System作为机器人开发的瑞士军刀其与PX4飞控的深度整合能够为无人机带来环境感知、自主决策等高级功能。本文将手把手带你完成ROS Melodic在Jetson Nano上的完整部署特别针对国内开发者常见的网络问题提供多套解决方案。1. 开发环境准备Jetson Nano系统配置1.1 硬件选型与系统镜像烧录Jetson Nano开发板有2GB和4GB两个内存版本对于运行ROSPX4的组合建议选择4GB版本以确保足够的内存余量。以下是硬件准备清单必备组件Jetson Nano开发板含散热器32GB以上容量的microSD卡推荐UHS-I速度等级5V/4A电源适配器避免使用micro USB供电导致的性能限制可靠的SD卡读卡器系统镜像建议从NVIDIA官网下载专为Jetson Nano优化的Ubuntu 18.04镜像JetPack 4.6版本这个版本与ROS Melodic有最好的兼容性。使用BalenaEtcher工具进行镜像烧录时注意以下几点# 烧录完成后检查SD卡分区 lsblk -f提示烧录过程约需15-20分钟期间不要拔出SD卡或关闭烧录程序。1.2 首次启动与基础配置根据是否配备显示器Jetson Nano有两种初始化方式有屏幕模式连接HDMI显示器建议使用原生HDMI接口插入已烧录系统的SD卡接通电源后按照屏幕提示完成Ubuntu初始设置无屏幕模式通过SSH连接使用网线将Nano连接到路由器通过路由器管理界面查找Nano的IP地址在主机使用SSH连接ssh usernamenano_ip完成基础网络配置后可切换为WiFi连接注意Jetson Nano默认用户名为nvidia密码为nvidia首次登录后应立即修改密码。2. ROS Melodic核心安装流程2.1 系统基础环境配置在安装ROS前需要确保系统软件源和基础依赖就绪# 更换为国内软件源以USTC源为例 sudo sed -i s/ports.ubuntu.com/mirrors.ustc.edu.cn/g /etc/apt/sources.list sudo apt update sudo apt upgrade -y # 安装基础编译工具 sudo apt install -y build-essential cmake git针对Jetson Nano的ARM架构还需要安装特定依赖# 解决潜在的libGL问题 sudo apt install -y libglvnd-dev libgl1-mesa-dev2.2 ROS Melodic主程序安装采用中科大源加速安装过程# 设置ROS仓库源 sudo sh -c . /etc/lsb-release echo deb http://mirrors.ustc.edu.cn/ros/ubuntu/ lsb_release -cs main /etc/apt/sources.list.d/ros-latest.list # 添加密钥 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 # 安装完整桌面版ROS约需要1.5GB空间 sudo apt update sudo apt install -y ros-melodic-desktop-full # 环境变量配置 echo source /opt/ros/melodic/setup.bash ~/.bashrc source ~/.bashrc安装完成后验证ROS核心组件roscore rosnode list应能看到/rosout节点正常运行。3. 攻克rosdep初始化难题3.1 传统方法的问题分析sudo rosdep init和rosdep update是ROS安装过程中最易出错的环节主要原因包括GitHub原始地址访问不稳定依赖关系文件下载超时SSL证书验证问题常见错误表现ERROR: cannot download default sources list from: https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list3.2 国内开发者解决方案对比方法优点缺点适用场景修改hosts无需额外工具需要维护hosts更新临时解决方案离线包安装完全避开网络问题步骤繁琐严格内网环境rosdepc工具一键式解决第三方工具推荐首选方案推荐方案rosdepc国内版工具# 安装rosdepc sudo pip install rosdepc # 初始化使用国内镜像源 sudo rosdepc init rosdepc update注意使用rosdepc后后续所有rosdep命令都应替换为rosdepc例如rosdepc install --from-paths src --ignore-src -y3.3 验证rosdep功能安装一个测试包验证依赖解析功能mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://gitee.com/ros-pkg/ros_tutorials.git cd .. rosdepc install --from-paths src --ignore-src -y catkin_make4. ROS与PX4飞控的集成准备4.1 MAVROS安装与配置MAVROS是ROS与PX4通信的桥梁安装命令如下sudo apt install -y ros-melodic-mavros ros-melodic-mavros-extras wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh sudo bash ./install_geographiclib_datasets.sh4.2 硬件连接测试将Jetson Nano通过USB或串口连接到PX4飞控检查通信状态# 查看串口设备 ls /dev/tty* # 启动MAVROS节点调整端口参数 roslaunch mavros px4.launch fcu_url:/dev/ttyACM0:57600正常连接后可以通过以下命令查看飞控数据rostopic echo /mavros/state4.3 性能优化建议针对Jetson Nano的资源限制推荐进行以下优化交换空间扩展sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile将/swapfile添加到/etc/fstab实现开机自动挂载GPU内存分配调整sudo nvpmodel -m 0 # 最大性能模式 sudo jetson_clocks # 锁定最高频率ROS通信优化!-- 在launch文件中添加 -- param namemavros/conn/heartbeat_rate value2.0/ param namemavros/conn/timeout value10.0/5. 开发实战无人机自主飞行demo5.1 创建ROS工作空间mkdir -p ~/px4_ws/src cd ~/px4_ws/src catkin_init_workspace cd .. catkin_make5.2 集成PX4 Offboard控制示例#!/usr/bin/env python import rospy from geometry_msgs.msg import PoseStamped from mavros_msgs.msg import State from mavros_msgs.srv import CommandBool, SetMode class OffboardNode: def __init__(self): rospy.init_node(offboard_node) self.state State() self.pose PoseStamped() # 订阅/发布者 self.state_sub rospy.Subscriber(/mavros/state, State, self.state_cb) self.local_pos_pub rospy.Publisher(/mavros/setpoint_position/local, PoseStamped, queue_size10) # 服务客户端 rospy.wait_for_service(/mavros/cmd/arming) self.arming_client rospy.ServiceProxy(/mavros/cmd/arming, CommandBool) rospy.wait_for_service(/mavros/set_mode) self.set_mode_client rospy.ServiceProxy(/mavros/set_mode, SetMode) # 控制频率 self.rate rospy.Rate(20) def state_cb(self, msg): self.state msg def run(self): # 等待飞控连接 while not rospy.is_shutdown() and not self.state.connected: self.rate.sleep() # 发送若干设定点激活Offboard模式 for i in range(100): self.pose.pose.position.z 1.0 self.local_pos_pub.publish(self.pose) self.rate.sleep() # 设置Offboard模式 if self.set_mode_client(0, OFFBOARD).mode_sent: rospy.loginfo(Offboard enabled) # 解锁电机 if self.arming_client(True).success: rospy.loginfo(Vehicle armed) # 主控制循环 while not rospy.is_shutdown(): self.pose.pose.position.z 2.0 # 目标高度2米 self.local_pos_pub.publish(self.pose) self.rate.sleep() if __name__ __main__: try: node OffboardNode() node.run() except rospy.ROSInterruptException: pass5.3 常见问题排查问题1MAVROS无法连接PX4检查USB端口权限sudo chmod 666 /dev/ttyACM0确认波特率设置匹配通常57600或921600问题2Offboard模式切换失败确保已发送足够数量的设定点10Hz频率检查PX4参数COM_RCL_EXCEPT是否允许模式切换问题3Jetson Nano运行卡顿监控系统资源tegrastats考虑禁用图形界面sudo systemctl set-default multi-user.target在无人机机载计算机的实际部署中我们发现Jetson Nano的散热至关重要。即使在轻负载下持续运行的GPU也会导致温度快速上升。加装散热风扇并将工作模式设置为nvpmodel -m 0可以使系统保持稳定性能。另一个实用技巧是使用rosbag record --split --size500命令分割日志文件避免单个大文件导致的存储问题。

更多文章