一、准备环境
- Windows11 22H2 22621.819
- WSL Ubuntu 18.04
- ROS1 Melodic Morenia
- 新的wsl已经可以直接显示linux中的图形程序了,只需要更新一下,详见 https://learn.microsoft.com/en-us/windows/wsl/tutorials/gui-apps
- Ubuntu 18.04对应的ROS版本只能是Melodic
- 不要换源!不要换源!不要换源! 换源之后会有个错误我反正查了半天没解决掉。关键是换回来还是报错。
- 无法访问github怎么办?
cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }'
可以获取wsl网段下主机的ip,git config --global http.proxy 主机ip:代理端口
# 安装 Ubuntu18.04
wsl --install
wsl --update
wsl --install Ubuntu-18.04
二、安装ROS
# 配置源
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
# 设置密钥
sudo apt install curl git -y
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
# 更新源
sudo apt update
# 安装ROS
sudo apt install ros-melodic-desktop-full -y
# 配置环境变量
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
测试一下小乌龟,新开三个窗口,分别运行下面三条命令
roscore
# 小乌龟,惊喜,linux的程序直接显示为windows的窗口了,这可比新安装一个x11server好用多了。
rosrun turtlesim turtlesim_node
# 再开一个终端,让小乌龟运动
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
三、编译VINS-Mono
安装依赖ceres
sudo add-apt-repository "deb http://cn.archive.ubuntu.com/ubuntu trusty main universe"
sudo apt-get install cmake liblapack-dev libsuitesparse-dev libcxsparse3.1.2 libgflags-dev libgoogle-glog-dev libgtest-dev -y
git clone https://github.com/ceres-solver/ceres-solver.git
# 版本1.14可以成功编译VINS
cd ceres-solver && git checkout 1.14.0
mkdir build && cd build && sudo cmake ..
sudo make -j8
sudo make install
编译VINS
mkdir -p ~/catkin_ws/src && cd ~/catkin_ws/src && catkin_init_workspace
git clone https://github.com/HKUST-Aerial-Robotics/VINS-Mono.git
cd ../ && catkin_make
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
四、通过vscode调试VINS
虽然windows可以直接显示安装在ubuntu上面安装vscode,但是如果你使用高分屏就会发现它不会进行缩放,字体小,操作有延迟。所以又开始整骚活了,咱们使用Windows上的vscode远程ubuntu。
-
在Ubuntu上安装gdb
sudo apt install gdb -y
在windows上安装vscode,在vscode上安装WSL插件,安装完成点击左下角 Open a Remote Window > New WSL Window using Distro 选择Ubuntu-18.04,这样vscode好像会在linux中安装一个“服务端”,我们能操作的是一个“客户端”。
然后点击File > Open Folder 选择 编译vins时创建的catkin_ws。
-
将几个CMakeList.txt中的
set(CMAKE_BUILD_TYPE "Release")
改成set(CMAKE_BUILD_TYPE "Debug")
,再用catkin_make编译一下。注意! 这一步还是别做了,不改的话断点有时候卡不准,改了的话运行结果都不对。
-
新建 catkin_ws/src/VINS-Mono/vins_estimator/launch/debug.launch 文件,填入以下内容
<launch> <include file="$(find vins_estimator)/launch/euroc.launch"/> <include file="$(find vins_estimator)/launch/vins_rviz.launch"/> </launch>
-
搜索插件ROS,点击安装,这时会同时安装在windows和Linux下
点击run and debug > create a launch.json file. > ROS > ROS launch > vins_estimator > debug.launch,这时会在.vscode文件夹下生成launch.json文件
在需要的地方打上断点,点击绿色的小三角,服务就跑起来了。
-
将EuRoC数据集复制到合适的位置(我这里放到vins目录下了),再开一个终端,执行
rosbag play catkin_ws/src/VINS-Mono/V1_01_easy.bag
很好,我也没有搞过C++的工程,找了几个教程整合来的,不确定正宗学派是不是这么调试的,但是对于我们这种想研读一下代码的够用了。
通过clion调试
vscode始终有断点卡不准的情况,我不知道问题出在哪里,所以试试clion调试。截至2023-02-18,jetbrains gateway依旧是公测版,bug不断且功能残缺,所以我只能选择在wsl里安装linux版的clion。
- 通过clion打开~/catkin_ws/src
-
修改标注的两项
- clion本身不支持launch文件,所以有两种选择,第一个是把ROSNode当作普通的c++文件来执行,但是这样要启动好几个文件呢,还不知道怎么传参数;所以我们选择第二种:通过roslaunch执行launch文件,用clion连接gdb。具体做法是
- 打开一个终端,执行
roslaunch ~/catkin_ws/src/VINS-Mono/vins_estimator/launch/debug.launch
- clion中选择 Run|Attach to Process...,选择vins_estimater。这样clion就和gdb连接起来了。
- 执行rosbag play,可以发现正常卡住断点,但是单步调试还是乱跳。
- 打开一个终端,执行
我发现问题不在编译器上,而是CMakeList.txt文件中set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")
这个-03选项,这句话说用Release方式编译的时候会优化代码啥的,3就是优化等级。那不让优化不就的了吗?不行,如果去掉或者改动这个优化选项,整个vins跑出来的轨迹图都几乎是直的。不知道怎么办了。
五、查看eigen类的值
相比pycharm中展示numpy的方式,这个eigen中的数据实在是不好看,发现有两个解决办法:
- lldb + LLDB-Eigen-Data-Formatter (不知道怎么把gdb换成lldb,评论区见)
- gdb + eigen debug gdb printers.py
第二个方法是eigen有个gdb插件,可以打印数据,使用办法:
- 下载 https://gitlab.com/libeigen/eigen/-/blob/master/debug/gdb/printers.py 到任意文件夹
- 新建文件
~/.gdbinit
,填入以下内容:
注意网上有的是python import sys sys.path.insert(0, '/path/to/your/directory') # 改成你的目录,我放到了 /usr/local/share/gdb/python from printers import register_eigen_printers register_eigen_printers (None) end
prints
有的是printers
,这取决于你的python文件,可能以前的版本是prints
。如果没效果在命令行输入gdb
命令,初始化时会打印错误信息。
另外
- rviz,每次关闭都提示保存啥?
使用root用户运行rviz,点击file>preferences>取消勾选prompt Save on Exit>OK,然后点击File>save config。
参考
- ROS与Ubuntu对应关系 https://blog.csdn.net/maizousidemao/article/details/119846292
- 安装ROS
- X11转发 https://zhuanlan.zhihu.com/p/150555651
- https://blog.csdn.net/a379039233/article/details/80782351
- http://events.jianshu.io/p/3dab8550218d
- eigen 格式化
- https://zhuanlan.zhihu.com/p/480766392
- https://github.com/tehrengruber/LLDB-Eigen-Data-Formattereigendebuggdbprinters.py
- https://stackoverflow.com/questions/25085465/using-gdb-with-eigen-c-library
- https://gitlab.com/libeigen/eigen/-/blob/master/debug/gdb/printers.py
- https://stackoverflow.com/questions/58464867/debugging-eigen-in-vscode
- clion调试
- wsl使用主机的代理服务
- https://zinglix.xyz/2020/04/18/wsl2-proxy/,这有个大问题,export设置的环境变量是有作用域的(https://blog.csdn.net/White_Idiot/article/details/78253004),脚本里设置的环境变量并不能适用于脚本外的终端环境,