如今我成为了死神,乐队的毁灭者。——奥本海睦
八六:是吗……为什么要告诉我这个
非常坏惠普暗影精灵5060ti主机装ubuntu双系统
总之从笔记本迁移到台式了,但是惠普这个台式似乎显卡太新且底层跟安装盘有点冲突,安装一开始就会黑屏,就算装完还有grub挂载问题,解决办法来自CSDN:
ubuntu22.04+5060显卡双系统安装,各种黑屏踩坑记录
总之u盘启动刚开始的grub界面在try or install ubuntu选项按e,进去在quiet splash后面改为以下参数是对的:
nomodeset acpi=off noapic
安装推荐都选英文。装完报错先不管,系统已经装好只是需要修复grub。重新用安装盘启动并选择试用,然后boot-repair选自动修复:
sudo apt update
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt update
sudo apt install -y boot-repair
boot-repair
新系统进去再装个nvidia驱动,开机就不用再加参数了。我这装了open kernel的版本才能正常配置nvidia-smi和CUDA。
ROS安装
官方Humble安装步骤:https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debs.html
最后建议把这个环境变量直接写到~/.bashrc里:
source /opt/ros/humble/setup.bash
PX4与Gazebo配置
PX4飞控按官方步骤git下来就行:https://docs.px4.io/main/en/dev_setup/building_px4,会顺便自动装一个gazebo sim 8(Harmonic),因为版本问题(ROS2 Humble一般适配Fortress的Gazebo,但我怕PX4出问题没尝试换版本……),其和ROS2的桥接包要注意,不然gz话题无法正常发布到ROS2上,很难收,亲测这个能用:
sudo apt install ros-humble-ros-gzharmonic
为了和组的实机匹配,git完仓库之后我换成了v1.16.0,参考:https://blog.csdn.net/qq_62689471/article/details/136214621
QGC地面站
基本的仿真,顺便python控制起降
代码控制无人机可以通过两种接口,封装好的MAVLink,或者比较底层的XRCE-DDS。后者搞了半天选择放弃……PX4官方和AI都会推荐后面这个,但一看相关github仓库里都没几个人在用。而MAVLink协议的方法又分两种:一是MAVROS,通过ROS2做中间商转发指令,后期再看看有没有必要吧,别人论文里是用的这个……二是python的mavsdk库,我大概或许似乎确凿是直接pip的。一个实例:
先cd到PX4仓库的根目录,然后启动无人机:
make px4_sitl gz_x500
python运行实例起降代码:
import asyncio
from mavsdk import System
# 14540 是 S.I.T.L. (Software-in-the-Loop) 默认暴露的 MAVLink 遥测端口
MAVLINK_ADDRESS = "udp://:14540"
async def run():
"""连接到无人机并执行基本任务"""
# --- 初始化 ---
drone = System()
print(f"尝试连接到无人机:{MAVLINK_ADDRESS}")
await drone.connect(system_address=MAVLINK_ADDRESS)
print("等待无人机连接...")
async for state in drone.core.connection_state():
if state.is_connected:
print(f"无人机已连接!")
break
# --- 等待飞控初始化 (例如,等待 GPS 锁定/Home 位置设置) ---
print("等待 Home 位置设置...")
async for health in drone.telemetry.health():
if health.is_global_position_ok and health.is_home_position_ok:
print("Home 位置和全局定位正常。")
break
# --- 解锁/布防 ---
print("-- 正在解锁/布防无人机")
await drone.action.arm()
# --- 起飞 ---
# 默认高度是 2.5 米
print("-- 正在起飞")
await drone.action.takeoff()
# 等待一段时间,让无人机到达起飞高度
await asyncio.sleep(30)
# --- 降落 ---
print("-- 正在降落")
await drone.action.land()
# 等待降落完成
await asyncio.sleep(10)
# --- 上锁/撤防 (可选) ---
print("-- 正在上锁/撤防无人机")
# 注意:许多飞控在降落后会自动上锁
try:
await drone.action.disarm()
except Exception as e:
print(f"上锁失败或已自动上锁: {e}")
# Python 程序的入口点
if __name__ == "__main__":
# 使用 asyncio 运行异步任务
asyncio.run(run())
录屏:(中途用方块砸了下刚体无人机,八六教我怎么造出这种……)
深度相机仿真
解决了gz和ROS2的桥接问题这个就没问题。这次启动另一台带深度相机的无人机:
make px4_sitl gz_x500_depth
把gz里深度图和点云话题桥接到ROS2上,然后启动rviz2,添加image和PointCloud2对象,设定好对应的topic就显示出来了:
ros2 run ros_gz_bridge parameter_bridge /depth_camera/points@sensor_msgs/msg/PointCloud2@gz.msgs.PointCloudPacked
ros2 run ros_gz_bridge parameter_bridge /depth_camera@sensor_msgs/msg/Image@gz.msgs.Image
ros2 run rviz2 rviz2
场景绕圈拍摄示例:
耶配置好了,次回:实机实验(小心mamba out),最后祝您,身体健康。

只能说虽然没有mamba out,但是身体健康是没祝到,kt out了
而且这种一行一注释,功能比注释字还少的代码有什么存在的必要吗(好吧这样要复刻不用查官方文档了)
恼AI的习惯管我什么事
后面有做xRCE了吗 这东西怎么使啊
不道啊,虽然官方推荐但在github上也还没几个人star,更新也不勤,感觉不如mavlink的生态。而且XRCE好像适合搞底层一点的无人机算法,我这边就是搭载些传感器玩。
惊了…gzsimharmonic里面好像没有双目相机的x500,现在已经不是xRCE还是mavsdk的问题了…完大蛋
也算有。毕竟gz_x500_depth就是双目深度相机,不过这个应该是发布一个深度图和一个深度点云话题,好像也有彩色图话题,你可以gz topic -l看下它发布了什么话题。如果就是想要两个光学摄像头的话可以自己写模型配置,都是在px4的克隆仓库里面写。我这几天等有空就再出一篇添加世界模型和无人机传感器模型的。
怎么解决gazebo和rviz2显示联动的问题,sdf不是默认不发布tf变换吗,怎么从gazebo加载完整的tf变换到rviz
你好,我在另一篇文章末尾有提及这个问题:
https://www.kakosci.com/index.php/2025/12/29/px4gazebo%e4%bb%bf%e7%9c%9f%ef%bc%8c%e8%87%aa%e5%ae%9a%e4%b9%89world%e5%9c%ba%e6%99%af%e5%92%8c%e6%97%a0%e4%ba%ba%e6%9c%ba%e4%bc%a0%e6%84%9f%e5%99%a8model%e5%8f%8a%e5%b1%9e%e6%80%a7/
简单来说,把gz话题发布到ros2之后,可以给你具体传感器的frame_id发布tf变换到rviz2的“map”(实际上用什么不影响,应该都是重新创建的),这个时候打印tf树(ros2 run tf2_tools view_frames)才能看到从传感器到map的变换。我也不知道怎么让ros2自动发布完整的坐标系树,反正有时候好像可以,大部分时候又不行。现在也只能这样自己从传感器端一层一层往上发布。
是很奇怪,虽说没有也不影响,这个仿真真实爱谁做谁做(流泪)
神人