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?
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? –
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
@ JonathanLeffler Ich habe weitere Details zu der Frage hinzugefügt. Bitte schauen Sie noch einmal. – Rabee