ROS2问题解决

ROS2遇到的问题

1. 未加载ros2环境

# 问题:ros2: command not found
# 原因:当前终端没有加载 ROS2 环境

# 解决方法:
source /opt/ros/humble/setup.bash

# 或着每次自动加载
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

2. 每个新终端默认不知道当前工作空间的位置

# 问题: 自己创建的包运行时报 Package not found,    新开终端后运行自己写的包,又出现 Package not found
# 原因:创建包后没有重新编译,或者编译后没有 source 工作空间。

# 解决方法:
cd ~/abot_ws
colcon build
source install/setup.bash
ros2 run pkg01_helloworld_cpp helloworld


# 自动解决:
echo '[ -f ~/abot_ws/install/setup.bash ] && source ~/abot_ws/install/setup.bash' >> ~/.bashrc
source ~/.bashrc
# 注意:即使设置了自动 source,修改代码后仍然需要重新编译:
cd ~/abot_ws
colcon build
source install/setup.bash

3. VS Code IntelliSense 配置头文件问题

# 问题:无法打开源文件 "rclcpp/rclcpp.hpp"
# 原因:这是 VS Code IntelliSense 配置问题,不是代码错误。VS Code 不知道 ROS2 头文件在/opt/ros/humble/include


# 解决方法:
~/abot_ws/.vscode/c_cpp_properties.json
{
    "configurations": [
        {
            "name": "WSL ROS2 Humble",
            "includePath": [
                "${workspaceFolder}/**",
                "/opt/ros/humble/include",
                "/opt/ros/humble/include/**",
                "/usr/include",
                "/usr/include/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/g++",
            "cStandard": "c17",
            "cppStandard": "gnu++17",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

4. 选择工具包问题

# 做 ROS2 项目时应选择:

GCC 11.4.0 x86_64-linux-gnu
C = /usr/bin/gcc, CXX = /usr/bin/g++

5.code .打不开VS Code

# 问题: Code.exe: Exec format error
# 原因: WSL 调用 Windows 程序的互操作功能可能异常。


# 解决方法
sudo tee /etc/wsl.conf > /dev/null <<'EOF'
[boot]
systemd=true

[user]
default=arthur

[interop]
enabled=true
appendWindowsPath=true
EOF
# 然后退出 WSL:
exit

# 之后
wsl --shutdown
wsl -d Ubuntu-22.04-ROS2-Study
cd ~/dev_ws/src/ros2_21_tutorials
code .

6. 重新编译

# 清除之前编译的结果
cd ~/dev_ws && rm -rf build install log

# 重新编译
colcon build

# 加载功能包
source install/setup.bash

7. 其他设备发现不了WSL下的ROS2节点

ROS2 默认靠 DDS 在局域网里自动发现节点,发现过程依赖 UDP/多播。WSL2 默认 NAT 网络经常导致树莓派发现不了 WSL 里的 ROS2 节点。

解决方法:
Windows 11 22H2 及以上可以开启 WSL 的 mirrored networking
提前改成 mirrored
原因是 ROS2 的 DDS 自动发现比较依赖局域网通信、多播、UDP。微软官方说明,WSL 的 mirrored networking 支持 multicast 多播,也支持从局域网直接连接 WSL,并且改善 NAT 架构下的网络兼容性。

修改成mirrored网络

Windows PowerShell 里输入:

notepad $env:USERPROFILE\.wslconfig

写入:

[wsl2]
networkingMode=mirrored
dnsTunneling=true
autoProxy=true

之后保存。

接着执行:

wsl --shutdown

(微软文档说明,.wslconfig 是 WSL2 的全局配置文件,修改后需要让 WSL 完全停止再重新启动才会生效)

重新打开 Ubuntu 后,测试:

ping baidu.com
sudo apt update
ip addr

发现可以ping通过,更新成功,并且ip地址由172.xxx.xxx变为了192.xxx.xxx则成功了

改之前:
WSL 使用 NAT 虚拟网络
IP: 172.26.220.123
更适合单机开发,不太适合 ROS2 跨设备自动发现

改之后:
WSL 使用 mirrored 网络
IP: 192.168.154.239
更接近真实局域网设备,更适合之后连接树莓派

查看网络信息可以查看这个笔记:
WSL_ROS2_网络查看与树莓派通信检查笔记

回退方法

.wslconfig 里的:

networkingMode=mirrored

改成

networkingMode=nat

然后 PowerShell 执行:

wsl --shutdown

添加新评论