前言部署一个网页本身并没有太大难度，租个服务器用默认密码ssh登入root装上Nginx把网页复制到/var/www里然后改一下Nginx的设置，再去Cloudflare把域名解析到你的IP地址，基本就搞定了。问题在于这么做过不了多久你就会发现服务器密码已经被穷举攻破，然后你就变成了肉鸡用于ddos。即使你手动改了个很复杂的密码，也会发现你命令行用起来非常卡，因为你服务器在后台拒绝大量的错误密码登录。因此，为了在这个险恶的互联网环境下生存下去，必须学会如何保护自己的服务器。服务器安全设置开服后第一件要做的事就是提升安全性。其实你部署完网页再做也行，但这一段每一项操作出错都有可能让你再也登录不了服务器，只能重装。为了少折腾，还是建议最开始就把这些危险操作都搞定。修改ssh端口并配置防火墙第一步我们把默认的ssh端口给改掉，并直接屏蔽22端口的访问。首先打开全局ssh配置文件sudo nano /etc/ssh/sshd_config，root账户可以不用sudo，找到Port 22这一行，把它改成任意与其他服务不冲突的端口，例如Port 1234，按Ctrl+X保存并退出。接着配置ufw防火墙，用sudo ufw allow 1234/tcp添加一个允许1234端口TCP连接的规则。为了防止输入错误导致再也连不上服务器，建议再临时添加一个sudo ufw allow 22/tcp，让当前的远程连接在激活防火墙后还能不断线。确保ssh端口和防火墙都配置正确后，先用sudo systemctl restart ssh重启ssh服务，这时可以再开一个控制台，用ssh -p 1234 root@your-server-ip-address连接服务器，如果能连上说明ssh配置是正确的。再在任意一个控制台里输入sudo ufw enable激活防火墙，如果新的连接没中断，说明防火墙配置也没问题。不放心可以再开个控制台测试一下。之后就可以把临时的22端口规则删掉了sudo ufw delete allow 22/tcp，这样那些对22端口的穷举爆破就会直接被拦住，不会影响服务器性能了。创建账户并赋予sudo权限直接使用root操作服务器是非常危险的行为，容易出现经典的rm -rf不慎删掉整个根目录的失误，因此，我们最好创建一个新账户，并赋予sudo的权限，这样可以避免一些操作失误干掉整个系统，多人使用服务器还能分别记录每个人各自的操作。我们用sudo adduser abc创建一个叫abc的用户，跟着提示输入密码等信息，然后将该用户添加进sudo用户组sudo usermod -aG sudo abc。接着开个新的控制台，用ssh -p 1234 abc@your-server-ip-address登入服务器，然后看看sudo命令是否能用，如果一切正常，可以去ssh设置里禁止直接用root登录，进一步提高安全性。找到/etc/ssh/sshd_config里的PermitRootLogin yes，改成PermitRootLogin no，用sudo systemctl restart ssh重启服务。以后所有root级操作都用新用户的sudo来提权运行，如果真的有什么需要用root用户的操作，可以用su root切换到root。设置仅允许密钥对登录即使改掉了ssh的端口号，如果攻击者真的想要爆破你的服务器，他们还可以直接扫描你的所有端口找到哪个用于ssh。禁用root登录可以有效防止陌生人找到正确的用户名穷举出你的密码，但是如果用上了社工手段，你的用户名很有可能能被猜出来，于是你的服务器还是有一定的危险。这里最安全的手段是只允许服务器使用密钥登录，这样除非你的私钥泄漏了，不然仅有你这台设备能登录。我们先在本地的控制台里，用ssh-keygen -t RSA -b 4096 -C 'comments'创建一个私钥公钥对，comments是备注，你可以改成自己当前电脑的信息。保存位置使用默认的就行，passphrase是解锁这个私钥的密码，设置一个你保证能记住的，最好把passphrase记在纸上。然后去刚才保存的位置，Windows通常在%USERPROFILE%/.ssh/，Ubuntu在~/.ssh/，里面能看到一个id_rsa文件和一个id_rsa.pub文件，没有后缀名的是你的私钥，不要让其他任何人知道。id_rsa.pub是公钥，把它发给别人，你用私钥加密的信息他们可以用公钥来解密。本地生成了私钥公钥对后，先照常用密码登录服务器，把你的公钥添加到服务器的信任列表中，用nano ~/.ssh/authorized_keys创建一个文件，把本地的id_rsa.pub里的内容完整地复制进去，Ctrl+X保存并退出。再打开/etc/ssh/sshd_config，把下面几个验证方式都改成no，只保留PubkeyAuthentication yes。PasswordAuthentication no ChallengeResponseAuthentication no UsePAM no PubkeyAuthentication yes最后重启ssh服务，你也可以先不关闭当前的连接，再开一个控制台来测试连接。同样使用ssh -p 1234 abc@your-server-ip-address，系统会自动使用你个人文件夹下~/.ssh/id_rsa来与服务器配对，输入设置的passphrase，就能登录了。如果你有多台设备要登录到同一账号，最正确的操作是每台设备都生成自己的私钥公钥对，把新的公钥先发给第一台设备，再把新设备的公钥加到服务器。还有个简单的操作是直接把第一台设备的私钥复制到其他设备，服务器中只添加这一个公钥。虽然很不正规，也不符合私钥公钥本身的意义（可以看作是唯一的设备身份认证），但对于个人用服务器也足够安全了，同一个私钥多个设备备份还可以防止丢失。无论如何，强烈建议在安全的地方（例如移动硬盘或能信任的网盘）保存一份私钥，防止你电脑出现意外后再也登不上服务器。一些密钥相关操作创建一对RSA加密的公私钥对：ssh-keygen -t RSA -b 4096 -C 'comments'修改或添加私钥passphrase：ssh-keygen -p -f ~/.ssh/id_rsa修改或添加私钥comment：ssh-keygen -c -f ~/.ssh/id_rsa公钥comment直接用文本编辑器打开在末尾修改即可。将私钥添加进本地缓存，以后使用不需要输入passphrase：ssh-add ~/.ssh/id_rsa查看当前缓存了哪些私钥：ssh-add -l移除一个缓存的私钥：ssh-add -d ~/.ssh/id_rsa部署网页服务器加强了服务器安全后就可以来正式部署网页了。Nginx是非常适合个人网站的HTTP服务器，性能强，使用简单，网上还能找到大量的教程，我参考的是这个网站。安装Nginx首先用apt安装Nginx。sudo apt update sudo apt install nginx然后把HTTP和HTTPS的端口添加进防火墙：sudo ufw allow 'Nginx Full'。这时候可以在浏览器打开http://your-server-ip-address，如果能看到一个Welcome to nginx的页面那说明安装成功了。安装MySQL或任意数据库除非是非常小的纯静态网页，不然大多数网页都会使用一个数据库来存储网页里的数据。MySQL是曾经十分流行的一个免费开源数据库，其被甲骨文收购后，原作者团队基于MySQL分支开发了继续保持免费开源的MariaDB，二者用起来没什么区别。安装MySQL可以直接用apt：sudo apt install mysql-server，然后输入sudo mysql_secure_installation来执行一些安全措施。开始时会问你要不要使用强密码，可以根据你需求选择密码强度要求等级，不建议选STRONG，有点极端了，MEDIUM是比较合适的，要求有数字、大小写字母和特殊符号。接着会让你设置一个数据库root用户的密码，这里的root跟服务器的root不是同一个，注意不要混淆。后面的设置基本上一路确认就行了，会自动禁用一些不安全的设置，例如禁止远程登录数据库。流程跑完后可以用sudo mysql测试能否进入数据库管理，输入exit或者按Ctrl+D即可退出。可以注意到这里并没有要求验证任何密码，这是因为MySQL认为你都有sudo权限了，那肯定应该能随意处理数据库。但这也是个不太安全的行为，我们需要两个操作来让数据库更安全：要求root也要使用密码，以及创建仅能操作特定database的用户。MySQL设置root使用密码登录首先还是用sudo mysql进入数据库，注意后面的每个命令都要结尾加分号才会执行。可以输入SELECT user, host, plugin FROM mysql.user WHERE user = 'root';查看当前所有用户的登录验证方式，能看到root是auth_socket，即只要是服务器的root就可以直接登录。输入如下命令将root的登录方式改为仅密码：ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password; FLUSH PRIVILEGES;为了防止出问题，跟之前一样，可以开个新控制台，使用mysql -u root -p来使用密码登录root，注意以后登录数据库不再需要sudo提权。如果出现了问题，还可以在之前的连接中输入下面的命令来重设密码：# 仅当用之前设置的密码无法登录时 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; FLUSH PRIVILEGES;创建MySQL用户并给予权限部署网站时通常做法是为每个服务创建一个单独的数据库账号，仅给予每个账号访问对应数据库的权限。以数据库名data1，对应用户user1为例，先用root登入MySQL，然后进行如下操作：CREATE DATABASE data1; CREATE USER 'user1'@'localhost' IDENTIFIED WITH mysql_native_password BY '用户密码'; GRANT ALL ON data1.* TO 'user1'@'localhost'; FLUSH PRIVILEGES;这样就创建了一个新用户user1并给予了他完全控制data1的权限，可以用mysql -u user1 -p来登入。这里该用户的域是localhost，即本地用户。如果之后想要允许远程连接数据库，这里要把localhost改成一个百分号'%'。MySQL数据库备份这里顺便讲一下数据库备份。理论上使用MySQL的root用户可以执行所有操作，但是本着root能不用就不用的原则，我们可以再创建一个专门用于备份data1的用户。注意user1虽然能操作data1，但其并不能导出备份data1，因为缺少读取总数据的一些权限。这里我们单独为data1的备份创建一个data1_backup用户：CREATE USER 'data1_backup'@'localhost' IDENTIFIED WITH mysql_native_password BY '用户密码'; GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON `data1`.* TO 'data1_backup'@'localhost'; GRANT PROCESS, RELOAD, REPLICATION CLIENT ON *.* TO 'data1_backup'@'localhost'; FLUSH PRIVILEGES;以后每次需要备份时，输入mysqldump -u data1_backup -p data1 > backup_filename.sql即可。安装PHP根据你想要部署的网页框架安装所需版本的PHP：sudo apt install php-fpm php-mysql php-mbstring，mbstring库是用来正确处理非ASCII字符的。配置Nginx网页服务器必备的模块都安装好后我们就可以用Nginx来部署我们的网站了。首先我们在Nginx的网站存储位置创建一个项目文件夹sudo mkdir /var/www/你的域名，如果没有域名随便取个名字就行。注意/var/www/这个文件夹需要提权才能写入，但我们不能给网页服务器sudo权限，所以我们把这个项目文件夹所有权转给当前用户sudo chown -R $USER:$USER /var/www/你的域名。你可以在这个项目文件夹下先添加一个index.html文件，随便打几个字，用于之后的测试。接着我们创建一个我们网站的配置文件sudo nano /etc/nginx/sites-available/你的域名，里面先输入如下内容并保存：server { listen 80; server_name 你的域名 www.你的域名; root /var/www/你的域名; index index.html index.htm index.php; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; } location ~ /\.ht { deny all; } }其中的php版本根据你安装的来修改。这个最基本的配置文件设置了网站入口和PHP解析器，但仅支持HTTP连接，如今随着浏览器（特别是Google Chrome）安全标准的提高，一个网站如果不使用HTTPS协议加密，很有可能会被直接禁止访问。不过我们先把后面的网站服务器基本设置搞定再折腾SSL证书。下一步是把我们网站的配置文件作为当前使用的配置文件sudo ln -s /etc/nginx/sites-available/你的域名 /etc/nginx/sites-enabled/，同时把默认的删除sudo unlink /etc/nginx/sites-enabled/default。然后让Nginx检查你的配置文件是否合法sudo nginx -t，并重新加载sudo systemctl reload nginx。现在再访问http://your-server-ip-address，应该可以看到你在index.html里随机打的字了。为了测试PHP是否正确安装，你还可以在项目文件夹中创建一个info.php文件，输入：<?php phpinfo();然后浏览器打开http://your-server-ip-address/info.php查看是否显示了调试信息。域名与SSL设置为了使用HTTPS协议，我们需要给自己的网站配置一个SSL证书。参考如下文章，我们用免费的Certbot来给我们的网站签发一个证书。前提条件是你已购买一个域名，并用Cloudflare或相似DNS服务商把该域名指向了你的服务器IP地址，要同时设置xxxx.com和www.xxxx.com。先安装需要的程序sudo apt install certbot python3-certbot-nginx，然后输入sudo certbot --nginx -d 你的域名 -d www.你的域名来签发证书，第一次使用会要求你填写邮箱地址。然后Certbot会自动在你网站的Nginx配置文件里添加一些条目。可以打开确认一下是否主配置里的监听端口改成了listen 443;，还增加了一些包含certbot注释的行，最后还把80端口导向了404错误。现在你就可以用https://your-server-ip-address来访问自己的网站了，能看到浏览器非常开心地给了你安全的标志。Certbot签发的SSL证书有效期为90天，到期会自动更新，一般不再需要去关心了。最后的细节根据网站框架的不同还有一些小细节需要处理一下，如果你像我一样使用GitHub来同步代码，同时网站有上传附件的功能，需要在Nginx的网站配置文件里设置一个最大附件体积，还要禁止访客访问.git文件夹，因为其中很可能存储了例如你的姓名和邮箱等信息，最好不要让攻击者知道。server { root /var/www/你的域名; # 一些其他配置 client_max_body_size 180M; location ~/\.git { deny all; } # 更多配置 }同时还要去php的设置里修改最大附件限制，找到php的配置文件位置，我的在/etc/php/8.3/fpm/php.ini，修改下面三个条目。upload_max_filesize = 180M ; 最大上传单文件大小 post_max_size = 200M ; 表单提交最大数据（需略大于 upload_max_filesize） memory_limit = 200M ; 脚本运行内存限制（建议保持在 128M 以上）（可选）利用Docker部署
Ubuntu 22.04安装轻量级Win10虚拟机来实现OneDrive同步文件夹
背景其实对于绝大部分人来说，Linux系统想要使用OneDrive同步，直接装一个第三方客户端就能用了，比如我之前用的这个，虽然基本都不支持自动同步，但每次有什么更改手动输命令同步一下也够用了。然而某一天，大概是学校新换了个IT管理员，ban掉了所有没有微软官方认证的第三方客户端，纯纯的脑瘫。但没办法人家就是头头，只能认栽，找别的办法来同步Linux上的OneDrive文件夹。最终决定是装一个轻量级的Win10虚拟机，利用RDP远程桌面协议来操作，然后把Windows里的OneDrive文件夹共享，并挂载在Ubuntu的文件系统里。有意思的是这顺便还达成了自动同步，坏处就是CPU和内存占用高了一点，但影响并不是很大。操作流程配置虚拟机这里使用了KVM虚拟机平台实现一个轻量级的虚拟机，可以再配合WinApps把一些Windows软件直接做成一个Ubuntu里的小程序。配置流程基本完全参考了这篇教程。安装KVM：sudo apt-get install virt-manager。从微软官网下载Win10的ISO镜像，必须下载Pro版本的以使用远程桌面。太长了懒得一步步写了，直接跟着这个流程配置虚拟机，我只考虑使用OneDrive，所以分配的资源比较少，CPU两个核，最大4G内存，64G硬盘。继续跟着下一个流程安装Win10，注意在安装virt-win-gt-64.exe后还要安装一下同一文件夹下的virtio-win-guest-tools.exe来共享剪贴板，然后再安装那个Spice Guest Tools。可以把分辨率调低一些节省更多资源，比如800x600。如果想要使用WinApps，可以跟着这个步骤来安装配置。共享Windows虚拟机的文件夹先在网络设置里把当前网络设置为专用网络，并在网络和共享中心里打开专用网络下的网络发现和文件共享。右键OneDrive文件夹 -> 属性 -> 共享，选择高级共享，勾选共享此文件夹，下面的权限里删除所有人，添加自己的用户名，勾选完全控制，一路确认。Windows里打开Powershell，输入ipconfig获得虚拟机的IP地址。Ubuntu里创建一个挂载点文件夹，比如sudo mkdir /mnt/OneDrive。Ubuntu里用Samba挂载OneDrive文件夹sudo mount -t cifs '//windows_ip_address/OneDrive' /mnt/OneDrive -o username=username,password=password,dir_mode=0777,file_mode=0777，windows_ip_address、OneDrive文件夹名字、username、password改成你的。如果想要达成Ubuntu开机自动挂载OneDrive，需要虚拟机的Win10不设密码，开机能自动登入系统。但是Windows默认不允许无密码用户共享文件夹，参考这个网站，在Windows里win+r运行gpedit.msc组策略编辑器，Windows设置 -> 安全设置 -> 本地策略 -> 安全选项 -> 账户：使用空密码的本地账户只允许进行控制台登录，选择已禁用。英语的选项为Windows Settings -> Security Settings -> Local Policies -> Security Options -> Account: Limit local account use of blank passwords to console logon only，设置为disabled。然后刚刚的挂载命令的password=留空。在Ubuntu的Startup Application中添加一条bash -c "sleep 10 && echo sudo_password | sudo -S -k mount -t cifs '//windows_ip_address/OneDrive' /mnt/OneDrive -o username=username,password=,dir_mode=0777,file_mode=0777"，sudo_password改成自己的sudo密码。sleep 10是为了等待Windows开机进系统。共享Linux主机的文件夹虚拟机的内存设置里要勾选Enable shared Memory。选择Add Hardware，选择Filesystem，Driver用virtiofs，Source path选择Ubuntu主机里要共享的文件夹位置，Target path自己起个名字，比如VMShare。下载并安装Windows File System Proxy。在Windows的服务里找到VirtIO-FS Service，启动并设置为自动启动。在我的电脑下应该能看到出现了一个叫VMShare的目录。但是这个目录不能用于OneDrive的同步目录，不然都不需要单独给虚拟机划分空间了。参考资料https://github.com/Fmstrat/winappshttps://ivpsr.com/774.html
背景在深度学习的工作中有时候会用到C++写的Cuda函数来提高运行效率，例如这个Point-Bert，需要自行编译Chamfer Distance和Earth Mover's Distance (EMD)模块。但是在Conda环境里，跟着PyTorch一起安装的pytorch-cuda或cudatoolkit只有基本的Runtime，并不能用来编译Cuda代码。如果系统环境内安装了跟Conda环境里一样的Cuda版本，那可能能顺利编译。但通常我们用Conda环境就是为了能在安装不同PyTorch版本的时候不用折腾系统的Cuda，所以基本都会在编译时遇到系统Cuda和PyTorch Cuda版本不一样的错误。前段时间NVIDIA推出了官方的Conda环境Cuda安装包，这里参考这个官方教程来配置我们的Conda环境。具体操作这里直接记录下个人对Point-BERT的环境配置步骤，其他工作应该也大同小异。确定安装哪个版本的PyTorch，去官网查看需要哪个Cuda版本，安装Cuda。安装所有Conda能装的包，除了PyTorch。pip安装PyTorch，注意选择正确的Cuda版本。pip安装其他conda没有的包。注意opencv的pip版本可能会有些Qt的不兼容问题，可能装Conda版本更好。设置C++编译器的Linker路径到Conda环境。编译Cuda代码并安装到Conda环境。每次开新的命令行运行代码前都要设置C++的Linker路径。mamba create -n pointbert python=3.7 # mamba的速度比conda快多了 conda activate pointbert mamba install cuda -c nvidia/label/cuda-11.7.1 # 改为需要的cuda版本 mamba install easydict h5py matplotlib numpy opencv pyyaml scipy tensorboardX tqdm transforms3d termcolor scikit-learn ninja gcc=11.4 gxx_linux-64 libgcc notebook flake8 ipywidgets urllib3 requests charset-normalizer # gcc的版本需要根据之后编译时的报错来更改 pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu117 # 用pip来装PyTorch，不用装PyTorch提供的cuda包 pip install open3d==0.9 timm==0.4.5 argparse # 安装其他pip包 export LD_LIBRARY_PATH=/path/to/conda/envs/pointbert/lib # 手动设置C++ Linker路径，之后运行Python代码前也要设置一下 cd extensions/chamfer_dist python setup.py install # 会装到/path/to/conda/envs/pointbert/lib/python3.7/site-packages cd ../emd python setup.py install cd ../.. pip install "git+https://github.com/erikwijmans/Pointnet2_PyTorch.git#egg=pointnet2_ops&subdirectory=pointnet2_ops_lib" pip install --upgrade "https://github.com/unlimblue/KNN_CUDA/releases/download/0.2/KNN_CUDA-0.2-py3-none-any.whl"
前言ROS是机器人控制领域绕不开的一个框架，用起来也确实很方便，但这框架用官方安装教程只能装在系统的Python环境里。这样装写点最基础的控制没问题，但通常大家不会在系统Python环境里装太多包，特别是PyTorch这类神经网络框架，可能不同模型要装不同的版本。通常大家会用Conda这种包管理软件来创建一个新的环境专门用于某个项目，然而在Conda环境里是没法使用ROS的，所以对于涉及机器人学习的项目，我们需要把ROS的包给装进Conda环境里。最近发现有个叫RoboStack的项目可以实现这个Conda环境，还可以安装非官方支持的ROS版本（比如在20.04里装Humble），但同时也会带来一堆麻烦的依赖问题，特别是C++项目的编译。这里记录一下如何安装以及如何丑陋地解决Azure Kinect相机驱动没法编译的问题。安装前准备Mamba是一个基于Conda但比Conda快得多的包安装软件。如果还没装Conda，可以选择直接去官网下载并安装Mambaforge，会自动安装Conda和Mamba以及设置一些channel。如果已经装了Conda，可以在base环境下设置并安装Mamba。安装Mamba conda install mamba -c conda-forge，如果base环境里包有点多（例如装了Anaconda而不是Miniconda）或者好久没更新，可能这一步要花几十分钟时间解析依赖，这没啥办法只能硬等。然后可以把conda-forge源给添加到conda的设置里，这样就不用每次都-c conda-forge了。先把环境里的包都换源到conda-forge的mamba update --all -c conda-forge，然后执行conda config --add channels conda-forge和conda config --set channel_priority strict。这步可以不做，或者只在特定的环境里加上--env来只设置当前环境的默认源。安装ROS和PyTorch如果没有添加conda-forge到默认源，以下每一步都要加上-c conda-forge。首先创建一个新环境：mamba create -n ros_torch conda activate ros_torch # 如果直接装了Mambaforge，这里conda改为mambaROS 1和ROS 2选一个装，如果不想打-c robostack-staging，也可以把这个源加进环境设置里conda config --add channels robostack-staging。ROS 1：mamba install ros-noetic-desktop -c robostack-staging mamba install compilers cmake pkg-config make ninja catkin_tools -c robostack-stagingROS 2：mamba install ros-humble-dekstop -c robostack-staging mamba install compilers cmake pkg-config make ninja colcon-common-extensions -c robostack-staging跟apt安装的ROS差不多，有很多额外的ROS库可以安装，只需要mamba install ros-<distro>-<name> -c robostack-staging，可以去RoboStack官网看他们支持哪些库，目前还没碰到要用的库他们没收录的。安装好后可以先测试一下ROS能不能用，打开一个新的命令行，激活ros_torch环境后就可以运行内置的demo了，不要source系统的ROS安装目录。注意Conda环境的ROS不能跟系统环境的共用同一个workspace，需要为Conda的ROS创建一个新的workspace并在Conda环境下build。然后就可以安装PyTorch等神经网络框架了，需要注意的是如果没添加conda-forge源，必须每个命令都手打-c conda-forge，即使PyTorch的教程没有写。当前PyTorch安装命令为：conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia。还可以再顺手安装一些常用的库：mamba install tqdm matplotlib numpy pandas seaborn Pillow scipy pyyaml easydict gdown black flake8 notebook。使用Azure Kinect ROS DriverROS连接Azure Kinect相机需要安装基础驱动和ROS驱动。对于Ubuntu18.04系统加上系统环境的ROS 1，可以直接跟着官方教程安装Azure Kinect SDK，再在ROS的workspace/src里git clone https://github.com/microsoft/Azure_Kinect_ROS_Driver.git，把CMakeLists.txt的k4a和k4abt版本改成对应的SDK版本，如果build还是报版本号错误，需要去修改k4a安装的cmake，应该在/usr/lib/x86_64-linux-gnu/cmake/k4a。如果是Ubuntu20.04，则需要自己从微软的k4a-dev源以及k4a-tools源下载deb包并自行dkpg -i xxx.deb安装。在Conda环境的ROS里用Azure Kinect就有点麻烦了，因为Conda提供的build系列工具似乎不愿意去系统的/usr/lib/x86_64-linux-gnu里找SDK的依赖……还好Azure Kinect ROS驱动提供了一种直接把SDK依赖塞进ROS包的Azure_Kinect_ROS_Driver/ext/sdk的选项。同样，先去微软的k4a-dev源以及k4a-tools源下载libk4a1.4、libk4a1.4-dev和k4a-tools_1.4.1的deb包，不要安装而是直接解压，再解压里面的data压缩包，可以得到一个usr文件夹。k4a-tools的usr/bin直接丢进ext/sdk/bin；libk4a1.4里，usr/share直接丢进ext/sdk/share，usr/lib/x86_64-linux-gnu里的所有文件包括链接放进ext/sdk/lib；libk4a1.4-dev里，usr/include直接丢进ext/sdk/include，usr/lib/x86_64-linux-gnu里的cmake放进ext/sdk/lib。同时，把cmake里的k4a/k4aTargets.cmake和k4arecord/k4arecordTargets.cmake的第58行都注释掉。然后应该就可以在Conda ROS环境中构建Azure Kinect的ROS驱动了。使用Azure Kinect的ROS驱动前，需要安装几个ROS依赖：mamba install ros-noetic-image-geometry ros-noetic-camera-info-manager ros-noetic-rgbd-launch -c robostack-staging。