Skip to content

Commit 18c51ce

Browse files
committed
Refactor CMakeLists and source files for improved structure and performance
- Updated CMakeLists.txt in src/kdl and src/net to exclude header files from source lists and improve target include directories. - Simplified library creation by removing unnecessary static/shared declarations. - Enhanced Eigen usage in LieDynamics and PoEKinematics by eliminating redundant zero-setting conditions. - Changed dynamic arrays to std::array in main.cpp for better performance and safety. - Improved readability and maintainability of the code by using inline constexpr for constants and modern C++ features. - Fixed minor typos and improved logging messages for better debugging.
1 parent d5b408b commit 18c51ce

34 files changed

+2106
-2227
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,6 @@
3131
*.out
3232
*.app
3333
/Release/
34+
35+
# AI assistant context (local only)
36+
CLAUDE.md

CMakeLists.txt

Lines changed: 99 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -1,168 +1,127 @@
1-
###
2-
# Set minimum version of CMake. Since command 'project' use
3-
# VERSION sub-option we need at least 3.0.
4-
# Note: If you use 2.6 or 2.4, God kills a kitten. Seriously.
51
cmake_minimum_required(VERSION 3.8)
62

7-
# THIS HAS TO COME BEFORE THE PROJECT LINE
8-
#set(CMAKE_C_COMPILER "gcc")
9-
#set(CMAKE_CXX_COMPILER "gcc")
10-
11-
####
12-
# Set variables:
13-
# * PROJECT_NAME
14-
# * PROJECT_VERSION
153
project(RTControlDualArm VERSION 2.0.0 LANGUAGES C CXX)
164

17-
# Use MACOSX_RPATH by default on OS X. This was added in CMake 2.8.12 and
18-
# became default in CMake 3.0. Explicitly setting this policy is necessary to
19-
# suppress a warning in CMake 3.0 and above.
20-
if(POLICY CMP0042)
21-
cmake_policy(SET CMP0042 NEW)
22-
endif()
23-
24-
# Simplify variable reference and escape sequence evaluation. This was added in
25-
# CMake 3.1. Explicitly setting this policy is necessary to suppress a warning
26-
# in CMake 3.1 and above.
27-
if(POLICY CMP0053)
28-
cmake_policy(SET CMP0053 NEW)
29-
endif()
30-
31-
cmake_policy(SET CMP0022 NEW)
32-
if (POLICY CMP0048)
33-
cmake_policy(SET CMP0048 NEW)
5+
# ---------------------------------------------------------------------------
6+
# Default build type
7+
# ---------------------------------------------------------------------------
8+
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
9+
message(STATUS "Build type not set – defaulting to Release")
10+
set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose: Debug Release RelWithDebInfo Profile" FORCE)
11+
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Debug Release RelWithDebInfo Profile)
3412
endif()
3513

36-
if (POLICY CMP0025)
37-
cmake_policy(SET CMP0025 NEW)
38-
endif()
39-
40-
include(GNUInstallDirs)
41-
include(CMakePackageConfigHelpers)
14+
# ---------------------------------------------------------------------------
15+
# Module path
16+
# ---------------------------------------------------------------------------
17+
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
4218
include(FindPkgConfig)
4319
include(cmake/CMakeFunctions.cmake)
4420

