当前国内普遍的软件生态离不开Windows,而代码开发又依赖各类Linux环境,在多生态间的任务切换时总是显得力不从心,好在Vscode提供了强大的RemoteSSH,一个强大的远程开发插件,这就使得以此为基础实现在Windows上开发远端应用成为了触手可及的事情。(虔诚)
于是就在这里记录一下打通环境的整个过程,免得以后忘记。
开发环境稳定,不会因为一些误操作受到破坏,方便迁移执行环境,想想,你只需要将镜像换台机器就可以跑起来,还不怎么损失性能,真是居家旅行必备。
VM16 安装Ubuntu22.04
Apt配置清华源
Ubuntu22.04内安装Docker,Docker配置阿里源,拉起ROS2 Docker环境,顺便安装一些常用的开发工具。原生Docker环境的自带工具集真的真的太精简了。
docker run -it osrf/ros:galactic-desktop /bin/bash
apt install -y vim gdb ssh
顺便配置下docker内的账号密码,方便使用root账户登录
passwd [your_password]
然后修改一下ssh的配置文件,开启
vim /cat /etc/ssh/sshd_config
#PermitRootLogin prohibit-password 改成
PermitRootLogin yes
开启另一个终端,保存一下镜像。一般来说写一个docker的启动脚本可能泛用性更好一点,但是在纯粹的个人开发角度也不是很有必要,因此就保存镜像就好了。
docker commit [containerId] mydocker:ros2
然后下一次就可以使用
docker run -it mydocker:ros2 /bin/bash
记得打开之后输入一下ssh的启动指令,这里还不知道怎么搞成默认配置,先这样子。
service ssh start
这时候就可以用过ssh去登录这个docker了,至于登录docker要用的IP地址,就自己在docker内ifconfig看看咯。
还有,这时候docker内应该是空空如也的,你需要把你的文件夹映射进docker。就是下面那个小小的-v选项,有几个文件夹就填几个,左边是宿主的路径,右边是容器内期望的路径,如果宿主路径不存在,docker会自动创建一个空文件夹。
docker run -it -v /home:/home mydocker:ros2 /bin/bash
为了能够在windows直接访问到docker内的文件,我们采用的方案是通过ssh的方式来访问,这里就涉及到需要一个ssh隧道的方法,来帮忙vscode一次访问到容器。这里使用mobaXterm的Tunnel来完成我们的目标(Xshell什么的也可以)。
具体原理就是通过SSH隧道实现从[A->B->C]到[A->C]的空间折叠技术(误)。
按照图片里面的说明来填写就可以了。
配置完记得点一下start。
到这一步,恭喜你,已经能够直接访问容器内部了。
接下来在Vscode中配置远程链接
这里假定你已经知道该如何操作了,就不赘述了。记得需要在remote环境中安装vscode的cmake和c++插件,其他的应该不太需要了。安装完可以再commit一下docker镜像,避免每次都安装。
从本质上来说Ros2提供的colcon build构建工具依然是一个CMake的高级封装而已,因此,想要解决这个问题,就要分析colcon到底干了啥,ssh登录上去的docker环境和原生环境到底差了哪里,为什么原生环境可以,而ssh登上去不行,于是我们ls看一下,发现docker方式打开会执行ros_entrypoint.sh
而这个脚本就干了下面这件事情
source /opt/ros/galactic/setup.bash
噢,豁然开朗,这个脚本不就是用来配置环境变量的嘛,到此谜底揭晓,只要给Vscode的执行环境配置进这些环境变量,就可以脱离colcon build来构建ros2的应用了嘛,这样更加方便在ide内完成开发工作。下面给出结论,先去环境上source一下ros的环境变量,然后在Vscode工作区.vscode路径下添加settings.json文件
{
"cmake.environment": {
"PYTHONPATH": "从你的环境上找到env的值然后填进来",
"LD_LIBRARY_PATH": "从你的环境上找到env的值然后填进来",
"PATH": "从你的环境上找到env的值然后填进来",
"ROS_DISTRO": "galactic",
"ROS_VERSION": "2",
"ROS_PYTHON_VERSION": "3",
"AMENT_PREFIX_PATH":"从你的环境上找到env的值然后填进来",
"CMAKE_PREFIX_PATH":"从你的环境上找到env的值然后填进来"
},
}
说白了就是source要做哪些事,就给他放进来,比较关键的路径大概有上面几个。然后配置完成之后,就可以见证奇迹了。
这个办法也适用于JetBrain家的Clion,过程略有差异,但是殊途同归。这个办法唯一麻烦的地方在于,如果有大量自定义的消息文件,上面的环境变量会比较多一些,每次有更新都要手动处理一下。如果Vscode支持在运行cmake之前执行一下特定脚本就好了,不过就目前来看,应该是不支持这个功能的,尝试了一下手动封装cmake到某个脚本中去,也不能实现。
总之就这样,欢迎查阅。