# 在Magicbook Pro 16 Hunter 上安装 Archlinux,Docker容器运行ros1 px4 与gazebo仿真环境 > hi 又是我,我是tifisht哟!今天给各位分享我自己的笔记本px4开发环境!archlinux + ros-noetic + px4而且当然可以仿真啦!\ www因为被Ubuntu的网卡驱动和触控板驱动整破防了www # 动机 因为刚刚加入了自己学校的机器人队伍,队伍中使用的环境比较老,对环境的要求又十分苛刻,所以我先加装了一块1t的ssd,安装了ubuntu20.04。但是令我机器难受的是ubuntu20.04没有内置自己intel ax201网卡的驱动,同时触摸板的驱动也没有,但是触摸板还是个小问题,但是网卡驱动可是个大问题(ubuntu。。。习惯了) 查了网上许多的资料,官网,某些不知名软件包,stackoverflow等各处地方,都没有找到相关的解决办法。这个时候我已经在ubuntu上花费了大量时间,同时并不太喜欢ubuntu的相关界面,而是更加喜欢archlinux,于是我做出了这个决定。。。而此时潘多拉魔盒已悄然打开。。。 # 一、安装archlinux系统 经典的三板斧,archlinux镜像下载(https://archlinux.org/download/) ,rufus烧录或者使用ventoy,进入bios选择启动设备。相关教程太多不再赘述。 > archlinux wiki iwctl官方文档 https://wiki.archlinuxcn.org/wiki/Iwd >archlinux官方中文安装安装文档 https://wiki.archlinuxcn.org/wiki/%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97 > 附上b站大佬的教程 https://www.bilibili.com/read/cv20753052/?spm_id_from=333.999.collection.opus.click&opus_fallback=1 > 跟着教程走吧,严谨有条理,优雅 提醒几条: 1. 了解分区基础知识,确认好bios还是uefi启动。一定要注意分区的操作,一定要了解每一个行为的结果,达到你的目的。推荐使用cfdisk分区,有更良好的用户交互界面。 2. pacstrap安装系统时,建议跟着上述b站大佬教程安装,确认好自己需求,intel就装intel-ucode,amd就装amd的 3. efi分区是要挂载在/boot/efi目录的,以前装的时候直接挂载在/boot后无法开机 4. grub启动,关于os-prober。不喜欢,个人认为不好用,而且我没找到修改grub的os-prober启动项名称的方法,而且会把我的win11识别成win10,所以我选择修改/etc/grub.d/40_custom自建一个启动项 ```bash #!/bin/sh exec tail -n +3 $0 # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above. # #上面为系统自带部分,下面是添加部分 menuentry "windows 11 Honor" --class windows11 { insmod part_gpt insmod fat insmod chain search --no-floppy --fs-uuid --set=root F8CA-DB44 chainloader /EFI/Microsoft/Boot/bootmgfw.efi } ``` >———对了,grub还可以安装主题哦,我选用的是yorunoke大佬的miku主题 https://github.com/yorunoken/HatsuneMiku 发现在3072x1920屏幕上有点偏,字体大小有点小,于是自己fork了一个,但是要装一个Jetbrain nerd mono字体(自己常用)https://github.com/tifisht/grub_Miku/ ![](https://gh.0x535a.cn/stephen-zeng/img/master/20250315202655.png) 5. 我选用了plasma kde桌面环境x11环境,sddm为显示管理器(其实就是登录界面,不知道为什么起这样的名字)(请简单了解x window 的架构呢!xserver xclient ) # 二、桌面环境踩雷,一路火花带闪电 ## sddm 缩放(dpi)设置 在设置里启用同步sddm与plasma的dpi缩放后,满心欢喜,直接重启,却看见极小的ui界面,十分难受,~~如同考试感觉良好但是挂了一样~~,在这篇文章里找到了办法:https://www.zzqayy.cn/archives/sddmgao-fen-bian-lu-suo-fang-she-zhi 下面为关键配置: ```conf # /etc/sddm.conf [X11] EnableHiDPI=true [General] GreeterEnvironment=QT_SCREEN_SCALE_FACTORS=2,QT_FONT_DPI=192 ``` ## 输入法 rime 小狼毫 双拼方案 不知为何,在plasma环境下,使用ibus打字时只能输出英文,查找各种方案后无法解决。于是使用fcitx5,但是没法使用双拼,最后在用户目录下自己配置好双拼才成功启用方案,将小鹤双拼的方案文件导入用户文件夹,default.custom.yaml文件写入输入方案: ``` #default.custom.yaml schema_list: - schema: double_pinyin_flypy # 小鹤双拼 注释掉 - schema: luna_pinyin # 全拼 #- schema: double_pinyin # 自然码 ``` 写好后一直无法输出双拼,但是关机后一个晚上就好了,可能是重启了吧(( # 三、docker容器运行ros1 px4环境 前言:之前试过了多种方案,例如 debootstrap 安装ubuntu根目录,然后systemd-nspawn跑容器,但是总是在更新之后无法编译px4,一堆报错,知道是环境的问题,所以继续搜索发现px4官方对于docker的支持十分完善((给我整破防了 > px4官方docker部署教程 https://docs.px4.io/main/en/test_and_ci/docker.html 先要在自己的宿主机的目录底下克隆px4源代码: > git clone https://github.com/PX4/PX4-Autopilot.git 选用合适的容器,容器列表为: >https://github.com/PX4/PX4-containers/tree/master?tab=readme-ov-file#container-hierarchy > https://hub.docker.com/r/px4io/px4-dev-nuttx-focal/tags?page=1&ordering=last_updated 我要gazebo仿真,ros1环境也就是noetic,所以使用px4io/px4-dev-simulation-focal容器,有模拟环境,我自己修改后的拉取与启动命令为: ```bash xhost +local: docker run -it --privileged \ --env=LOCAL_USER_ID="$(id -u)" \ -v ~/PX4-Autopilot:/src/PX4-Autopilot:rw \ -v /tmp/.X11-unix:/tmp/.X11-unix:ro \ -e DISPLAY=:0 \ --network=host \ --name=px4-ros1 \ px4io/px4-dev-simulation-focal \ bash ``` 解释: xhost +local:让本地的程序可以连接到x11(每次重启后都要运行,可以写入~/.bashrc在启动时自动运行)此方案存在一定不安全可能,更细粒度的控制方案可以在archwiki xhost页面上找到 "-it" 以容器内交互方式运行 "--privileged"表示这是特权容器 "--env=" 设置自己用户id与自己用户一致,方便x11连接 "-v ~/PX4-Autopilot:/src/PX4-Autopilot:rw" 绑定容器内px4目录为宿主机的位置,要自己改一下宿主机的px4源码位置哦, :前面的是宿主机位置,最后的:rw为docker目录内的文件夹权限 "-v /tmp/.X11-unix:/tmp/.X11-unix:ro" 将x11套接字文件夹连接到docker容器内,使容器可以与宿主机x11通信(十分重要) "-e DISPLAY=:0"意思是设置DISPLAY环境变量,:0是表示在本机的0号桌面上显示 "--network=host"表示与宿主机使用同一套网络,px4网络功能多,所以使用映射太过麻烦,直接让容器使用宿主机网络 ## 测试运行 命令运行后,会进入docker内交互环境,进行测试 ```bash cd /src/PX4-Autopilot make px4_sitl_default gazebo ``` 检查自己的x11环境是否出现了gazebo窗口,是否出现了无人机 ## 四、qGroundControl(QGC)地面站连接 在宿主机下载好qgc,开机,诶,发现连不上!!!咋办呢? 可能是你docker命令运行时没有使用--network=host选项呢,还是不行的话自己解决吧(摆 # 五、docker日常的进入环境 > 可以自己多学习一下docker的用法,以备不时之需 先要启动: docker start {{docker_name}} 再是进入: docker exec -it {{docker_name}} bash 退出直接使用exit退出环境,exit会暂停容器的运行