ROS2遇到的问题
1. 未加载ros2环境
# 问题:ros2: command not found
# 原因:当前终端没有加载 ROS2 环境
# 解决方法:
source /opt/ros/humble/setup.bash
# 或着每次自动加载
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc2. 每个新终端默认不知道当前工作空间的位置
# 问题: 自己创建的包运行时报 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.bash3. 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.bash7. 其他设备发现不了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