voxl-io & I2C



  • Hello everyone,

    Currently I'm developing some software that will talk, over I2C, to a self-build powermodule with a microcontroller onboard.
    This software is a node for ros and runs in a docker.
    When it received the batterypercentage from PX4 it will start sending and receiving data to the powermodule.
    The part that receives the batterypercentage works great.

    The only problem is that I receive a linker error when I'm building the software with the I2C commands

    Error's:

    CMakeFiles/powermodule_node.dir/src/powermodule.cpp.o: In function `PowerModule::OpenI2CDevice()':
    powermodule.cpp:(.text+0xbc): undefined reference to `voxl_i2c_slave_config'
    powermodule.cpp:(.text+0xd0): undefined reference to `voxl_i2c_init'
    collect2: error: ld returned 1 exit status
    powermodule/CMakeFiles/powermodule_node.dir/build.make:165: recipe for target '/root/yoctohome/peter-dev/control/devel/lib/powermodule/powermodule_node' failed
    make[2]: *** [/root/yoctohome/peter-dev/control/devel/lib/powermodule/powermodule_node] Error 1
    CMakeFiles/Makefile2:1551: recipe for target 'powermodule/CMakeFiles/powermodule_node.dir/all' failed
    make[1]: *** [powermodule/CMakeFiles/powermodule_node.dir/all] Error 2
    Makefile:138: recipe for target 'all' failed
    make: *** [all] Error 2
    Invoking "make -j4 -l4" failed
    
    

    I already tried a lot of option.
    Some options i already did:

    • Include a lot of header and cpp files into the includes folder
    • Building the voxl_io in a docker on my pc and move the ipk to the voxl

    The hardware is a voxl_flight and I'm using the I2C port 6 (located on the J7 header)

    I don't know what to do for now so I'm searching for help. I can't find anything that helps me with my solution and the docs of modalai doesn't have a lot of information about I2C usage.

    Here a part of the code that's opening the i2c:

    int8_t PowerModule::OpenI2CDevice()
    {
        if (I2C_is_open_)
        {
            // I2C bus is already opened. Return -2
            return -2;
        }
    
        if (voxl_i2c_slave_config(I2C_bus_id_, I2C_address_, 400000, 1000) == 0)
        {
            //return -3;
        }
    
        int8_t response{0};
        response = voxl_i2c_init(I2C_bus_id_);
    
        if (response == 0)
        {
            I2C_is_open_ = true;
        }
    
        return response;
    }
    

    Thanks in advance!

    (I'm sorry for my English 😉 )


  • Dev Team

    Hi @traffic_light ,

    Are you building your application in the voxl-docker or on target (e.g. on VOXL)?

    Is it possible to post your CMakeLists.txt file here? It looks like it's failing to link to libvoxl_io.

    Here's an example file where we build some applications, one of which is an i2c tester, which may help:

    https://gitlab.com/voxl-public/core-libs/libvoxl_io/-/blob/master/lib/apps/CMakeLists.txt#L51

    (also, your English is Great!)

    Thanks!



  • Hello @modaltb ,

    Thank you for your (really fast) answer!

    I'm building it with catkin_make inside the docker image.
    Maybe I need to mount more files into the docker image?
    Currently I added some header and cpp files to the include folder inside the project.

    I'm currently not at work, it's 20:40 over here, so I can't send the makefile.
    I'll tryout your suggestion the first thing tomorrow.

    By the way: I'm sorry for posting it, atleast that's what it think, in the wrong forum part. Developing software forum was a better option 😉



  • @traffic_light (So, the makefile is a catkin makefile. A little bit different then a normal cmakelist files)



  • @modaltb my current cmake without the addition you mentioned:

    cmake_minimum_required(VERSION 2.8.3)
    project(powermodule)
    
    ## Compile as C++11, supported in ROS Kinetic and newer
    add_compile_options(-std=c++11)
    
    ## Find catkin macros and libraries
    ## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
    ## is used, also find other catkin packages
    find_package(catkin REQUIRED COMPONENTS
      roscpp
      std_msgs
    )
    
    ## System dependencies are found with CMake's conventions
    # find_package(Boost REQUIRED COMPONENTS system)
    
    
    ## Uncomment this if the package has a setup.py. This macro ensures
    ## modules and global scripts declared therein get installed
    ## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
    # catkin_python_setup()
    
    ################################################
    ## Declare ROS messages, services and actions ##
    ################################################
    
    ## To declare and build messages, services or actions from within this
    ## package, follow these steps:
    ## * Let MSG_DEP_SET be the set of packages whose message types you use in
    ##   your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
    ## * In the file package.xml:
    ##   * add a build_depend tag for "message_generation"
    ##   * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET
    ##   * If MSG_DEP_SET isn't empty the following dependency has been pulled in
    ##     but can be declared for certainty nonetheless:
    ##     * add a exec_depend tag for "message_runtime"
    ## * In this file (CMakeLists.txt):
    ##   * add "message_generation" and every package in MSG_DEP_SET to
    ##     find_package(catkin REQUIRED COMPONENTS ...)
    ##   * add "message_runtime" and every package in MSG_DEP_SET to
    ##     catkin_package(CATKIN_DEPENDS ...)
    ##   * uncomment the add_*_files sections below as needed
    ##     and list every .msg/.srv/.action file to be processed
    ##   * uncomment the generate_messages entry below
    ##   * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)
    
    ## Generate messages in the 'msg' folder
    # add_message_files(
    #   FILES
    #   Message1.msg
    #   Message2.msg
    # )
    
    ## Generate services in the 'srv' folder
    # add_service_files(
    #   FILES
    #   Service1.srv
    #   Service2.srv
    # )
    
    ## Generate actions in the 'action' folder
    # add_action_files(
    #   FILES
    #   Action1.action
    #   Action2.action
    # )
    
    ## Generate added messages and services with any dependencies listed here
    # generate_messages(
    #   DEPENDENCIES
    #   std_msgs
    # )
    
    ################################################
    ## Declare ROS dynamic reconfigure parameters ##
    ################################################
    
    ## To declare and build dynamic reconfigure parameters within this
    ## package, follow these steps:
    ## * In the file package.xml:
    ##   * add a build_depend and a exec_depend tag for "dynamic_reconfigure"
    ## * In this file (CMakeLists.txt):
    ##   * add "dynamic_reconfigure" to
    ##     find_package(catkin REQUIRED COMPONENTS ...)
    ##   * uncomment the "generate_dynamic_reconfigure_options" section below
    ##     and list every .cfg file to be processed
    
    ## Generate dynamic reconfigure parameters in the 'cfg' folder
    # generate_dynamic_reconfigure_options(
    #   cfg/DynReconf1.cfg
    #   cfg/DynReconf2.cfg
    # )
    
    ###################################
    ## catkin specific configuration ##
    ###################################
    ## The catkin_package macro generates cmake config files for your package
    ## Declare things to be passed to dependent projects
    ## INCLUDE_DIRS: uncomment this if your package contains header files
    ## LIBRARIES: libraries you create in this project that dependent projects also need
    ## CATKIN_DEPENDS: catkin_packages dependent projects also need
    ## DEPENDS: system dependencies of this project that dependent projects also need
    catkin_package(
      #INCLUDE_DIRS ../../include
      #LIBRARIES powermdole
      #CATKIN_DEPENDS roscpp std_msgs
      #DEPENDS system_lib
    )
    
    ###########
    ## Build ##
    ###########
    # DOESN'T WORK:
    #FASTRPC_STUB_GEN(../../include/io_rpc.idl)
    
    ## Specify additional locations of header files
    ## Your package locations should be listed before other locations
    include_directories(
    # include
    	${catkin_INCLUDE_DIRS}
    	include
    	./include
    	/usr/local/include
    	/usr/include
    	../../include/
    )
    
    link_directories(
    	../../include
    	/include
    	include
    	/usr/local/lib
    	/usr/lib
    )
    
    ## Declare a C++ library
    add_library(${PROJECT_NAME}
       src/${PROJECT_NAME}.cpp
    )
    
    ## Add cmake target dependencies of the library
    ## as an example, code may need to be generated before libraries
    ## either from message generation or dynamic reconfigure
    # add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
    
    ## Declare a C++ executable
    ## With catkin_make all packages are built within a single CMake context
    ## The recommended prefix ensures that target names across packages don't collide
    #add_executable (voxl_i2c  ../../include/voxl-i2c.c)
    #target_link_libraries (voxl_i2c  /usr/lib/voxl_io)
    
    add_executable(${PROJECT_NAME}_node 
       src/main.cpp
       src/powermodule.cpp
       ../../include/colorprinting.cpp
    )
    
    ## Rename C++ executable without prefix
    ## The above recommended prefix causes long target names, the following renames the
    ## target back to the shorter version for ease of user use
    ## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
    # set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")
    
    ## Add cmake target dependencies of the executable
    ## same as for the library above
    #add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
    
    
    ## Specify libraries to link a library or executable target against
    target_link_libraries(${PROJECT_NAME}_node
    ${catkin_LIBRARIES}
    /usr/local/lib/
    # /usr/lib/aarch64-linux-gnu/libi2c.so
    #/usr/lib/rfsa/adsp/libio_rpc.so
    #/usr/lib/rfsa/adsp/libio_rpc_skel.so
    #/usr/lib/libvoxl_io.so
    #/usr/lib/libvoxl_io
    )
    
    #############
    ## Install ##
    #############
    
    # all install targets should use catkin DESTINATION variables
    # See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html
    
    ## Mark executable scripts (Python etc.) for installation
    ## in contrast to setup.py, you can choose the destination
    # install(PROGRAMS
    #   scripts/my_python_script
    #   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
    # )
    
    ## Mark executables for installation
    ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html
    # install(TARGETS ${PROJECT_NAME}_node
    #   RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
    # )
    
    ## Mark libraries for installation
    ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html
    # install(TARGETS ${PROJECT_NAME}
    #   ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
    #   LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
    #   RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
    # )
    
    ## Mark cpp header files for installation
    # install(DIRECTORY include/${PROJECT_NAME}/
    #   DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
    #   FILES_MATCHING PATTERN "*.h"
    #   PATTERN ".svn" EXCLUDE
    # )
    
    ## Mark other files for installation (e.g. launch and bag files, etc.)
    # install(FILES
    #   # myfile1
    #   # myfile2
    #   DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
    # )
    
    
    #############
    ## Testing ##
    #############
    
    ## Add gtest based cpp test target and link libraries
    # catkin_add_gtest(${PROJECT_NAME}-test test/test_shutdown.cpp)
    # if(TARGET ${PROJECT_NAME}-test)
    #   target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
    # endif()
    
    ## Add folders to be run by python nosetests
    # catkin_add_nosetests(test)
    

    I think I need to figure out how I can add the IO correctly inside it.
    I'll post a new makefile when I did that.


Log in to reply