Open awesomebytes opened 5 years ago
This looks interesting: https://github.com/ros-visualization/rviz/pull/1242
Even tho I don't think the problem really comes from there... Ogre::DataStreamPtr
should have a bind
method: https://ogrecave.github.io/ogre/api/1.10/class_ogre_1_1_shared_ptr.html
Oh, just found out about bind:
this api will be dropped. use reset(T*) instead
I'd expect a deprecation warning not an error on compiling... After doing that substitution in the code, the next errors are:
home/user/rviz_ws/src/rviz/src/rviz/ogre_helpers/movable_text.h:175:24: error: 'const MaterialPtr' {aka 'const class std::shared_ptr<Ogre::Material>'} has no member named 'isNull'
assert(!mpMaterial.isNull());
/home/user/rviz_ws/src/rviz/src/rviz/ogre_helpers/movable_text.cpp:113:69: error: 'Ogre::FontPtr' {aka 'class std::shared_ptr<Ogre::Font>'} has no member named 'getPointer'
= (Font *) FontManager::getSingleton().getByName(mFontName).getPointer();
/home/user/rviz_ws/src/rviz/src/rviz/ogre_helpers/movable_text.cpp:122:18: error: 'Ogre::MaterialPtr' {aka 'class std::shared_ptr<Ogre::Material>'} has no member named 'setNull'
mpMaterial.setNull();
Which seem to be the same than in Gazebo, I think.
I kept drilling it and made a patch that successfully compiles Rviz:
https://gist.github.com/awesomebytes/c1ba75ec3329aa63d768320b43743e70
(I applied it by hand and it worked, now I'm trying emerging ros-kinetic/rviz with it in $EPREFIX/etc/portage/patches/ros-kinetic/rviz).
Note that for Gentoo Prefix I also needed to do before emerging:
export PATH=/tmp/gentoo/usr/lib64/qt5/bin:$PATH
It's needed cause SIP (which makes wrappers for python for Rviz) invokes the qmake binary, which by default is not in the path.
The actual error of SIP:
qmake: could not find a Qt installation of '5'
Traceback (most recent call last):
File "/tmp/gentoo/opt/ros/kinetic/share/python_qt_binding/cmake/sip_configure.py", line 51, in <module>
config = Configuration()
File "/tmp/gentoo/opt/ros/kinetic/share/python_qt_binding/cmake/sip_configure.py", line 18, in __init__
[qmake_exe, '-query'], env=env, universal_newlines=True)
File "/tmp/gentoo/usr/lib64/python2.7/subprocess.py", line 223, in check_output
raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['qmake', '-query']' returned non-zero exit status 1
Apparently $PATH is ignored when doing emerge, uhm.
The trick for Gentoo Prefix for the SIP stuff:
cd $EPREFIX/usr/bin
# points to qtchooser, which fails
unlink qmake
ln -s $EPREFIX/usr/lib64/qt5/bin/qmake qmake
Unfortunately once built we get a Runtime Error (adding all output on running it):
$ rviz
[ INFO] [1544761478.630221024]: rviz version 1.12.16
[ INFO] [1544761478.630271158]: compiled against Qt version 5.11.3
[ INFO] [1544761478.630287968]: compiled against OGRE version 1.10.12 (Xalafu)
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
[ INFO] [1544761478.763462659]: Stereo is NOT SUPPORTED
[ INFO] [1544761478.763545274]: OpenGl version: 3 (GLSL 1.3).
libpng warning: iCCP: known incorrect sRGB profile
[ERROR] [1544761478.848182862]: Could not load pixmap '/tmp/gentoo/opt/ros/kinetic/share/rviz/icons/rotate.svg'
[ERROR] [1544761478.848265435]: Could not load pixmap 'package://rviz/icons/rotate.svg' -- using default cursor instead.
[ERROR] [1544761478.848494611]: Could not load pixmap '/tmp/gentoo/opt/ros/kinetic/share/rviz/icons/rotate_cam.svg'
[ERROR] [1544761478.848534683]: Could not load pixmap 'package://rviz/icons/rotate_cam.svg' -- using default cursor instead.
[ERROR] [1544761478.848729828]: Could not load pixmap '/tmp/gentoo/opt/ros/kinetic/share/rviz/icons/move2d.svg'
[ERROR] [1544761478.848754728]: Could not load pixmap 'package://rviz/icons/move2d.svg' -- using default cursor instead.
[ERROR] [1544761478.848913423]: Could not load pixmap '/tmp/gentoo/opt/ros/kinetic/share/rviz/icons/move_z.svg'
[ERROR] [1544761478.848936817]: Could not load pixmap 'package://rviz/icons/move_z.svg' -- using default cursor instead.
[ERROR] [1544761478.849085110]: Could not load pixmap '/tmp/gentoo/opt/ros/kinetic/share/rviz/icons/zoom.svg'
[ERROR] [1544761478.849109121]: Could not load pixmap 'package://rviz/icons/zoom.svg' -- using default cursor instead.
[ERROR] [1544761478.849256354]: Could not load pixmap '/tmp/gentoo/opt/ros/kinetic/share/rviz/icons/crosshair.svg'
[ERROR] [1544761478.849280122]: Could not load pixmap 'package://rviz/icons/crosshair.svg' -- using default cursor instead.
[ERROR] [1544761478.850519429]: Could not load pixmap '/tmp/gentoo/opt/ros/kinetic/share/rviz/icons/cursor.svg'
[ERROR] [1544761478.870403407]: RuntimeAssertionException: name must not be empty in getSceneNode at /home/user/gentoo/var/tmp/portage/dev-games/ogre-1.10.12/work/ogre-1.10.12/OgreMain/src/OgreSceneManager.cpp (line 959)
If we check on v 1.10.12: https://github.com/OGRECave/ogre/blob/v1.10.12/OgreMain/src/OgreSceneManager.cpp#L953-L972
There is effectively that check. And checking Rviz code:
rviz $ grep -r getSceneNode .
./src/rviz/display.h: Ogre::SceneNode* getSceneNode() const { return scene_node_; }
./src/rviz/frame_position_tracking_view_controller.h: * updateTargetSceneNode(). */
./src/rviz/frame_position_tracking_view_controller.h: * calls updateTargetSceneNode(). */
./src/rviz/frame_position_tracking_view_controller.h: * change. Calls updateTargetSceneNode() and
./src/rviz/frame_position_tracking_view_controller.h: virtual void updateTargetSceneNode();
./src/rviz/default_plugin/pose_with_covariance_display.cpp: coll_handler_->addTrackedObjects( arrow_->getSceneNode() );
./src/rviz/default_plugin/pose_with_covariance_display.cpp: coll_handler_->addTrackedObjects( axes_->getSceneNode() );
./src/rviz/default_plugin/pose_with_covariance_display.cpp: arrow_->getSceneNode()->setVisible( false );
./src/rviz/default_plugin/pose_with_covariance_display.cpp: axes_->getSceneNode()->setVisible( false );
./src/rviz/default_plugin/pose_with_covariance_display.cpp: arrow_->getSceneNode()->setVisible( use_arrow );
./src/rviz/default_plugin/pose_with_covariance_display.cpp: axes_->getSceneNode()->setVisible( !use_arrow );
./src/rviz/default_plugin/axes_display.cpp: axes_->getSceneNode()->setVisible( isEnabled() );
./src/rviz/default_plugin/axes_display.cpp: axes_->getSceneNode()->setVisible( true );
./src/rviz/default_plugin/axes_display.cpp: axes_->getSceneNode()->setVisible( false );
./src/rviz/default_plugin/tf_display.cpp: info->axes_->getSceneNode()->setVisible( show_axes_property_->getBool() );
./src/rviz/default_plugin/tf_display.cpp: info->selection_handler_->addTrackedObjects( info->axes_->getSceneNode() );
./src/rviz/default_plugin/tf_display.cpp: info->parent_arrow_->getSceneNode()->setVisible( false );
./src/rviz/default_plugin/tf_display.cpp: frame->parent_arrow_->getSceneNode()->setVisible(false);
./src/rviz/default_plugin/tf_display.cpp: frame->axes_->getSceneNode()->setVisible(false);
./src/rviz/default_plugin/tf_display.cpp: frame->axes_->getSceneNode()->setVisible( false );
./src/rviz/default_plugin/tf_display.cpp: frame->parent_arrow_->getSceneNode()->setVisible( false );
./src/rviz/default_plugin/tf_display.cpp: frame->axes_->getSceneNode()->setVisible( show_axes_property_->getBool() && frame_enabled);
./src/rviz/default_plugin/tf_display.cpp: frame->parent_arrow_->getSceneNode()->setVisible( show_arrows_property_->getBool() && frame_enabled );
./src/rviz/default_plugin/tf_display.cpp: frame->parent_arrow_->getSceneNode()->setVisible( false );
./src/rviz/default_plugin/tf_display.cpp: frame->parent_arrow_->getSceneNode()->setVisible( false );
./src/rviz/default_plugin/tf_display.cpp: frame->parent_arrow_->getSceneNode()->setVisible( false );
./src/rviz/default_plugin/tf_display.cpp: axes_->getSceneNode()->setVisible( display_->show_axes_property_->getBool() && enabled );
./src/rviz/default_plugin/tf_display.cpp: parent_arrow_->getSceneNode()->setVisible( display_->show_arrows_property_->getBool() && enabled );
./src/rviz/default_plugin/tf_display.cpp: parent_arrow_->getSceneNode()->setVisible( false );
./src/rviz/default_plugin/view_controllers/third_person_follower_view_controller.h: virtual void updateTargetSceneNode();
./src/rviz/default_plugin/view_controllers/third_person_follower_view_controller.cpp:void ThirdPersonFollowerViewController::updateTargetSceneNode()
./src/rviz/default_plugin/odometry_display.cpp: (*it)->getSceneNode()->setVisible( use_arrow );
./src/rviz/default_plugin/odometry_display.cpp: (*it_axes)->getSceneNode()->setVisible( !use_arrow );
./src/rviz/default_plugin/odometry_display.cpp: arrow->getSceneNode()->setVisible( use_arrow );
./src/rviz/default_plugin/odometry_display.cpp: axes->getSceneNode()->setVisible( !use_arrow );
./src/rviz/default_plugin/interactive_marker_display.cpp: int_marker_entry = im_map.insert( std::make_pair(marker.name, IMPtr ( new InteractiveMarker(getSceneNode(), context_) ) ) ).first;
./src/rviz/default_plugin/tools/pose_tool.cpp: arrow_->getSceneNode()->setVisible( false );
./src/rviz/default_plugin/tools/pose_tool.cpp: arrow_->getSceneNode()->setVisible( false );
./src/rviz/default_plugin/tools/pose_tool.cpp: arrow_->getSceneNode()->setVisible( true );
./src/rviz/default_plugin/markers/arrow_marker.cpp: handler_->addTrackedObjects( arrow_->getSceneNode() );
./src/rviz/default_plugin/markers/line_strip_marker.cpp: handler_->addTrackedObjects( lines_->getSceneNode() );
./src/rviz/default_plugin/markers/line_list_marker.cpp: handler_->addTrackedObjects( lines_->getSceneNode() );
./src/rviz/default_plugin/grid_display.cpp: grid_->getSceneNode()->setVisible( false );
./src/rviz/default_plugin/grid_display.cpp: grid_->getSceneNode()->setPosition( offset_property_->getVector() );
./src/rviz/default_plugin/grid_display.cpp: grid_->getSceneNode()->setOrientation( orient );
./src/rviz/default_plugin/interactive_markers/interactive_marker.cpp: axes_->getSceneNode()->setVisible( show );
./src/rviz/default_plugin/pose_display.cpp: coll_handler_->addTrackedObjects( arrow_->getSceneNode() );
./src/rviz/default_plugin/pose_display.cpp: coll_handler_->addTrackedObjects( axes_->getSceneNode() );
./src/rviz/default_plugin/pose_display.cpp: arrow_->getSceneNode()->setVisible( false );
./src/rviz/default_plugin/pose_display.cpp: axes_->getSceneNode()->setVisible( false );
./src/rviz/default_plugin/pose_display.cpp: arrow_->getSceneNode()->setVisible( use_arrow );
./src/rviz/default_plugin/pose_display.cpp: axes_->getSceneNode()->setVisible( !use_arrow );
./src/rviz/frame_position_tracking_view_controller.cpp: updateTargetSceneNode();
./src/rviz/frame_position_tracking_view_controller.cpp: updateTargetSceneNode();
./src/rviz/frame_position_tracking_view_controller.cpp: updateTargetSceneNode();
./src/rviz/frame_position_tracking_view_controller.cpp:void FramePositionTrackingViewController::updateTargetSceneNode()
./src/rviz/robot/robot_joint.cpp: axes_->getSceneNode()->setVisible( getEnabled() );
./src/rviz/robot/robot_joint.cpp: axis_->getSceneNode()->setVisible( getEnabled() );
./src/rviz/robot/robot_link.cpp: link_->axes_->getSceneNode()->setVisible( false );
./src/rviz/robot/robot_link.cpp: axes_->getSceneNode()->setVisible( enabled && robot_->isVisible() );
./src/rviz/robot/robot_link.cpp: axes_->getSceneNode()->setVisible( getEnabled() );
./src/rviz/ogre_helpers/arrow.h: Ogre::SceneNode* getSceneNode() { return scene_node_; }
./src/rviz/ogre_helpers/axes.h: Ogre::SceneNode* getSceneNode() { return scene_node_; }
./src/rviz/ogre_helpers/grid.h: Ogre::SceneNode* getSceneNode() { return scene_node_; }
./src/rviz/ogre_helpers/billboard_line.h: Ogre::SceneNode* getSceneNode() { return scene_node_; }
No single name given. If I check the OGRE code for 1.9.1 (which runs on my current ubuntu 16.04 box), the same function does not check for empty name: https://github.com/OGRECave/ogre/blob/v1.9.1/OgreMain/src/OgreSceneManager.cpp#L913-L925
Apparently there is a macro OGRE_NODE_STORAGE_LEGACY
to enable the old behaviour.
To be continued... (Damn I was so happy to have Rviz compiled!)
Edit: Yeah, the ebuild contains explicitly:
https://gitweb.gentoo.org/repo/gentoo.git/tree/dev-games/ogre/ogre-1.10.12.ebuild#n96
-DOGRE_NODE_STORAGE_LEGACY=no
Given I have no clue where to start adding a name to put in those 65 instances of getSceneNode, I'm gonna try to build it with that flag to yes.
That seemed to overcome that problem... for a very short time. Now I got a segmentation fault, here in gdb with the backtrace:
Thread 1 "rviz" received signal SIGSEGV, Segmentation fault.
0xf70fc318 in std::char_traits<char>::copy (__n=<optimized out>, __s2=<optimized out>,
__s1=<optimized out>)
at /tmp/gentoo/var/tmp/portage/sys-devel/gcc-8.2.0-r5/work/build/i686-pc-linux-gnu/libstdc++-v3/include/bits/char_traits.h:350
350 /tmp/gentoo/var/tmp/portage/sys-devel/gcc-8.2.0-r5/work/build/i686-pc-linux-gnu/libstdc++-v3/include/bits/char_traits.h: No such file or directory.
(gdb) bt
#0 0xf70fc318 in std::char_traits<char>::copy (__n=<optimized out>, __s2=<optimized out>,
__s1=<optimized out>)
at /tmp/gentoo/var/tmp/portage/sys-devel/gcc-8.2.0-r5/work/build/i686-pc-linux-gnu/libstdc++-v3/include/bits/char_traits.h:350
#1 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_copy (
__n=<optimized out>, __s=<optimized out>, __d=<optimized out>)
at /tmp/gentoo/var/tmp/portage/sys-devel/gcc-8.2.0-r5/work/build/i686-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.h:340
#2 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_append
(this=<optimized out>, __s=<optimized out>, __n=<optimized out>)
at /tmp/gentoo/var/tmp/portage/sys-devel/gcc-8.2.0-r5/work/build/i686-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.tcc:367
#3 0xf7e5e45b in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
from /tmp/gentoo/opt/ros/kinetic/lib/librviz.so
#4 0xf674d775 in Ogre::SceneManager::getSceneNode(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const ()
from /tmp/gentoo/usr/lib/libOgreMain.so.1.10.12
#5 0xf2b11cce in Ogre::OctreeSceneManager::destroySceneNode(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()
from /tmp/gentoo/usr/lib/OGRE/Plugin_OctreeSceneManager.so.1.10.12
#6 0xf7ec8cc5 in rviz::Shape::~Shape() () from /tmp/gentoo/opt/ros/kinetic/lib/librviz.so
#7 0xf7ec8df2 in rviz::Shape::~Shape() () from /tmp/gentoo/opt/ros/kinetic/lib/librviz.so
#8 0xf7eafcec in rviz::Arrow::~Arrow() () from /tmp/gentoo/opt/ros/kinetic/lib/librviz.so
#9 0xf7eafda2 in rviz::Arrow::~Arrow() () from /tmp/gentoo/opt/ros/kinetic/lib/librviz.so
Oops ignore my last comment. I forgot to re-compile rviz.
Now, observe this beauty:
It works!
@allenh1 How do we approach this?
Right now I'm just doing:
echo ">=dev-games/ogre-1.10.12 experimental" >> $EPREFIX/etc/portage/package.use
sed -i 's/-DOGRE_NODE_STORAGE_LEGACY=no/-DOGRE_NODE_STORAGE_LEGACY=yes/g' $EPREFIX/usr/portage/dev-games/ogre/ogre-1.10.12.ebuild
ebuild $EPREFIX/usr/portage/dev-games/ogre/ogre-1.10.12.ebuild manifest
emerge dev-games/ogre
In my docker image. Which is far from elegant. Where do we patch ogre for this? Do we bring it into ros-overlay
? Do we ask the maintainers to add a USE flag?
I'm not sure... I didn't have to do any of that, actually. This could be a prefix thing. It works just fine as-is with my patch for it. Is this with or without that, btw?
@allenh1 with your patch for rviz applied. How can it not happen to you? are you sure you are using the latest version of Ogre and rviz freshly recompiled? If you check the source code... there is no way it does not happen to you without adding -DOGRE_NODE_STORAGE_LEGACY=no
.
there is no way it does not happen to you without adding -DOGRE_NODE_STORAGE_LEGACY=no.
You're gonna laugh. I sourced the wrong ROS workspace -___-
I'm going to add an ebuild for that version of OGRE to the ROS-Overlay in a moment. I'm adding a USE
flag for it, naming it legacy-node-storage
.
I'm also assuming you meant to write -DOGRE_NODE_STORAGE_LEGACY=yes
.
equery uses ogre::ros-overlay
[ Legend : U - final flag setting for installation]
[ : I - package is installed with flag ]
[ Colors : set, unset ]
* Found these USE flags for dev-games/ogre-1.10.12:
U I
+ + cache : Enable GL state cache support
- - cg : NVIDIA toolkit plugin
- - doc : Add extra documentation (API, Javadoc, etc). It is
recommended to enable per package instead of
globally
- - double-precision : More precise calculations at the expense of speed
- - egl : Use egl instead of glx
- - examples : Install examples, usually source code
- - experimental : Build experimental BETA component 'HLMS'
+ + freeimage : Support images via media-libs/freeimage
- - gles2 : (Restricted to >dev-games/ogre-1.10)
Build OpenGL ES 2.x RenderSystem plus ES 3.x
features if available.
+ - legacy-node-storage : Enables Legacy node storage (see https://github.com/
ros/ros-overlay/issues/723#issuecomment-449163132).
+ + opengl : Add support for OpenGL (3D graphics)
- - profile : Add support for software performance analysis (will
likely vary from ebuild to ebuild)
- - resman-pedantic : Resource Manager PEDANTIC : require an explicit
resource group. Case sensitive lookup. Some demos
might not work with this setting. (default:
case-insensitive + sensitive lookup in all groups)
- - resman-strict : Resource Manager STRICT : search in default group if
not specified otherwise. Case sensitive lookup. Some
demos might not work with this setting. (default:
case-insensitive + sensitive lookup in all groups)
- - tools : Build and install helper tools
@awesomebytes just add
# required to make RVIZ work
dev-games/ogre::ros-overlay legacy-node-storage experimental
to your /etc/portage/package.use
file and emerge dev-games/ogre::ros-overlay
.
I just got into:
Maybe related to https://github.com/ros/ros-overlay/issues/722 ?