2017-09-03 4 views
0

Ich versuche, den Kilobot-Simulator Kilombo mit einem ROS-Paket zu verwenden. Ich installiere Kilombo normal und versuche dann, die Kilombo-Header-Datei in das ROS-Paket aufzunehmen. Die CMakeLists.txt von Kilombo sieht wie folgt ausExterne Headerdatei im ROS-Paket verknüpfen

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) 

Die CMakeLists.txt des ROS-Paket I wie folgt aussieht erschaffe:

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 gehören die Kilombo Header-Dateien genauso normal: "#include <kilombo.h>"

Wenn ich jedoch catkin_make ausführen, bekomme ich viele "undefined Referenz" -Fehler. Einige dieser Meldungen sind:

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

Diese Nachrichten werden nach den Befehlen angezeigt:

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

beide kilo_turn_left und die Funktion set_motors wird in "kilolib.h" definiert, die sich in „Kilombo enthalten ist .h ".

Alles funktioniert gut, wenn Sie die Simulation normal und nicht als ROS-Paket ausführen. Das Makefile, wenn ich es normalerweise ausführen möchte, sieht wie folgt aus. Ich habe die Teile entfernt, die für den echten Bot kompiliert wurden und nicht für die 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 

Wenn jedoch eine Simulation als ROS-Paket ausgeführt wird, müssen wir eine CMakeLists.txt definieren, das ist, was Ich habe Probleme mit. Was genau mache ich falsch?

+0

Es gibt nicht genug Informationen, um uns zu helfen. Wir müssen einige (nicht notwendigerweise alle) der undefinierten Referenznachrichten sehen. Wo sollten diese Namen wohl definiert werden? Welcher Befehl wird ausgeführt, wenn die undefinierten Referenznachrichten generiert werden? –

+0

Sie müssen einen Verweis auf Kilombo-Paket in CMakeLists.txt des ROS hinzufügen. Oder Sie können andere Simulatoren wie Kelpie oder Gazebo zusammen mit ROS verwenden – Sma

+0

@ JonathanLeffler Ich habe weitere Details zu der Frage hinzugefügt. Bitte schauen Sie noch einmal. – Rabee

Antwort

0

Das Problem war, dass ich nicht zu den richtigen Bibliotheken in der CMakeLists.txt der Simulation verlinkte. Das Ändern der Zeile target_link_libraries(generated_test ${catkin_LIBRARIES}) zu target_link_libraries(generated_test ${catkin_LIBRARIES} sim headless SDL m Jansson) hat es behoben.

Verwandte Themen