ModalAI Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    voxl-io & I2C

    VOXL Flight
    2
    5
    384
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • T
      traffic_light
      last edited by traffic_light

      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 😉 )

      1 Reply Last reply Reply Quote 0
      • modaltbM
        modaltb ModalAI Team
        last edited by

        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!

        T 1 Reply Last reply Reply Quote 0
        • T
          traffic_light
          last edited by traffic_light

          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 😉

          T 1 Reply Last reply Reply Quote 0
          • T
            traffic_light @traffic_light
            last edited by

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

            1 Reply Last reply Reply Quote 0
            • T
              traffic_light @modaltb
              last edited by

              @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.

              1 Reply Last reply Reply Quote 0
              • First post
                Last post
              Powered by NodeBB | Contributors