45-
set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR})
21+
# ---------------------------------------------------------------------------
22+
# Install directories (in-source layout: bin/ lib/ bin/inc/)
23+
# ---------------------------------------------------------------------------
24+
set(CMAKE_INSTALL_PREFIX ${PROJECT_SOURCE_DIR})
4625
set(PROJ_INSTALL_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/bin/inc)
47-
set(PROJ_INSTALL_BIN_DIR ${PROJECT_SOURCE_DIR}/bin)
48-
set(PROJ_INSTALL_LIB_DIR ${PROJECT_SOURCE_DIR}/lib)
49-
50-
set(CMAKE_DEBUG_POSTFIX "d")
51-
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
52-
53-
#===============================================================================
54-
# Compiler flags
55-
#===============================================================================
56-
include(CheckCXXCompilerFlag)
57-
check_cxx_compiler_flag(-std=c++17 CXX17_SUPPORT)
58-
if(CXX17_SUPPORT)
59-
set(CMAKE_CXX_STANDARD 17)
60-
set(CMAKE_CXX_STANDARD_REQUIRED ON)
61-
set(CMAKE_CXX_EXTENSIONS OFF)
62-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
63-
else()
64-
check_cxx_compiler_flag(-std=c++14 CXX14_SUPPORT)
65-
set(CMAKE_CXX_STANDARD 14)
66-
set(CMAKE_CXX_STANDARD_REQUIRED ON)
67-
set(CMAKE_CXX_EXTENSIONS OFF)
68-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14" )
69-
endif()
70-
71-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -fPIC" )
26+
set(PROJ_INSTALL_BIN_DIR ${PROJECT_SOURCE_DIR}/bin)
27+
set(PROJ_INSTALL_LIB_DIR ${PROJECT_SOURCE_DIR}/lib)
28+
set(CMAKE_DEBUG_POSTFIX "d")
29+
30+
# ---------------------------------------------------------------------------
31+
# C++ standard (C++17 required for inline variables, constexpr, structured bindings)
32+
# ---------------------------------------------------------------------------
33+
set(CMAKE_CXX_STANDARD 17)
34+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
35+
set(CMAKE_CXX_EXTENSIONS OFF)
36+
37+
# Minimum compiler check
7238
execute_process(
73-
COMMAND ${CMAKE_CXX_COMPILER} -dumpfullversion -dumpversion OUTPUT_VARIABLE GCC_VERSION)
39+
COMMAND ${CMAKE_CXX_COMPILER} -dumpfullversion -dumpversion
40+
OUTPUT_VARIABLE GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
7441
if(GCC_VERSION VERSION_LESS 5.3.1)
75-
message(FATAL_ERROR "The installed g++ version is ${GCC_VERSION}. ${PROJECT_NAME} requires g++ 5.3.1 or greater.")
42+
message(FATAL_ERROR
43+
"g++ ${GCC_VERSION} found; ${PROJECT_NAME} requires g++ >= 5.3.1.")
7644
endif()
7745

78-
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG")
79-
set(CMAKE_CXX_FLAGS_DEBUG "-g -fno-omit-frame-pointer -fno-inline-functions -fno-inline-functions-called-once -fno-optimize-sibling-calls")
46+
# ---------------------------------------------------------------------------
47+
# Compiler flags
48+
# ---------------------------------------------------------------------------
49+
# Common flags for all build types
50+
add_compile_options(-Wall -Wextra -fPIC)
51+
52+
set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG -march=native -funroll-loops")
53+
set(CMAKE_CXX_FLAGS_DEBUG
54+
"-g -fno-omit-frame-pointer -fno-inline-functions \
55+
-fno-inline-functions-called-once -fno-optimize-sibling-calls")
8056
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELEASE} ${CMAKE_CXX_FLAGS_DEBUG}")
81-
set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_DEBUG} -pg")
57+
set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_DEBUG} -pg")
58+
59+
# Catch undefined symbols at shared-library link time
8260
set(CMAKE_SHARED_LINKER_FLAGS "-Wl,--no-undefined")
8361

84-
include_directories(include)
62+
# ---------------------------------------------------------------------------
63+
# Find Xenomai early (before targets that use it)
64+
# ---------------------------------------------------------------------------
65+
find_package(Xenomai 2.6.0 REQUIRED NATIVE)
66+
message(STATUS "Xenomai found. Skins: ${Xenomai_SKINS}")
8567

68+
# ---------------------------------------------------------------------------
69+
# Sub-libraries
70+
# ---------------------------------------------------------------------------
8671
add_subdirectory(src/control)
8772
add_subdirectory(src/ecat)
8873
add_subdirectory(src/kdl)
8974
add_subdirectory(src/net)
9075

91-
add_executable(${PROJECT_NAME}
92-
src/main.cpp
93-
)
76+
# ---------------------------------------------------------------------------
77+
# Main executable
78+
# ---------------------------------------------------------------------------
79+
add_executable(${PROJECT_NAME} src/main.cpp)
80+
81+
# Project-wide include root (src/ files use #include "ecat/...", "kdl/...", etc.)
82+
target_include_directories(${PROJECT_NAME} PRIVATE include)
9483

