2017-09-03 3 views
0

J'essaie d'utiliser le simulateur Kilobot Kilombo avec un package ROS. J'installe Kilombo normalement et j'essaie d'inclure le fichier d'en-tête Kilombo dans le paquet ROS. Le CMakeLists.txt de Kilombo ressemble à ceciLiaison de fichier d'en-têtes externes dans le package ROS

add_library(sim display.c skilobot.c kbapi.c params.c stateio.c runsim.c neighbors.c distribution.c gfx/SDL_framerate.c gfx/SDL_gfxPrimitives.c gfx/SDL_gfxBlitFunc.c gfx/SDL_rotozoom.c) 

add_library(headless skilobot.c kbapi.c params.c stateio.c runsim.c neighbors.c distribution.c) 
set_target_properties(headless PROPERTIES COMPILE_DEFINITIONS "SKILO_HEADLESS") 

if(CMAKE_COMPILER_IS_GNUCXX) 
    add_definitions(-std=c99) 
    add_definitions("-Wall -O2 -g") 
# add_definitions("-Wall -O3 -march=native -g") 
endif() 

INSTALL(TARGETS sim headless 
    ARCHIVE DESTINATION lib 
) 

INSTALL(FILES kilombo.h DESTINATION include) 

INSTALL(FILES kilolib.h message.h message_crc.h params.h skilobot.h 
    DESTINATION include/kilombo) 

add_subdirectory(tests) 

Le CMakeLists.txt du paquet ERO Je crée ressemble à ceci:

cmake_minimum_required(VERSION 2.8.3) 
project(Kilombo_test) 
find_package(catkin REQUIRED roscpp std_msgs) 
if(CMAKE_COMPILER_IS_GNUCXX) 
    add_definitions(-std=c99) 
    add_definitions("-Wall -O2 -g") 
endif() 
include_directories(/usr/local/include /usr/local/lib) 
link_directories(/usr/local/include) 
add_executable(generated_test orbit.c) 
target_link_libraries(generated_test ${catkin_LIBRARIES}) 

I comprennent les fichiers d'en-tête Kilombo comme normal: "#include <kilombo.h>"

Cependant, lorsque j'exécute catkin_make, j'obtiens beaucoup d'erreurs de "référence non définie". Certains de ces messages sont:

orbit.c:53 undefined reference to 'kilo_turn_left' 
orbit.c:53 undefined reference to 'set_motors' 

Ces messages sont affichés après les commandes:

#### 
#### Running command: "make -j2 -l2" in "/home/viki/catkin_ws/build" 
#### 
Linking C executable generated_test 

deux, kilo_turn_left et la fonction set_motors est définie dans "kilolib.h" qui est lui-même inclus dans « Kilombo .h ". Tout fonctionne bien si vous essayez d'exécuter la simulation normalement et non comme un paquet ROS. Le Makefile lorsque j'essaie de l'exécuter ressemble normalement à ce qui suit. J'ai enlevé les parties compilées pour le vrai bot et non pour la simulation.

SOURCES=orbit.c 
EXECUTABLE=orbit 

# path of kilombo.h distributed with the simulator but also needed 
# when compiling the user program for the real kilobot (avr-gcc has different default paths) 
SIMHEADERS=/usr/local/include 

#path to kilolib.a in the official kilolib, needed for real bots only 
KILOLIB =$(KILOHEADERS)/build/kilolib.a 

SIM_CFLAGS = -c -g -O2 -Wall -std=c99 

SIM_LFLAGS = -lsim -lSDL -lm -ljansson 
sim: $(EXECUTABLE) 
hex: $(EXECUTABLE).hex 
all: sim hex 

clean : 
    rm *.o $(EXECUTABLE) *.elf *.hex 

Cependant, lors de l'exécution d'une simulation comme un ensemble ERO, nous devons définir une CMakeLists.txt qui est ce que j'ai des ennuis avec. Qu'est-ce que je fais de mal?

+0

Il n'y a pas assez d'informations pour nous permettre d'aider. Nous avons besoin de voir (pas nécessairement tous) les messages de référence non définis. Où pensez-vous que ces noms devraient être définis? Quelle commande est exécutée lorsque les messages de référence indéfinis sont générés? –

+0

Vous devez ajouter une référence au paquet Kilombo dans CMakeLists.txt du ROS. Ou vous pouvez utiliser d'autres simulateurs comme Kelpie ou Gazebo avec ROS – Sma

+0

@JonathanLeffler J'ai ajouté plus de détails à la question. S'il vous plaît jeter un autre coup d'oeil. – Rabee

Répondre

0

Le problème était que je n'étais pas lié aux bibliothèques correctes dans le CMakeLists.txt de la simulation. Changer la ligne target_link_libraries(generated_test ${catkin_LIBRARIES}) à target_link_libraries(generated_test ${catkin_LIBRARIES} sim headless SDL m Jansson) l'a corrigé.