如果同时安装了 ROS1 和 ROS2,不管是二进制安装还是源码安装,都会遇到环境变量问题。在不使用 docker 的情况下,不能在 bashrc 中预先 source 一种版本的 setup.bash,会导致切换到另外版本时,无法直接 source。
可以为常用的 source 命令起一个“别名”,修改完成后 source ~/.bashrc 就会生效。
注意,alias
在 Bash 中不能对source
这种 shell built-in 起作用(会在子 shell 执行,环境不会改变当前 shell)。
snoetic() {
source /opt/ros/noetic/setup.bash
}
shumble() {
source ~/Dev/ros2_humble/install/setup.bash
}
sws() {
if [ -f "./devel/setup.bash" ]; then
source ./devel/setup.bash
echo "[sws] Sourced ROS 1: $(realpath ./devel/setup.bash)"
elif [ -f "./install/setup.bash" ]; then
source ./install/setup.bash
echo "[sws] Sourced ROS 2: $(realpath ./install/setup.bash)"
else
echo "[sws] Error: Neither ./devel/setup.bash (ROS 1) nor ./install/setup.bash (ROS 2) found"
fi
}
这样每次使用 ros1 命令,例如 roscore,rosnode,rostopic,rosbag,catkin_make,rosrun,roslaunch,… 之前,可以先执行 snoetic(TAB补齐即可)。
ros2 开头命令就先 shumble。
如果当前终端路径在某个自定义工作空间下,想要运行 ros 功能包中节点,则先 sws,就会自动根据版本 source。