95-
target_link_libraries(${PROJECT_NAME}
96-
sub::CTRL
97-
sub::ECAT
98-
sub::KDL
99-
sub::NETWORK
84+
target_link_libraries(${PROJECT_NAME} PRIVATE
85+
sub::CTRL
86+
sub::ECAT
87+
sub::KDL
88+
sub::NETWORK
10089
)
10190

102-
find_package(Xenomai 2.6.0 REQUIRED NATIVE)
103-
message(STATUS "Xenomai found with theses skins: ${Xenomai_SKINS}")
91+
# ---------------------------------------------------------------------------
92+
# Xenomai integration
93+
# set_target_properties(COMPILE_FLAGS) in a loop would overwrite on each
94+
# iteration. Use target_compile_options / target_link_libraries instead.
95+
# ---------------------------------------------------------------------------
10496
if(Xenomai_FOUND)
105-
target_include_directories(${PROJECT_NAME} PUBLIC ${KERNELHEADERS_DIR})
106-
foreach(comp_lists ${Xenomai_FOUND_COMP})
107-
#message(STATUS "Xenomai ${comp_lists} includes : ${Xenomai_${comp_lists}_INCLUDE_DIRS}" )
108-
#message(STATUS "Xenomai ${comp_lists} definitions: ${Xenomai_${comp_lists}_DEFINITIONS}")
109-
#message(STATUS "Xenomai ${comp_lists} LIBRARY_DIRS : ${Xenomai_${comp_lists}_LIBRARY_DIRS} ")
110-
#message(STATUS "Xenomai ${comp_lists} LIBRARIES : ${Xenomai_${comp_lists}_LIBRARIES}")
111-
#message(STATUS "Xenomai ${comp_lists} LDFLAGS : ${Xenomai_${comp_lists}_LDFLAGS}")
112-
#message(STATUS "Xenomai ${comp_lists} DL_FLAGS : ${Xenomai_${comp_lists}_DL_FLAGS}")
113-
114-
target_include_directories(${PROJECT_NAME} PUBLIC ${Xenomai_${comp_lists}_INCLUDE_DIRS})
115-
#target_link_libraries(${PROJECT_NAME} ${Xenomai_${comp_lists}_LIBRARY_DIRS} ${Xenomai_${comp_lists}_LIBRARIES})
116-
target_link_libraries(${PROJECT_NAME} ${Xenomai_${comp_lists}_DL_FLAGS})
117-
set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS ${Xenomai_${comp_lists}_DEFINITIONS})
118-
endforeach(comp_lists ${Xenomai_SKINS})
119-
endif(Xenomai_FOUND)
120-
121-
# check if Doxygen is installed
122-
#find_package(Doxygen)
123-
#if (DOXYGEN_FOUND)
124-
# # set input and output files
125-
# set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/ doc/Doxyfile.in)
126-
# set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
127-
#
128-
# # request to configure the file
129-
# configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY)
130-
# message("Doxygen build started")
131-
#
132-
# # note the option ALL which allows to build the docs together with the application
133-
# add_custom_target( doc_doxygen ALL
134-
# COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
135-
# WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
136-
# COMMENT "Generating API documentation with Doxygen"
137-
# VERBATIM )
138-
#else (DOXYGEN_FOUND)
139-
# message("Doxygen need to be installed to generate the doxygen documentation")
140-
#endif (DOXYGEN_FOUND)
141-
142-
#===============================================================================
143-
# Print build summary
144-
#===============================================================================
145-
if(Dualarm_VERBOSE)
146-
message(STATUS "")
147-
message(STATUS "[ Build summary ]")
148-
message(STATUS "CMAKE_GENERATOR : ${CMAKE_GENERATOR}")
149-
message(STATUS "Compiler ID : ${CMAKE_CXX_COMPILER_ID}")
150-
message(STATUS "Compiler version : ${CMAKE_CXX_COMPILER_VERSION}")
151-
message(STATUS "Build type : ${CMAKE_BUILD_TYPE}")
152-
message(STATUS "BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}")
153-
message(STATUS "Install path : ${CMAKE_INSTALL_PREFIX}")
154-
message(STATUS "CXX_FLAGS : ${CMAKE_CXX_FLAGS}")
155-
if(${CMAKE_BUILD_TYPE_UPPERCASE} STREQUAL "RELEASE")
156-
message(STATUS "CXX_FLAGS_RELEASE: ${CMAKE_CXX_FLAGS_RELEASE}")
157-
elseif(${CMAKE_BUILD_TYPE_UPPERCASE} STREQUAL "DEBUG")
158-
message(STATUS "CXX_FLAGS_DEBUG : ${CMAKE_CXX_FLAGS_DEBUG}")
159-
elseif(${CMAKE_BUILD_TYPE_UPPERCASE} STREQUAL "RELWITHDEBINFO")
160-
message(STATUS "CXX_FLAGS_RELWITHDEBINFO: ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
161-
elseif(${CMAKE_BUILD_TYPE_UPPERCASE} STREQUAL "PROFILE")
162-
message(STATUS "CXX_FLAGS_PROFILE: ${CMAKE_CXX_FLAGS_PROFILE}")
163-
endif()
164-
message(STATUS "CMAKE_SOURCE_DIR : ${CMAKE_SOURCE_DIR}")
165-
message(STATUS "CMAKE_BINARY_DIR : ${CMAKE_BINARY_DIR}")
166-
message(STATUS "")
167-
endif(Dualarm_VERBOSE)
97+
target_include_directories(${PROJECT_NAME} PRIVATE ${KERNELHEADERS_DIR})
98+
foreach(skin ${Xenomai_FOUND_COMP})
99+
target_include_directories(${PROJECT_NAME} PRIVATE
100+
${Xenomai_${skin}_INCLUDE_DIRS})
101+
target_compile_options(${PROJECT_NAME} PRIVATE
102+
${Xenomai_${skin}_DEFINITIONS})
103+
# DL_FLAGS are raw linker flags (e.g. -Wl,--wrap=...), not libraries
104+
target_link_libraries(${PROJECT_NAME} PRIVATE
105+
${Xenomai_${skin}_DL_FLAGS})
106+
endforeach()
107+
endif()
168108

109+
# ---------------------------------------------------------------------------
110+
# Install
111+
# ---------------------------------------------------------------------------
112+
install(TARGETS ${PROJECT_NAME}
113+
RUNTIME DESTINATION bin)
114+
115+
# ---------------------------------------------------------------------------
116+
# Build summary (always shown – useful when diagnosing CI failures)
117+
# ---------------------------------------------------------------------------
118+
string(TOUPPER "${CMAKE_BUILD_TYPE}" _BUILD_TYPE_UPPER)
119+
message(STATUS "")
120+
message(STATUS "[ ${PROJECT_NAME} ${PROJECT_VERSION} – build summary ]")
121+
message(STATUS " Generator : ${CMAKE_GENERATOR}")
122+
message(STATUS " Compiler : ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")
123+
message(STATUS " C++ std : ${CMAKE_CXX_STANDARD}")
124+
message(STATUS " Build type : ${CMAKE_BUILD_TYPE}")
125+
message(STATUS " Install : ${CMAKE_INSTALL_PREFIX}")
126+
message(STATUS " Flags : ${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${_BUILD_TYPE_UPPER}}")
127+
message(STATUS "")

build/CMakeCache.txt

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ CMAKE_AR:FILEPATH=/usr/bin/ar
4343

4444
//Choose the type of build, options are: None Debug Release RelWithDebInfo
4545
// MinSizeRel ...
46-
CMAKE_BUILD_TYPE:STRING=
46+
CMAKE_BUILD_TYPE:STRING=Release
4747

4848
//Enable/Disable color output during build.
4949
CMAKE_COLOR_MAKEFILE:BOOL=ON
@@ -118,8 +118,8 @@ CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING=
118118
//Flags used by the linker during RELWITHDEBINFO builds.
119119
CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING=
120120

121-
//Enable/Disable output of compile commands during generation.
122-
CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=
121+
//No help, variable specified on the command line.
122+
CMAKE_EXPORT_COMPILE_COMMANDS:UNINITIALIZED=ON
123123

124124
//Value Computed by CMake.
125125
CMAKE_FIND_PACKAGE_REDIRECTS_DIR:STATIC=/home/junho/git/RTControlDualArm/build/CMakeFiles/pkgRedirects
@@ -326,6 +326,15 @@ Eigen3_DIR:PATH=/usr/share/eigen3/cmake
326326
//Path to a file.
327327
Etherlab_ROOT_DIR:PATH=Etherlab_ROOT_DIR-NOTFOUND
328328

329+
//Path to a file.
330+
KERNELHEADERS_DIR:PATH=/usr/src/linux-headers-6.17.0-14-generic
331+
332+
//Set to 1 if kernel headers were found
333+
KERNELHEADERS_FOUND:STRING=1
334+
335+
//Kernel headers include dirs
336+
KERNELHEADERS_INCLUDE_DIRS:PATH=/usr/src/linux-headers-6.17.0-14-generic/include;/usr/src/linux-headers-6.17.0-14-generic/arch/x86/include
337+
329338
//Arguments to supply to pkg-config
330339
PKG_CONFIG_ARGN:STRING=
331340

@@ -341,6 +350,12 @@ RTControlDualArm_IS_TOP_LEVEL:STATIC=ON
341350
//Value Computed by CMake
342351
RTControlDualArm_SOURCE_DIR:STATIC=/home/junho/git/RTControlDualArm
343352

353+
//Path to a file.
354+
Xenomai_KERNEL_INCLUDE_DIR:PATH=Xenomai_KERNEL_INCLUDE_DIR-NOTFOUND
355+
356+
//Path to a program.
357+
Xenomai_XENO_CONFIG:FILEPATH=Xenomai_XENO_CONFIG-NOTFOUND
358+
344359

345360
########################
346361
# INTERNAL cache entries
@@ -492,7 +507,7 @@ CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1
492507
//ADVANCED property for variable: CMAKE_NM
493508
CMAKE_NM-ADVANCED:INTERNAL=1
494509
//number of local generators
495-
CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=3
510+
CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=1
496511
//ADVANCED property for variable: CMAKE_OBJCOPY
497512
CMAKE_OBJCOPY-ADVANCED:INTERNAL=1
498513
//ADVANCED property for variable: CMAKE_OBJDUMP
@@ -541,6 +556,8 @@ CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1
541556
CXX17_SUPPORT:INTERNAL=1
542557
//Details about finding PkgConfig
543558
FIND_PACKAGE_MESSAGE_DETAILS_PkgConfig:INTERNAL=[/usr/bin/pkg-config][v1.8.1()]
559+
//ADVANCED property for variable: KERNELHEADERS_FOUND
560+
KERNELHEADERS_FOUND-ADVANCED:INTERNAL=1
544561
//ADVANCED property for variable: PKG_CONFIG_ARGN
545562
PKG_CONFIG_ARGN-ADVANCED:INTERNAL=1
546563
//ADVANCED property for variable: PKG_CONFIG_EXECUTABLE

include/RTClient.h

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,7 @@
66
* @version 1.0.0
77
*/
88

9-
#ifndef RTCLIENT_H_
10-
#define RTCLIENT_H_
9+
#pragma once
1110

1211
#include <cstdio>
1312
#include <cstdlib>
@@ -45,8 +44,8 @@
4544
#include "kdl/SerialManipulator.h"
4645
#include "net/SocketHandler.h"
4746

48-
#define WAKEUP_TIME (5) /**<Initial waiting time*/
49-
#define NSEC_PER_SEC (1000000000L) /**<Expression of second in nano second*/
47+
inline constexpr int WAKEUP_TIME = 5; // Initial waiting time (s)
48+
inline constexpr long NSEC_PER_SEC = 1'000'000'000L; // 1 second in nanoseconds
5049

5150
//#define _DEBUG_ /**<Debug Print Parameter*/
5251
#define _ECAT_ON_ /**<EtherCAT device enable Parameter*/
@@ -55,15 +54,15 @@
5554
//#define _PLOT_ON_
5655
//#define _KEYBOARD_ON_
5756

58-
typedef unsigned int UINT32; /**<typedef uint32_t*/
59-
typedef int64_t INT64; /**<typedef uint64_t*/
60-
typedef int32_t INT32; /**<typedef int32_t*/
61-
typedef int16_t INT16; /**<typedef int16_t*/
62-
typedef uint16_t UINT16; /**<typedef uint16_t*/
63-
typedef uint8_t UINT8; /**<typedef uint8_t*/
64-
typedef int8_t INT8; /**<typedef int8_t*/
57+
// Use <cstdint> standard types directly: uint32_t, int64_t, int32_t, int16_t, uint16_t, uint8_t, int8_t
58+
// Legacy aliases kept for backward compatibility
59+
using UINT32 = uint32_t;
60+
using INT64 = int64_t;
61+
using INT32 = int32_t;
62+
using INT16 = int16_t;
63+
using UINT16 = uint16_t;
64+
using UINT8 = uint8_t;
65+
using INT8 = int8_t;
6566

66-
// Cycle time in nanosecond
67-
unsigned long cycle_ns = 1000e3; /**< 1 ms, Initial Value */
68-
69-
#endif
67+
// Cycle time in nanosecond (C++17 inline variable)
68+
inline unsigned long cycle_ns = 1000e3; /**< 1 ms, Initial Value */

0 commit comments

Comments
 (0)