[ROS2] Sourcing colcon-generated setup.bash includes ROS1 catkin workspace
Hello,
I have experience with ROS1, and now I am learning ROS2. I installed ROS2 eloquent through the debian repos, set up my workspace with colcon following the tutorials, and now I am in the "Writing a simple publisher and subscriber (Python)" tutorial. When running the publisher node, I get the error:
AttributeError: type object 'type' has no attribute '_TYPE_SUPPORT' This might be a ROS 1 message type but it should be a ROS 2 message type. Make sure to source your ROS 2 workspace after your ROS 1 workspace.
According to google, this is due to the PYTHONPATH environment variable. However, I noticed the error only occurs when sourcing the "install/setup.bash" script generated by the "colcon build" command. Investigating the colcon-generated script, I find it is also pointing to my CATKIN workspace (I have ROS melodic installed):
# source chained prefixes
# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script
COLCON_CURRENT_PREFIX="/opt/ros/melodic"
_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash"
# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script
COLCON_CURRENT_PREFIX="/home/renan/catkin_ws/devel"
_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash"
# setting COLCON_CURRENT_PREFIX avoids determining the prefix in the sourced script
COLCON_CURRENT_PREFIX="/opt/ros/eloquent"
_colcon_prefix_chain_bash_source_script "$COLCON_CURRENT_PREFIX/local_setup.bash"
Commenting the " COLCONCURRENTPREFIX="/opt/ros/melodic" " and " COLCONCURRENTPREFIX="/home/renan/catkin_ws/devel" " lines, and resourcing the install/setup.bash file, the python publisher node runs fine.
What could be the problem here? I don't know if this is typical for ROS2, but it seems to be causing confusion with the message definitions in ROS2.
Thanks in advance.
Asked by renangm on 2020-06-28 12:26:20 UTC
Answers
Would you happen to "auto-source
" your ROS Melodic installation (fi in your .bashrc
)?
Asked by gvdhoorn on 2020-06-29 03:32:46 UTC
Comments
The first time I tried to run the nodes yes, melodic was auto-sourced before eloquent in .bashrc
. But the problem persisted even after commenting the melodic auto-sourcing.
Asked by renangm on 2020-06-29 20:06:42 UTC
I reinstalled everything (eloquent and dependency packages) and now weirdly the problem seems to be gone. The colcon-generated install/setup.bash
does not index melodic or its environment. Still if possible I would like to understand the problem...
Asked by renangm on 2020-06-29 20:09:56 UTC
The first time I tried to run the nodes yes, melodic was auto-sourced before eloquent in
.bashrc
. But the problem persisted even after commenting the melodic auto-sourcing.
commenting is not enough.
The setup.*
files in your Colcon workspace cache certain environment variables. The Melodic paths get embedded in them -- as you already found when looking at the install/setup.bash
file.
You would have to clean your Colcon workspace (remove the build
and install
directories), make sure to not auto-source
any more, start a new terminal and then do a clean build of your Colcon workspace.
After that, the 'problem' should be gone.
Asked by gvdhoorn on 2020-06-30 02:06:16 UTC
I think I identified the issue. Will post as a separate answer, thanks!
Asked by renangm on 2020-06-30 15:10:02 UTC
I believe I identified the issue.
First, as gvdhoorn mentioned, the melodic paths are being added by colcon build
to the install/setup
files. If ROS1 is sourced, then the melodic paths are embedded in the CMAKE_PREFIX_PATH
variable. If I unset this variable before cleaning and rebuilding the colcon workspace, only the eloquent path remains in the install/setup files.
Second, sourcing melodic also adds its paths to the PYTHONPATH variable, which produces the AttributeError
exception. In my case, this variable is only used by ROS and ROS2, so I can safely unset and reset it by sourcing the eloquent setup scripts. This is also fixed by opening a new terminal.
By resetting these variables, I can keep sourcing ROS1 or ROS2 in .bashrc
, commenting the one I don't want to run.
Asked by renangm on 2020-06-30 15:11:11 UTC
Comments