2017-09-03 150 views
0

我正在嘗試使用帶有ROS包的Kilobot模擬器Kilombo。我正常安裝Kilombo,然後嘗試將Kilombo頭文件包含在ROS包中。 Kilombo的的CMakeLists.txt看起來像這樣在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) 

的ROS的包我創建看起來像這樣的的CMakeLists.txt:

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

我包括Kilombo頭文件只是正常:"#include <kilombo.h>"

但是,當我運行catkin_make時,出現很多「未定義的引用」錯誤。一些這些消息是:

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

這些消息的命令之後顯示:

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

兩者,kilo_turn_left和功能set_motors在其本身包含在「kilombo「kilolib.h」定義。H」。

如果嘗試正常運行模擬而不是ROS包,一切正常。當我嘗試正常運行時,Makefile如下所示。我刪除了爲真實機器人編譯的部分,而不是模擬的部分。

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 

但是,當將模擬作爲ROS包運行時,我們需要定義一個CMakeLists.txt,這是我遇到的問題。我究竟做錯了什麼?

+0

沒有足夠的信息來幫助我們。我們需要看到一些(未必全部)未定義的參考消息。你認爲這些名字應該在哪裏定義?未定義的參考消息生成時執行什麼命令? –

+0

您必須在ROS的CMakeLists.txt中添加對Kilombo軟件包的引用。或者你可以使用其他模擬器,如Kelpie或Gazebo以及ROS – Sma

+0

@JonathanLeffler我已經添加了更多的細節問題。請再看一下。 – Rabee

回答

0

問題是我沒有鏈接到模擬的CMakeLists.txt中正確的庫。將行target_link_libraries(generated_test ${catkin_LIBRARIES})更改爲target_link_libraries(generated_test ${catkin_LIBRARIES} sim headless SDL m Jansson)修復了它。