Open javad123javad opened 3 years ago
I'll suggest you take a look at your ~/ros2_foxy/install
directory, and ensure that diagnostic_msgs
appears in the list of packages there. Also, after sourcing the Foxy setup.bash
, take a look and ensure that diagnostic_msgs
is in the CMAKE_PREFIX_PATH
.
I'll suggest you take a look at your
~/ros2_foxy/install
directory, and ensure thatdiagnostic_msgs
appears in the list of packages there. Also, after sourcing the Foxysetup.bash
, take a look and ensure thatdiagnostic_msgs
is in theCMAKE_PREFIX_PATH
.
Thanks, Just checked the ~/ros2_foxy/install
directory. The diagnostic_msgs
exists. When I execute echo $CMAKE_PREFIX_PATH | grep diagnostic_msgs
, I can find /home/imperiumdrive/ros2_foxy/install/diagnostic_msgs
in the variable.
Hm, I honestly don't know. It works here when I try it out.
One thing I will say is that the docs explicitly say that you should source Melodic first, then Foxy. I'd try that. Otherwise I am currently out of ideas.
I have met the same problem, do you have a solution?
Hi, I am having the same issue here. I tried a bunch of different things to solve this without success.
I used message()
to verify the path found by CMake
find_package(ament_lint_auto REQUIRED)
message("Found ament_lint_auto ${ament_lint_auto_DIR}")
find_package(diagnostic_msgs REQUIRED)
message("Found diagnostic_msgs ${diagnostic_msgs_DIR}")
It returns:
Found ament_lint_auto /opt/ros/foxy/install/ament_lint_auto/share/ament_lint_auto/cmake
Found diagnostic_msgs /opt/ros/melodic/share/diagnostic_msgs/cmake
Which means the wrong diagnostic message is found. So I modified with:
find_package(ament_lint_auto REQUIRED)
message("Found ament_lint_auto ${ament_lint_auto_DIR}")
# find_package(diagnostic_msgs REQUIRED)
find_package(diagnostic_msgs REQUIRED PATHS /opt/ros/foxy/install/diagnostic_msgs NO_DEFAULT_PATH)
message("Found diagnostic_msgs ${diagnostic_msgs_DIR}")
And now it returns
Found ament_lint_auto /opt/ros/foxy/install/ament_lint_auto/share/ament_lint_auto/cmake
Found diagnostic_msgs /opt/ros/foxy/install/diagnostic_msgs/share/diagnostic_msgs/cmake
Which is good. But the build still fails this time without any error message:
ROS_DISTRO was set to 'foxy' before. Please make sure that the environment does not mix paths from different distributions.
ROS_DISTRO was set to 'melodic' before. Please make sure that the environment does not mix paths from different distributions.
ROS_DISTRO was set to 'foxy' before. Please make sure that the environment does not mix paths from different distributions.
Starting >>> ros1_bridge
--- stderr: ros1_bridge
Found ament_lint_auto /opt/ros/foxy/install/ament_lint_auto/share/ament_lint_auto/cmake
Found diagnostic_msgs /opt/ros/foxy/install/diagnostic_msgs/share/diagnostic_msgs/cmake
---
Failed <<< ros1_bridge [13.5s, exited with code -11]
Summary: 0 packages finished [14.1s]
1 package failed: ros1_bridge
1 package had stderr output: ros1_bridge
The exit code is different now, so I don't know what to think
I eventually solved this issue by changing the order of the source commands. the README says:
# You have already sourced your ROS installation.
# Source your ROS 2 installation:
. <install-space-with-ros2>/local_setup.bash
# And if you have a ROS 1 overlay workspace, something like:
# . <install-space-to-ros1-overlay-ws>/setup.bash
# And if you have a ROS 2 overlay workspace, something like:
# . <install-space-to-ros2-overlay-ws>/local_setup.bash
However, I guess because the ROS2 installation is from source, it should be sourced after any ROS1 overlay. So here is the order I used for sourcing:
# Source your ROS1 instalation
source "/opt/ros/melodic/setup.bash"
# And if you have a ROS 1 overlay workspace, something like:
. "<path_to_catkin_ws>/install_isolated/setup.bash"
# Source your ROS 2 installation:
. "/opt/ros/foxy/install/setup.bash"
# And if you have a ROS 2 overlay workspace, something like:
. "<path_to_ros2_ws>/install/local_setup.bash"
Should the README be modified, or is this case too specific?
EDIT: And by the way, after doing this, I could use the original CMake file without the modifications I talked about in the last comment.
Hi,
I tried the solution of @HuguesTHOMAS and worked! But at the end of the build i receive another error:
libros1_bridge.so: undefined reference to ros1_bridge::Factory<vision_msgs::Detection3D_<std::allocator<void> >, vision_msgs::msg::Detection3D_<std::allocator<void> > >::convert_1_to_2(vision_msgs::Detection3D_<std::allocator<void> > const&, vision_msgs::msg::Detection3D_<std::allocator<void> >&)'
`
Someone have the same error? How i could fix this?
Thanks!
I have similar issue:
/usr/bin/ld: libros1_bridge.so: undefined reference to ros1_bridge::Factory<controller_manager_msgs::ControllerState_<std::allocator<void> >, controller_manager_msgs::msg::ControllerState_<std::allocator<void> > >::convert_2_to_1(controller_manager_msgs::msg::ControllerState_<std::allocator<void> > const&, controller_manager_msgs::ControllerState_<std::allocator<void> >&)' /usr/bin/ld: libros1_bridge.so: undefined reference to ros1_bridge::Factory<controller_manager_msgs::ControllerState_<std::allocator<void> >, controller_manager_msgs::msg::ControllerState_<std::allocator<void> > >::convert_1_to_2(controller_manager_msgs::ControllerState_<std::allocator<void> > const&, controller_manager_msgs::msg::ControllerState_<std::allocator<void> >&)' collect2: error: ld returned 1 exit status
Are you using Foxy and Melodic on Ubuntu 18.04? I think it's worth noting that Foxy is not supported on 18.04 so errors are not surprising.
TD;LR The answer is not keep re-sourcing/re-overlaying in the same terminal.
So this is happening with ROS1 Noetic + ROS2 Humble on Ubuntu 22.04 (Jammy) as well.
root@eb1dc6b69d3f:~/bridge_ws# source ~/ros2_humble_ws/install/setup.bash && source ~/ros2_msgs_ws/install/setup.bash && echo "add_compile_definitions(BOOST_BIND_GLOBAL_PLACEHOLDERS)" >> ~/bridge_ws/src/ros1_bridge/CMakeLists.txt && colcon build --symlink-install --packages-select ros1_bridge --cmake-force-configure
ROS_DISTRO was set to 'humble' before. Please make sure that the environment does not mix paths from different distributions.
ROS_DISTRO was set to 'noetic' before. Please make sure that the environment does not mix paths from different distributions.
Starting >>> ros1_bridge
--- stderr: ros1_bridge
CMake Error at CMakeLists.txt:79 (message):
Failed to find ROS 2 package 'diagnostic_msgs'
---
Failed <<< ros1_bridge [4.03s, exited with code 1]
Summary: 0 packages finished [4.56s]
1 package failed: ros1_bridge
1 package had stderr output: ros1_bridge
Refer the figure:
1 | 2 3 | 4 Terminal 1 and 3 are the bridge_ws, 2 is ros1 only and 4 is ros2 related builds only. (ignore the unrelated build failure in 3)
Once you've built the respected ros workspaces along with msgs/srvs you want to map, open a fresh terminal for the bridge, overlay ros1 first, then ros2 and build the bridge (as @HuguesTHOMAS mentioned before).
Suppose the bridge is still under development, and you clean the previous build. That's when it can fail to find the ros2 version of diagnostic_msgs
despite unsetting the cache, https://github.com/ros2/ros1_bridge/blob/master/CMakeLists.txt#L78.
To avoid this, I found discarding that terminal and overlaying the workspaces in the correct order, in a yet again fresh terminal, seems to be fixing it. Though not a permanent solution, hope it helps!
@gustavojoseleite Hello, How did you solve the latest error? I am struggling with this for a long time so I'd want to ask if it is solved :)
I eventually solved this issue by changing the order of the source commands. the README says:
# You have already sourced your ROS installation. # Source your ROS 2 installation: . <install-space-with-ros2>/local_setup.bash # And if you have a ROS 1 overlay workspace, something like: # . <install-space-to-ros1-overlay-ws>/setup.bash # And if you have a ROS 2 overlay workspace, something like: # . <install-space-to-ros2-overlay-ws>/local_setup.bash
However, I guess because the ROS2 installation is from source, it should be sourced after any ROS1 overlay. So here is the order I used for sourcing:
# Source your ROS1 instalation source "/opt/ros/melodic/setup.bash" # And if you have a ROS 1 overlay workspace, something like: . "<path_to_catkin_ws>/install_isolated/setup.bash" # Source your ROS 2 installation: . "/opt/ros/foxy/install/setup.bash" # And if you have a ROS 2 overlay workspace, something like: . "<path_to_ros2_ws>/install/local_setup.bash"
Should the README be modified, or is this case too specific?
EDIT: And by the way, after doing this, I could use the original CMake file without the modifications I talked about in the last comment.
Thanks for your solution, I solved.
I found the same problem. In the morning, I woke up and reopened the terminal to try to build. I found no problem. But when I modified the msg file and rebuilt, it would appear.
--- stderr: ros1_bridge CMake Error at CMakeLists.txt:79 (message): Failed to find ROS 2 package 'diagnostic_msgs' ---
Finally, I found that I closed the original terminal for building and opened a new terminal. If you are not sure, you can execute in the new terminal
unset CMAKE_PREFIX_PATH unset ROS_PACKAGE_PATH unset ROS_PATH unset AMENT_PREFIX_PATH
Then you don't need to source too much. Just source ros1_ws/install/setup.bash and ros2_ws/install/setup.bash where the message is located
Bug report
Required Info:
Steps to reproduce issue
~/ros2_foxy/install/setup.bash
/opt/ros/melodic/setup.bash
colcon build --symlink-install --packages-select ros1_bridge --cmake-force-configure