导航

    蓝鲸ROS机器人论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 热门
    1. 主页
    2. weijiz
    3. 帖子
    ROS交流群
    ROS Group
    产品服务
    Product Service
    开源代码库
    Github
    官网
    Official website
    技术交流
    Technological exchanges
    激光雷达
    LIDAR
    ROS教程
    ROS Tourials
    深度学习
    Deep Learning
    机器视觉
    Computer Vision
    • 资料
    • 关注 0
    • 粉丝 11
    • 主题 248
    • 帖子 705
    • 最佳 11
    • 群组 1

    weijiz 发布的帖子

    • 编译安装libfreenect2时错误问题

      在编译安装libfreenect2时出现如下的错误

      -- using tinythread as threading library
      -- Checking for module 'libusb-1.0>=1.0.20'
      --   
      CMake Error at /usr/share/cmake-3.5/Modules/FindPkgConfig.cmake:367 (message):
        A required package was not found
      Call Stack (most recent call first):
        /usr/share/cmake-3.5/Modules/FindPkgConfig.cmake:532 (_pkg_check_modules_internal)
        cmake_modules/FindLibUSB.cmake:21 (PKG_CHECK_MODULES)
        CMakeLists.txt:93 (FIND_PACKAGE)
      

      这个错误来自于libusb,但是我已经按照说明安装了libusb,即执行下面的指令

      sudo apt-get install libusb-1.0-0-dev
      

      然后我又重新源码安装了最新的libusb,发现还是不行.
      最后就把libfreenect2/cmake_modules/FindLibUSB.cmake中的几行注释掉,感觉是在用pkg-config来找库的时候module的名字错了

      # - Find libusb for portable USB support
      # 
      # If the LibUSB_ROOT environment variable
      # is defined, it will be used as base path.
      # The following standard variables get defined:
      #  LibUSB_FOUND:    true if LibUSB was found
      #  LibUSB_INCLUDE_DIR: the directory that contains the include file
      #  LibUSB_LIBRARIES:  the libraries
      
      IF(PKG_CONFIG_FOUND)
        IF(DEPENDS_DIR) #Otherwise use System pkg-config path
          SET(ENV{PKG_CONFIG_PATH} "$ENV{PKG_CONFIG_PATH}:${DEPENDS_DIR}/libusb/lib/pkgconfig")
        ENDIF()
        SET(MODULE "libusb-1.0")
        #把下面的几行注释掉  
        #IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
        #  SET(MODULE "libusb-1.0>=1.0.20")
        #ENDIF()
        IF(LibUSB_FIND_REQUIRED)
          SET(LibUSB_REQUIRED "REQUIRED")
        ENDIF()
      

      这样在安装说明文件的方法make就可以了

      发布在 技术交流
      weijiz
      weijiz
    • iai_kinect2 catkin make错误问题

      在执行catkin_make之后iai_kinect2报错

      /home/rshanor/catkin_ws/src/iai_kinect2/kinect2_bridge/src/kinect2_bridge.cpp: In member function ‘void Kinect2Bridge::initConfig(bool, bool, double, double)’:
      /home/rshanor/catkin_ws/src/iai_kinect2/kinect2_bridge/src/kinect2_bridge.cpp:400:5: error: ‘Config’ is not a member of ‘libfreenect2::Freenect2Device’
      libfreenect2::Freenect2Device::Config config;
      ^
      /home/rshanor/catkin_ws/src/iai_kinect2/kinect2_bridge/src/kinect2_bridge.cpp:400:43: error: expected ‘;’ before ‘config’
      libfreenect2::Freenect2Device::Config config;
      ^
      /home/rshanor/catkin_ws/src/iai_kinect2/kinect2_bridge/src/kinect2_bridge.cpp:401:5: error: ‘config’ was not declared in this scope
      config.EnableBilateralFilter = bilateral_filter;
      ^
      /home/rshanor/catkin_ws/src/iai_kinect2/kinect2_bridge/src/kinect2_bridge.cpp:405:13: error: ‘class libfreenect2::Freenect2Device’ has no member named ‘setConfiguration’
      device->setConfiguration(config);
      ^
      /home/rshanor/catkin_ws/src/iai_kinect2/kinect2_bridge/src/kinect2_bridge.cpp: In member function ‘void Kinect2Bridge::initConfig(bool, bool, double, double)’:
      /home/rshanor/catkin_ws/src/iai_kinect2/kinect2_bridge/src/kinect2_bridge.cpp:400:5: error: ‘Config’ is not a member of ‘libfreenect2::Freenect2Device’
      libfreenect2::Freenect2Device::Config config;
      ^
      /home/rshanor/catkin_ws/src/iai_kinect2/kinect2_bridge/src/kinect2_bridge.cpp:400:43: error: expected ‘;’ before ‘config’
      libfreenect2::Freenect2Device::Config config;
      ^
      /home/rshanor/catkin_ws/src/iai_kinect2/kinect2_bridge/src/kinect2_bridge.cpp:401:5: error: ‘config’ was not declared in this scope
      config.EnableBilateralFilter = bilateral_filter;
      ^
      /home/rshanor/catkin_ws/src/iai_kinect2/kinect2_bridge/src/kinect2_bridge.cpp:405:13: error: ‘class libfreenect2::Freenect2Device’ has no member named ‘setConfiguration’
      device->setConfiguration(config);
      

      解决这个问题安装最新的libfreenect2就可以了。

      发布在 技术交流
      weijiz
      weijiz
    • iai_kinect2 ros kinetic下编译错误的问题

      在ROS kinetic 版本下编译iai_kinect2会存在下面的错误

      /opt/ros/kinetic/include/opencv-3.2.0-dev/opencv2/flann/saving.h:113:63: error: exception handling disabled, use -fexceptions to enable
      throw FLANNException("Invalid index file, cannot read");
      

      出现这个问题的原因是kinetic版本默认使用的OpenCV-3.2。有一个编译选项在以前版本是没问题的,在OpenCV-3.2就有点问题。这就是-fexceptions

      解决方法

      把 iai_kinect2/kinect2_registration/CMakeLists.txt的66行删掉

      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-exceptions")
      

      在官方的源上已经有人提出了这个pull request, 然而官方还没有merge进去。希望以后能解决这个问题吧。

      发布在 技术交流
      weijiz
      weijiz
    • 在Ubuntu中使用zsh

      zsh是一个shell环境,不过和一般使用的bash shell不同,zsh的交互性更强也更人性化。(bash还有一些莫名其妙的bug)
      下面介绍一下怎么在Ubuntu中安装和使用zsh。

      安装

      sudo apt-get update
      sudo apt-get install zsh
      # 下面是把系统默认的shell换成zsh, 重启后生效
      command -v zsh | sudo tee -a /etc/shells
      chsh -s `which zsh`
      

      安装 on-my-zsh,这个是zsh的一个插件库,包含各种常用的插件和主题。详情可以看这里

      wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | zsh
      

      环境变量的的设置

      在bash 中一般会有很多环境变量,如果这些变量没有在zsh中设置的话就会导致各种程序的错误。
      一般bash的环境变量在.bashrc中

      source /opt/ros/kinetic/setup.bash
      export PATH=/home/randoms/Programs/android-sdk-linux/platform-tools:$PATH
      export PATH=$PATH:/usr/local/go/bin
      export GOPATH=$HOME/.go
      export PATH=$GOPATH/bin:$PATH
      source /home/randoms/Documents/ros/workspace/devel/setup.sh
      export ROS_PACKAGE_PATH=/home/randoms/Documents/ros/workspace/src:/home/randoms/Documents/ros/workspace/src/ORB_SLAM2/Examples/ROS:$ROS_PACKAGE_PATH
      export BUP_DIR=/home/randoms/backup/bup
      ulimit -c unlimited
      

      比如这是我的一些的环境变量的设置
      基本上直接复制到.zshrc文件里面就可以了。需要注意的是source指令。zsh中没办法source bash的文件。

      source xxx.sh
      # 更改为,这实际上是开了一个sh的模拟器去解释执行bash指令
      emulate sh -c 'source xxx.sh'
      

      对应上面的内容更改为

      emulate sh -c 'source /opt/ros/kinetic/setup.sh'
      export PATH=/home/randoms/Programs/android-sdk-linux/platform-tools:$PATH
      export PATH=$PATH:/usr/local/go/bin
      export GOPATH=$HOME/.go
      export PATH=$GOPATH/bin:/home/randoms/Documents/SharpLink/SharpLink/bin/Debug:$PATH
      emulate sh -c 'source /home/randoms/Documents/ros/workspace/devel/setup.sh'
      export ROS_PACKAGE_PATH=/home/randoms/Documents/ros/workspace/src:/home/randoms/Documents/ros/workspace/src/ORB_SLAM2/Examples/ROS:$ROS_PACKAGE_PATH
      export BUP_DIR=/home/randoms/backup/bup
      ulimit -c unlimited
      

      这样就可以了。
      下面来一个zsh的截图
      0_1492755121711_Screenshot from 2017-04-21 14-11-46.png

      Updata:
      对于ROS的source脚本并不能完全这样设置。这样设置后有些指令不能使用。发现ROS默认是提供了setup.zsh的脚本的
      所以上面的配置可以变成这样

      . /opt/ros/kinetic/setup.zsh
      export PATH=/home/randoms/Programs/android-sdk-linux/platform-tools:$PATH
      export PATH=$PATH:/usr/local/go/bin
      export GOPATH=$HOME/.go
      export PATH=$GOPATH/bin:/home/randoms/Documents/SharpLink/SharpLink/bin/Debug:$PATH
      #emulate sh -c 'source /home/randoms/Documents/ros/workspace/devel/setup.sh'
      . /home/randoms/Documents/ros/workspace/devel/setup.zsh
      export ROS_PACKAGE_PATH=/home/randoms/Documents/ros/workspace/src:/home/randoms/Documents/ros/workspace/src/ORB_SLAM2/Examples/ROS:$ROS_PACKAGE_PATH
      export BUP_DIR=/home/randoms/backup/bup
      ulimit -c unlimited
      

      这样就一切正常了。

      发布在 技术交流
      weijiz
      weijiz
    • Linux常见编译系统总结

      在Linux系统中经常会遇到各种编译程序的方法。很多情况下我们只知道这样做而不知道为什么这样做。这篇文章就通过一个简单的hello world程序来通过不同的编译方式进行编译。让大家了解一下比较常见的各种编译系统。编译过程最重要的地方就是指定头文件和链接库的位置。主要问题在于软件的模块化和依赖关系。所以不同的编译系统采用了不同的方式进行管理。

      cmake

      cmake是一个很常用的编译系统。通过它可以方便的配置程序的各种编译参数。具体的介绍可以看这篇文章。
      下面是一个具体的例子
      创建一个CMakeLists.txt文件,文件内容如下

      cmake_minimum_required(VERSION 2.8.3)
      
      project(helloworld)
      
      add_executable(helloworld
        main.c
      )
      

      创建一个叫做main.c的文件,文件内容如下

      #include <stdio.h>
      
      int main(void){
          printf("hello world!\n");
      }
      

      编译过程

      mkdir build
      cd build
      cmake ..
      make
      

      文件夹内容如下
      0_1492224768568_Screenshot from 2017-04-15 10-52-17.png
      执行结果
      0_1492224801960_Screenshot from 2017-04-15 10-53-14.png
      程序说明
      这个一个简单的CMakeLists.txt文件,没有涉及到软件依赖的问题。CMake的强大之处就是其软件包管理能力。具体的使用方法可以看这篇文章

      autotools

      在Linux中使用源码编译程序中经常会有这个过程

      ./configure
      make
      make install
      

      这种方式使用的就是autotools
      还是以一个hello world为例。创建一个configure.ac文件,文件内容入下

      AC_INIT([helloworld], [0.1], [george@thoughtbot.com]) # 指定项目名称, 版本号, 项目管理人员
      AM_INIT_AUTOMAKE # 初始化
      AC_PROG_CC  # 检查C的环境依赖
      AC_CONFIG_FILES([Makefile]) # 指定Make File
      AC_OUTPUT # 生成脚本
      

      创建一个Makefile.am,文件内容如下

      AUTOMAKE_OPTIONS = foreign  # 说明这是一个foreign的程序
      bin_PROGRAMS = helloworld  # 生成文件的名称
      helloworld_SOURCES = main.c # 指定源文件
      

      然后执行下面的指令进行编译

      aclocal # Set up an m4 environment
      autoconf # Generate configure from configure.ac
      automake --add-missing # Generate Makefile.in from Makefile.am
      ./configure # Generate Makefile from Makefile.in
      make distcheck # Use Makefile to build and test a tarball to distribute
      

      这时候可以看到一个helloworld-0.1.tar.gz的文件。这个就是最终生成的发行版本。解压后就可以按照正常的编译过程进行编译。

      程序说明
      configure.ac文件是autoconf工具的配置文件,用于生成最后的configure文件 . Makefile.am用于生成makefile。具体的使用方法可以看这篇文章

      pkg-config

      pkg-config不是一个完整的编译系统,只是一个编译工具,可以方便的给程序指cflags。下面是一个例子
      假设系统中安装了OpenCV库

      pkg-config opencv-3.2.0-dev --cflags
      终端输出
      -I/opt/ros/kinetic/include/opencv-3.2.0-dev/opencv -I/opt/ros/kinetic/include/opencv-3.2.0-dev
      
      pkg-config opencv-3.2.0-dev --libs
      终端输出
      -L/opt/ros/kinetic/lib -lopencv_stitching3 -lopencv_superres3 -lopencv_videostab3 -lopencv_aruco3 -lopencv_bgsegm3 -lopencv_bioinspired3 -lopencv_ccalib3 -lopencv_cvv3 -lopencv_datasets3 -lopencv_dpm3 -lopencv_face3 -lopencv_fuzzy3 -lopencv_hdf3 -lopencv_line_descriptor3 -lopencv_optflow3 -lopencv_plot3 -lopencv_reg3 -lopencv_saliency3 -lopencv_stereo3 -lopencv_structured_light3 -lopencv_phase_unwrapping3 -lopencv_rgbd3 -lopencv_viz3 -lopencv_surface_matching3 -lopencv_text3 -lopencv_xfeatures2d3 -lopencv_shape3 -lopencv_video3 -lopencv_ximgproc3 -lopencv_calib3d3 -lopencv_features2d3 -lopencv_flann3 -lopencv_xobjdetect3 -lopencv_objdetect3 -lopencv_ml3 -lopencv_xphoto3 -lopencv_highgui3 -lopencv_videoio3 -lopencv_imgcodecs3 -lopencv_photo3 -lopencv_imgproc3 -lopencv_core3
      

      编译的时候就不用手动指定库了。pkg-config的配置文件在/usr/lib/pkgconfig, 可以在这里看到每个软件包的信息。

      发布在 技术交流
      weijiz
      weijiz
    • catkin_make的时候发生了什么

      这是一个比较复杂的问题,但是有时候会有莫名其妙的编译错误,在找错误的过程中会非常需要了解这个过程。

      首先说一下.in文件。在catkin的目录中有许多.in文件
      0_1492173921785_Screenshot from 2017-04-14 20-45-12.png
      这些都是模板文件,以/opt/ros/kinetic/share/catkin/cmake/templates/env.sh.in为例
      下面是源文件

      #!/usr/bin/env sh
      # generated from catkin/cmake/templates/env.sh.in
      
      if [ $# -eq 0 ] ; then
        /bin/echo "Usage: env.sh COMMANDS"
        /bin/echo "Calling env.sh without arguments is not supported anymore. Instead spawn a subshell and source a setup file manually."
        exit 1
      fi
      
      # ensure to not use different shell type which was set before
      CATKIN_SHELL=sh
      
      # source @SETUP_FILENAME@.sh from same directory as this file
      _CATKIN_SETUP_DIR=$(cd "`dirname "$0"`" > /dev/null && pwd)
      . "$_CATKIN_SETUP_DIR/@SETUP_FILENAME@.sh"
      exec "$@"
      
      

      这个是生成后的文件

      #!/usr/bin/env sh
      # generated from catkin/cmake/templates/env.sh.in
      
      if [ $# -eq 0 ] ; then
        /bin/echo "Usage: env.sh COMMANDS"
        /bin/echo "Calling env.sh without arguments is not supported anymore. Instead spawn a subshell and source a setup file manually."
        exit 1
      fi
      
      # ensure to not use different shell type which was set before
      CATKIN_SHELL=sh
      
      # source setup.sh from same directory as this file
      _CATKIN_SETUP_DIR=$(cd "`dirname "$0"`" > /dev/null && pwd)
      . "$_CATKIN_SETUP_DIR/setup.sh"
      exec "$@
      

      可以看出源文件中的@parameter@都被替换成了实际的参数。通过调用源文件加上对应的参数就可以生成不同的目标文件了。每个ROS的软件包都要通过这种方式生成对应的xxxConfig.cmake等文件。

      下面开始说大致的过程

      catkin_make 实际和下面的指令是等效的

      $ cd ~/catkin_ws
      $ cd src
      $ catkin_init_workspace
      $ cd ..
      $ mkdir build
      $ cd build
      $ cmake ../src -DCMAKE_INSTALL_PREFIX=../install -DCATKIN_DEVEL_PREFIX=../devel
      $ make
      

      所以最先被编译的是那个在src下的公用的CMakeList.txt文件
      这个文件的大部分内容都是在找catkin这个包的位置。最后执行一个cmake函数catkin_workspace。这个函数在/opt/ros/kinetic/share/catkin/cmake/catkin_workspace.cmake文件中定义。这个函数对catkin_make执行时的参数进行解析,比如CATKIN_WHITELIST_PACKAGES。然后开始遍历工作空间中的文件夹,如果文件夹中有package.xml文件就将其当作一个软件包。同时对每个软件包调用add_subdirectory。add_subdirectory是一个cmake的内置函数,会调用这个文件夹内的CMakeList.txt文件。这样就开始了每个软件包的编译了。

      所以如果你的catkin_make本身出了问题就要在这个过程中去Debug。

      下面说说每个软件包的编译过程。以geometry2/tf2_geometry_msgs这个包为例
      其CMakeList.txt文件如下

      cmake_minimum_required(VERSION 2.8.3)
      project(tf2_geometry_msgs)
      
      find_package(orocos_kdl)
      find_package(catkin REQUIRED COMPONENTS geometry_msgs tf2_ros tf2)
      find_package(Boost COMPONENTS thread REQUIRED)
      
      # Issue #53
      find_library(KDL_LIBRARY REQUIRED NAMES orocos-kdl HINTS ${orocos_kdl_LIBRARY_DIRS})
      
      catkin_package(
         LIBRARIES ${KDL_LIBRARY}
         INCLUDE_DIRS include
         DEPENDS orocos_kdl
         CATKIN_DEPENDS  geometry_msgs tf2_ros tf2)
      
      include_directories(include
                          ${catkin_INCLUDE_DIRS}
      )
      
      link_directories(${orocos_kdl_LIBRARY_DIRS})
      
      
      
      install(DIRECTORY include/${PROJECT_NAME}/
        DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
      )
      catkin_python_setup()
      
      if(CATKIN_ENABLE_TESTING)
      
      find_package(catkin REQUIRED COMPONENTS geometry_msgs rostest tf2_ros tf2)
      
      add_executable(test_geometry_msgs EXCLUDE_FROM_ALL test/test_tf2_geometry_msgs.cpp)
      target_link_libraries(test_geometry_msgs ${catkin_LIBRARIES} ${GTEST_LIBRARIES} ${orocos_kdl_LIBRARIES})
      add_rostest(${CMAKE_CURRENT_SOURCE_DIR}/test/test.launch)
      add_rostest(${CMAKE_CURRENT_SOURCE_DIR}/test/test_python.launch)
      
      
      if(TARGET tests)
        add_dependencies(tests test_geometry_msgs)
      endif()
      
      endif()
      

      首先是指明cmake版本,项目名称,软件包依赖之类的常见操作。然后执行了catkin_package这个函数。这个函数做了大量的工作。catkin_package在/opt/ros/kinetic/share/catkin/cmake/catkin_package.cmake文件中定义。devel和build文件夹内的内容基本都是由其生成的。
      这个函数解析package.xml文件,提取出里面的参数,由这些参数给find_package和pkg-config生成对应的配置文件。这样其他的对这个软件包有依赖的程序就可以方便的使用了。

      所以需要重点分析的就是catkin_package这个函数。
      对于编译程序最重要的就是头文件的位置和链接库的位置。也就是include directory 和 library directory。这个函数就是在为软件包配置这些参数。它自动的根据依赖关系把依赖的程序的头文件和链接库目录加入到当前的变量中。然后根据这些参数和对应的模板文件生成对应的配置文件。比如根据/opt/ros/kinetic/share/catkin/cmake/templates/pkgConfig.cmake.in生成软件包的pkgConfig.cmake文件。这样这个软件包就可以被其他的软件包用find_package找到。

      如果在编译过程中发现有软件包的路径出了问题,那么就要在这个过程去debug。很有可能是生产pkgConfig.cmake时的参数不对。最终可能是依赖包中的软件包路径问题(有挺多的ros软件包都是把路径写死的,这样很不好)。

      由catkin_package生成的文件最终会被安装到devel和build文件夹下。下面就具体看一下生成了哪些文件。
      下面是一个一般的devel的文件结构。devel是develop的缩写,所以这就是开发环境。
      0_1492221561279_Screenshot from 2017-04-15 09-59-11.png
      bin内是被编译的可执行文件。lib是pkg.pc文件和python的库文件。pkg.pc是pkg-config的配置文件(关于pkg-config可以看另外一篇帖子)。 include用来放置头文件。 share是放置生成的pkgConfig.cmake文件的,在cmake文件中find_package就会用到这些文件。下面是其中的一个例子。
      0_1492221851390_Screenshot from 2017-04-15 10-04-03.png
      对于build文件夹,生成是一些编译中的中间文件,比如用来存储一些环境变量之类的文件。这个文件夹意义不大。
      如果你在编译过程中出现问题可以去看build文件夹中各种文件内部的参数,可以方便的定位到可能出现问题的位置。

      总结一下整个编译的过程

      1. 执行catkin_make
      2. 执行catkin_workspace。解析catkin_make的参数同时遍历整个工作空间把所有的有package.xml的文件夹添加进软件包列表里面。对每个软件包执行add_subdirectory
      3. 执行每个软件包内部的CMakeList.txt文件。
      4. 执行 catkin_package。解析package.xml文件,载入对应的参数。根据依赖参数,载入对应的软件包参数。根据载入参数生成当前软件包的配置文件。
      发布在 技术交流
      weijiz
      weijiz
    • 在ROS使用自己安装的eigen时的cmake错误

      在我在自己的ROS系统中安装最新的eigen后,在自己的工作空间执行catkin_make后出现了如下的错误

      CMake Error at /opt/ros/kinetic/share/eigen_conversions/cmake/eigen_conversionsConfig.cmake:106 (message):
        Project 'eigen_conversions' specifies '/usr/include/eigen3' as an include
        dir, which is not found.  It does neither exist as an absolute directory
        nor in '/opt/ros/kinetic//usr/include/eigen3'.  Ask the maintainer 'Tully
        Foote <tfoote@osrfoundation.org>' to fix it.
      Call Stack (most recent call first):
        /opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake:76 (find_package)
        image_pipeline/depth_image_proc/CMakeLists.txt:4 (find_package)
      
      
      -- Configuring incomplete, errors occurred!
      See also "/home/randoms/Documents/ros/workspace/build/CMakeFiles/CMakeOutput.log".
      See also "/home/randoms/Documents/ros/workspace/build/CMakeFiles/CMakeError.log".
      Makefile:3692: recipe for target 'cmake_check_build_system' failed
      make: *** [cmake_check_build_system] Error 1
      Invoking "make cmake_check_build_system" failed
      

      错误原因是CMake没有找到Eigen。我的Eigen的安装位置是/usr/local/include/eigen而ROS系统中Eigen的默认安装位置是/usr/include/eigen.很显然系统在旧的位置寻找eigen包。

      可能影响到CMake寻找软件包软件包的目录有以下几个

      /opt/ros/kinetic/share/cmake_modules/cmake/Modules # ros 系统环境的cmake_modules
      /usr/share/cmake-3.5/Modules # 系统cmake_modules, 不同版本cmake可能有些区别
      /usr/lib/cmake/eigen3 # 系统的cmake环境配置
      /usr/local/lib/cmake/eigen3 # 可能的另外一个路径
      /usr/local/share/eigen3/cmake # eigen的CMake配置文件
      

      排查后以上的几个位置的文件后发现没有对/usr/include/eigen的引用。
      当然如果你遇到这个问题,是有可能这几个文件配置有问题的。

      然后顺着catkin_make一路向下查找。终于发现了问题。
      在/opt/ros/kinetic/share/orocos_kdl这个包中orocos_kdl-config.cmake这个文件把eigen的路径写死成了/usr/include/eigen
      把文件修改成下面这样就可以了

      # - Config file for the orocos-kdl package
      # It defines the following variables
      #  orocos_kdl_INCLUDE_DIRS - include directories for Orocos KDL
      #  orocos_kdl_LIBRARIES    - libraries to link against for Orocos KDL
      #  orocos_kdl_PKGCONFIG_DIR - directory containing the .pc pkgconfig files
      
      # Compute paths
      get_filename_component(SELF_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
      find_package(Eigen3)
      set(orocos_kdl_INCLUDE_DIRS "${EIGEN3_INCLUDE_DIRS};/opt/ros/kinetic/include")
      
      if(NOT TARGET orocos-kdl)
        include("${SELF_DIR}/OrocosKDLTargets.cmake")
      endif()
      
      set(orocos_kdl_LIBRARIES orocos-kdl)
      
      # where the .pc pkgconfig files are installed
      set(orocos_kdl_PKGCONFIG_DIR "/opt/ros/kinetic/lib/pkgconfig")
      

      如果你也遇到类似的问题就要定位到具体的package然后找到对应的路径进行修改就可以了。

      发布在 技术交流
      weijiz
      weijiz
    • 一种压缩传输算法

      昨天在微博上看到这样的一个新闻。

      蚌埠一个工人从高空坠落身体被四根钢筋穿透。

      这句话虽然只有这么几个字但是包含的信息就非常多。从最开始说,蚌埠。这是什么?这是一个地名,包含了位置坐标信息,又可以延伸出整个城市的信息。工人这个词也包含了很多的信息。说明这个人是在那里工作的。由此也可以引申出很多内容。这样看似简单的一句话包含了大量的信息,显然是一种很高效的压缩算法。

      然而并不是所有人都能够理解这么一句话的意思,你对一个外国人说这句话他显然就是无法理解的。所以理解的基础在于字典。什么是字典呢,就是词和实际含义之间的映射关系。由此我想到了一种很高效的压缩数据传输算法。基本过程如下。

      首先发送者分析要发送的数据,从中提取出重复出现的部分,将其用简短的数据替代。最后形成一个简短字符和实际数据的映射,也就是一个字典。把数据用字典的形式表达出来。以实际数据为例

      原始数据
      AAAAAABBBBBBBCCCCCCCC
      字典
      AAAAAA -> $A
      BBBBBBB -> $B
      CCCCCCCC -> $C
      用字典表示后的数据
      $A$B$C
      

      这样是不是短了很多
      然后发送者把用字典表示后的数据发送给接受者。

      接收者本地维护了一份字典。他首先尝试利用自己本地的字典进行解释,如果本地有对应的解释就把对应的数据解释出来。如果没有对应的解释就向发送者询问对应的词是什么意思,然后发送者发送对应的映射关系,接受者收到后对词进行解释,同时更新本地的字典。当下次再次收到这个词的时候就可以不用询问直接解释。以实际数据为例

      接收到的原始数据
      $A$B$C
      接收者的本地字典
      $A -> AAAAAA
      $C-> CCCCCCCC
      接收者无法解释$B然后从发送者处询问$B的含义
      发送者发送$B -> BBBBBBB
      接收者对数据进行解释,得到最终的数据
      AAAAAABBBBBBBCCCCCCCC
      

      这个算法的有效性的前提条件是数据是有一定规律的,并不是完全的随机。这个也是所有的压缩算法能够有效的条件。

      具体的实现还是有一些问题,希望以后能把它实现出来吧。比如字典的提取应该是在多大的范围上,字典的范围肯定是会影响整个压缩结果的。字典的文件大小也可能会很大。个人感觉和自相关函数是有点关系。

      发布在 杂谈
      weijiz
      weijiz
    • ros 无法创建工作空间

      在ros的工作空间中执行catkin_make出现下面的错误
      执行其他的python指令同样会有这个错误。

      from pkg_resources import load_entry_point
      File "/usr/lib/python2.7/site-packages/pkg_resources/__init__.py", line 72, in <module>
      import packaging.requirements
      File "/usr/lib/python2.7/site-packages/packaging/requirements.py", line 59, in <module>
      MARKER_EXPR = originalTextFor(MARKER_EXPR())("marker")
      TypeError: __call__() takes exactly 2 arguments (1 given)
      

      产生这个现象的原因有两个。一个是setuptool新版本有bug。执行下面的指令可以修复。

      sudo pip install setuptools==33.1.1
      #更新 在 2017.4.7 setuptools 已经修复了这个bug,可以用下面的指令升级到最新版
      python -m pip install --upgrade --force pip 
      

      另一个可能的原因是系统的python被修改了。比如默认的python改成了python3。可以通过

      python --version
      

      来看看当前的python是什么版本。如果版本被修改了就要改回来。因为对于Ubuntu系统很多系统程序使用的是python2.7。出现这个错误可能就是由于使用python3去执行python2.7的程序了。

      对于我的这个问题,最终发现是由于系统的python版本被修改导致的,系统的python被pyenv修改成了3.5。

      解决方法

      将系统的python改为2.7,禁用pyenv之类的更改python版本的工具(这个工具会创建自己的python环境,导致之前安装的一些python包没办法使用)

      然后把setuptool设置到以前版本

      pip install setuptools==33.1.1
      
      发布在 技术交流
      weijiz
      weijiz
    • 把地球当作背景

      himawaripy 是一个更换桌面背景图片的程序,它能每隔十分钟从一个地球卫星图片服务器上下载图片,然后将其设置成桌面背景。所以基本上可以实时的考到现在地球的状态。看起来非常酷。这个卫星还是同步卫星,可以看到晨昏线是怎么移动的。

      来个截图

      0_1490924626153_Screenshot from 2017-03-31 09-43-35.png

      具体的安装方法可以看Github里面的说明。但是说明的安装方法有一个问题,就是没办法自动更新。这个是由于crontab的更换桌面任务缺少了一些环境变量。解决方法如下
      创建一个叫做start.sh的文件,我就在himawaripy中创建了这个文件。我的路径是/home/randoms/Documents/himawaripy/start.sh

      文件内容如下

      #!/bin/bash
      # http://bit.ly/2ines3u
      
      # Wallpaper's directory.
      dir="${HOME}/.cache/himawaripy/"
      
      # export DBUS_SESSION_BUS_ADDRESS environment variable
      PID=$(pgrep gnome-session)
      export DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ | cut -d= -f2-)
      
      # Random wallpaper.
      wallpaper=`find "${dir}" -type f | shuf -n1`
      
      # Change wallpaper.
      # http://bit.ly/HYEU9H
      gsettings set org.gnome.desktop.background picture-options "spanned"
      gsettings set org.gnome.desktop.background picture-uri "file://${wallpaper}"
      

      设置此文件的可执行权限

      chmod +X /home/randoms/Documents/himawaripy/start.sh
      # 别忘了换成你自己的路径
      

      设置crontab任务

      crontab -e
      # 然后添加下面的内容,换成你自己的start.sh文件路径
      */10 * * * * /home/randoms/Documents/himawaripy/start.sh
      

      这样应该一切就正常了, Enjoy it :-D.

      发布在 技术交流
      weijiz
      weijiz
    • 宇宙终极问题的答案是?

      在银河系漫游指南中,宇宙的终极问题的答案是42。

      突然想到这个问题是很有意思的。首先这个问题实际上包含了两个问题

      1. 什么是终极问题
      2. 终极问题的答案是什么

      假设存在终极问题,所谓的终极问题是什么呢,应该说是世界上最难的问题。那么刚才这个问题一定是比终极问题更难的,因为它包含了所谓的终极问题。也就是终极问题的答案是什么。

      这样我们似乎就找到了终极问题。终极问题的答案是什么
      然后这个问题的答案是什么呢?
      这是个自我涉指的问题,就是这个问题既是结果也是答案。像一条蛇咬着自己的尾巴一样。这个问题的答案可以是任意结果。因为你没办法反驳它,而且在逻辑上也是自恰的。比如假设这个问题的答案是42,在逻辑上完全没问题。

      发布在 杂谈
      weijiz
      weijiz
    • Ubuntu更新后无法显示图形界面和无法登录的问题

      有时在Ubuntu更新后我们会遇到这样的问题,比如图形界面没办法显示,用户无法登录。下面就说一下解决方法。

      无法显示图形界面

      对与无法显示图形界面基本上可以确定是和显卡驱动有关系。对于使用Nvidia或者AMD显卡的人,如果你安装了官方的闭源驱动那么基本上每次内核更新都需要重新安装一次驱动。因为驱动安装的时候要重新编译进内核,但是官方的闭源驱动在内核更新的时候不会自动编译进去。即使安装了dkms也是如此。
      对于intel集成显卡的人来说很少会遇到更新后没有图形界面的情况,如果有,那么也需要重新安装intel的显卡驱动。

      sudo apt-get install xserver-xorg-video-intel
      sudo apt-get install libva-intel-vaapi-driver vainfo
      

      无法登录进入桌面

      这个现象是在输入用户名密码之后,本应该进入桌面,但是又回到了登录界面。产生这个现象的原因可能是由于.Xauthority文件的权限问题,也有可能是由于显卡的驱动问题。

      同时按住Ctrl + Alt + F1切换至文本界面,输入用户名密码进行登录。
      输入

      ls -l .Xauthority
      

      如果输出显示这个文件是属于root,那么就是权限问题了

      sudo chown user.user .Xauthority
      

      更改用户权限就可以了。注意把user换成自己的用户名。

      如果重新尝试后还是不行,那么可以从下面几个文件中得出有用的信息

      1. /var/log/syslog
        这个文件是系统的日志文件,从里面找出对应的错误信息 和图形界面相关的一般在 gnome-session里面
      2. ~/.xsession-errors
        这个文件记录了图形界面的一些错误
      3. /var/log/Xorg.0.log
        这个是X的一些信息,属于比较底层的图形显示相关信息,如果显卡驱动有问题,基本上在这里可以看出来。

      对于磁盘空间不足也会有无法登录的问题

      发布在 技术交流
      weijiz
      weijiz
    • Ubuntu 如何设置静态IP

      在网络上搜索设置静态IP出现的都是通过修改文件进行设置的。这样的方式很容易让电脑的网络不能使用。推荐使用下面的方法进行修改

      IP分配的基本方式

      IP分配的方式一般是由路由器决定的。路由器有DHCP方式和静态IP两种方式。DHCP就是动态的分配IP方式。一般路由器默认的就是这种模式。在这种模式下电脑也可以设置自己的静态IP。当然并不能保证一定会成功,比如自己设定的IP可能被别人占用。也有可能路由器由于迷之原因不给你分配自己设定的IP。下面就具体说一下各种设置静态IP的方法。

      设置静态IP的几种方式

      1. 路由器设置法
        通过路由器设置静态IP是最简单的方法。不过前提是你要有路由器的管理权限,路由器也要支持这种设置功能。
        首先在浏览器中输入路由的地址,进入路由器的管理界面。


        0_1489368837800_Screenshot from 2017-03-13 09-32-00.png


        在应用管理中有IP和MAC绑定。不同的路由器设置界面不一样,你可以找一找这个功能的具体位置。
        0_1489369033912_Screenshot from 2017-03-13 09-34-29.png


        在这里就可以设置静态IP了


        0_1489369175968_Screenshot from 2017-03-13 09-37-48.png

      2. 在电脑上进行设置
        电脑连接上网络后,打开电脑的网络管理器
        0_1489369665979_Screenshot from 2017-03-13 09-47-40.png


        选中自己当前的网络链接,选择编辑


        0_1489369712515_Screenshot from 2017-03-13 09-48-26.png


        点击IPv4设置


        0_1489369751284_Screenshot from 2017-03-13 09-48-46.png


        按照下图这样进行设置


        0_1489369819532_Screenshot from 2017-03-13 09-50-03.png
        其中192.168.0.199是你想要设置的本机IP,要保证不能和局域网中的其他IP重复。192.168.0.1是路由器的地址,这个要根据自己的网络情况进行调整。
        设置完成后点击保存就可以了


        然后断开网络重新连接一定要重新连接后才能生效


        0_1489370023950_Screenshot from 2017-03-13 09-53-36.png


        输入ifconfig查看当前的网络信息,可以发现我的无线网络已经设置成刚才的那个IP了。

      发布在 技术交流
      weijiz
      weijiz
    • RE: 小强开发版系统镜像下载

      @咸菜 已经上传好了,最上面的链接地址就是

      发布在 产品服务
      weijiz
      weijiz
    • RE: 小强开发版系统镜像下载

      @咸菜 在 小强开发版系统镜像下载 中说:

      sda assuming drive cache write through

      好像是上传百度云的时候文件被损坏了,我又重新传了一遍。下载完成后最好做一下md5校验
      md5的值是d4495de491ee22e1f424988b67202013

      发布在 产品服务
      weijiz
      weijiz
    • RE: 小强开发版系统镜像下载

      @咸菜 注意镜像要求单独的boot分区

      发布在 产品服务
      weijiz
      weijiz
    • RE: 小强开发版系统镜像下载

      不会有问题的,不仅在虚拟机里面测试了,还在实际的电脑上安装过。你是卡在什么地方了?

      发布在 产品服务
      weijiz
      weijiz
    • 小强开发版系统镜像下载

      本教程已经过时,请看这篇文章的内容
      使用时请注意选择合适自己设备的镜像

      里面包含了jade版本的ros以及各种针对小强的配置和优化。如果系统被损坏可以尝试用此镜像还原系统。
      系统镜像
      生成于2017-3-3

      镜像使用方法

      下面以在虚拟机中如何安装此镜像为例说明镜像的使用方法。
      在虚拟机中安装小强系统镜像后,请关闭开机启动项,避免与小强冲突

      sudo service startup stop
      rosrun robot_upstart uninstall startup
      

      下载镜像

      从以上的链接中下载小强镜像。下载完成之后别忘了进行md5校验

      创建虚拟机

      0_1488973573457_Screenshot from 2017-03-08 19-44-06.png

      0_1488973590993_Screenshot from 2017-03-08 19-45-07.png

      0_1488973596897_Screenshot from 2017-03-08 19-45-16.png

      0_1488973609385_Screenshot from 2017-03-08 19-45-24.png

      0_1488973615881_Screenshot from 2017-03-08 19-45-33.png

      0_1488973624161_Screenshot from 2017-03-08 19-45-48.png

      如图所示操作依次选择。

      给虚拟机添加iso文件
      0_1488973835354_Screenshot from 2017-03-08 19-47-58.png

      0_1488973846234_Screenshot from 2017-03-08 19-48-23.png

      0_1488973858818_Screenshot from 2017-03-08 19-48-35.png

      0_1488973865514_Screenshot from 2017-03-08 19-48-45.png

      开始安装

      启动虚拟机
      0_1488973980483_Screenshot from 2017-03-08 19-52-07.png

      0_1488973989187_Screenshot from 2017-03-08 19-52-36.png

      0_1488974120772_Screenshot from 2017-03-08 19-54-06.png

      如上图类似设置,注意为了保证程序正常执行,根据系统安装位置选择对应设置
      在小强主机上操作时:用户名一定要是xiaoqiang,计算机名一定要是xiaoqiang-desktop
      在自己电脑上操作时:用户名一定要设为xiaoqiang,计算机名设为bluewhale-client

      下一步进行分区,注意勾选上Transfer user configuration and data files
      点击下一步进入分区界面。
      选中你要安装的硬盘,然后点击Delete按钮

      0_1495595742333_QQ截图20170524111500.png

      再次选择硬盘中的新分区

      0_1495595803274_QQ截图20170524111613.png

      点击箭头进入下一步

      0_1495595848336_QQ截图20170524111719.png

      再次选择刚才新建的分区
      设置右侧的Mount point,再次点击箭头进入下一步

      0_1495595948157_QQ截图20170524111846.png

      等待安装完成就可以了
      0_1488974425141_Screenshot from 2017-03-08 20-00-15.png

      安装完成之后

      安装后重启。安装完成之后可能会提示有一些错误,这是由于里面的一些残留文件导致的,可以把这些文件删除。在终端输入

      sudo rm -rf /var/crash/*
      

      然后再次重启,就可以了

      0_1488975517541_Screenshot from 2017-03-08 20-18-24.png

      在虚拟机中安装小强系统镜像的用户,请关闭开机启动项,避免与小强冲突

      sudo service startup stop
      rosrun robot_upstart uninstall startup
      

      Enjoy it 😄

      发布在 产品服务
      weijiz
      weijiz
    • 使用systemback制作Ubuntu自定义系统镜像和系统备份

      Systemback是一个Ubuntu系统中用于发布自定义系统镜像和系统备份的软件。有时候我们对自己的Ubuntu做了很多设置,比如各种软件包,各种自定义的配置。我们想要在另一台电脑上也安装一个和我们一模一样的系统,这个时候就会用到这种方法了。这个方法不仅可以用于发布系统,也可以用来作为系统备份使用。

      下面就具体介绍一下这个软件的安装和使用方法

      安装

      系统版本小于等于Ubuntu 16.04 添加下面的软件源

      sudo add-apt-repository ppa:nemh/systemback
      sudo apt-get update && sudo apt-get install systemback unionfs-fuse
      

      对应系统版本在Ubuntu 18.04及以上的时候,按照这里的说明添加软件源

      使用方法

      安装完成后在Dash菜单中就能找到这个软件了
      0_1488520081214_Screenshot from 2017-03-03 13-47-36.png

      输入管理员密码,打开后界面如下图所示
      0_1488520135916_Screenshot from 2017-03-03 13-48-49.png

      如果我们需要创建系统备份,点击Create new 就可以了。下面介绍一下自定义系统的iso文件如何制作。

      1. 点击右侧的Live system create按钮,出现界面如下图所示
        0_1488520374959_Screenshot from 2017-03-03 13-52-47.png
      2. 勾选左侧的include the user data files,这样自己主文件夹内的文件都会被包含在系统镜像中。很多相关的程序的配置文件都是保存在主文件夹内的。Working Directory是设置工作目录,程序运行时产生的临时文件都会被保存在这里。所以一定要保证这里有足够的存储空间。
      3. 点击Create New按钮就开始创建了,等待创建完成。完成后界面如下图所示
        0_1488520634884_Screenshot from 2017-03-03 13-56-48.png
        右侧的列表中就是已经创建的备份。我已经创建了两个相关的备份,所以有两个在右侧显示。此时文件没有转换成iso格式,选中你要转换的备份,点击convert to ISO 就可以开始转换了。转换完成后,在你的工作目录下就能找到生成的iso文件。
        0_1488520901942_Screenshot from 2017-03-03 14-01-33.png

      这个文件就可以用来安装系统了。同时还可以作为live系统来使用。

      发布在 技术交流
      weijiz
      weijiz
    • 小强ROS机器人教程(6)___小强图传遥控Windows客户端

      小强主页

      2017年3月份之前收到小强的用户,安装前请参考帖子升级软件包以支持小强图传遥控app

      目前Windows客户端已改为伽利略导航系统客户端,使用方法可以参照伽利略导航系统使用手册

      图传显示和控制界面
      0_1489733592032_4.png
      软件安装包下载连接
      下载后双击安装,根据提示一直点继续就可以了。

      0_1489734715833_2.png
      初次使用电脑会有如下提示,请勾选“专有网络和公用网络”后,点击选择“允许访问”
      0_1489734787099_1.png

      疑难解答

      Q: 应用启动后无法连接
      A: 可能是由于小强和你的电脑没有处在同一局域网下。也有可能是小强的服务端程序没有启动。可以输入 sudo service startup restart重启服务程序后再尝试。

      Q: 成功连接后无法遥控
      A: 检查底盘驱动程序是否正常运行。检查底盘串口USB是否正常连接。然后输入bwcheck,看看自检是否有错误输出。如果自检正常但是还是无法移动,请检查红外是否触发。触发时红外传感器会发红光。

      Q: 成功连接后没有图传视频
      A: 检查摄像头USB是否连接正常。然后重启服务后再试一次 sudo service startup restart。输入bwcheck,如果自检数据正常,此时仍然没有图像显示则说明客户端安装异常。请检查一下客户端的安装步骤。

      Q: 软件提示获取证书
      A: 由于现在的服务端已经升级成伽利略导航版本,所以使用时需要证书。小强用户可以根据提示联系客服免费获取。

      小强主页
      返回目录

      发布在 产品服务
      weijiz
      weijiz
    • 1
    • 2
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 32 / 36