2017-09-03 47 views
0

ROS 패키지와 함께 Kilobot 시뮬레이터 Kilombo을 사용하려고합니다. 정상적으로 Kilombo를 설치하고 ROS 패키지 내에 Kilombo 헤더 파일을 포함하려고합니다. ROS 패키지의 외부 헤더 파일 연결

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 헤더 파일을 포함 : 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) 

CMakeLists.txt처럼 보이는 "#include <kilombo.h>"

그러나 catkin_make을 실행하면 많은 "정의되지 않은 참조"오류가 발생합니다. 이러한 메시지 중 일부는 다음과 같습니다

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

모두, kilo_turn_left 및 기능 set_motors 자체가 kilombo "에 포함되어 있습니다"kilolib.h "에 정의되어

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

이 메시지는 명령 후 표시됩니다 .h ".

ROS 패키지가 아닌 정상적으로 시뮬레이션을 실행하면 모든 것이 잘 작동합니다. Makefile을 정상적으로 실행하려고하면 다음과 같이 보입니다. 시뮬레이션을 위해서가 아니라 실제 로봇을 위해 컴파일 된 부분을 제거했습니다. ROS 패키지와 시뮬레이션을 실행할 때

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 

그러나, 우리는 내가에 문제가있는 무슨이다 이는 CMakeLists.txt를 정의 할 필요가있다. 정확히 내가 뭘 잘못하고 있니?

+0

도움이되는 정보가 충분하지 않습니다. 정의되지 않은 참조 메시지 중 일부 (전부는 아님)를 볼 필요가 있습니다. 그 이름을 어디에서 정의해야한다고 생각하십니까? 정의되지 않은 참조 메시지가 생성되면 어떤 명령이 실행됩니까? –

+0

Ross의 CMakeLists.txt에 Kilombo 패키지에 대한 참조를 추가해야합니다. 아니면 ROS와 함께 Kelpie 나 Gazebo와 같은 다른 시뮬레이터를 사용할 수도 있습니다. – 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)으로 변경했습니다.