Skip to content

Commit acc1bd5

Browse files
tpoignonecmergify[bot]
authored andcommitted
Use a dynamic library instead of header-only (#21)
(cherry picked from commit b7958c3)
1 parent 8d1c5cb commit acc1bd5

File tree

3 files changed

+92
-53
lines changed

3 files changed

+92
-53
lines changed

kinematics_interface/CMakeLists.txt

+5-5
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,19 @@ foreach(Dependency IN ITEMS ${THIS_PACKAGE_INCLUDE_DEPENDS})
1818
endforeach()
1919

2020
# Create interface library for kinematics base class
21-
add_library(kinematics_interface INTERFACE)
22-
target_compile_features(kinematics_interface INTERFACE cxx_std_17)
23-
target_include_directories(kinematics_interface INTERFACE
21+
add_library(kinematics_interface SHARED src/kinematics_interface.cpp)
22+
target_compile_features(kinematics_interface PUBLIC cxx_std_17)
23+
target_include_directories(kinematics_interface PUBLIC
2424
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
2525
$<INSTALL_INTERFACE:include/kinematics_interface>
2626
)
27-
ament_target_dependencies(kinematics_interface INTERFACE
27+
ament_target_dependencies(kinematics_interface PUBLIC
2828
${THIS_PACKAGE_INCLUDE_DEPENDS}
2929
)
3030

3131
# Causes the visibility macros to use dllexport rather than dllimport,
3232
# which is appropriate when building the dll but not consuming it.
33-
target_compile_definitions(kinematics_interface INTERFACE "KINEMATICS_INTERFACE_BUILDING_DLL")
33+
target_compile_definitions(kinematics_interface PUBLIC "KINEMATICS_INTERFACE_BUILDING_DLL")
3434

3535
install(
3636
DIRECTORY include/

kinematics_interface/include/kinematics_interface/kinematics_interface.hpp

+4-48
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@
3030

3131
namespace kinematics_interface
3232
{
33-
rclcpp::Logger LOGGER = rclcpp::get_logger("kinematics_interface");
34-
3533
class KinematicsInterface
3634
{
3735
public:
@@ -94,61 +92,19 @@ class KinematicsInterface
9492

9593
bool convert_cartesian_deltas_to_joint_deltas(
9694
std::vector<double> & joint_pos_vec, const std::vector<double> & delta_x_vec,
97-
const std::string & link_name, std::vector<double> & delta_theta_vec)
98-
{
99-
auto joint_pos = Eigen::Map<const Eigen::VectorXd>(joint_pos_vec.data(), joint_pos_vec.size());
100-
auto delta_x = Eigen::Map<const Eigen::VectorXd>(delta_x_vec.data(), delta_x_vec.size());
101-
// TODO(anyone): heap allocation should be removed for realtime use
102-
Eigen::VectorXd delta_theta =
103-
Eigen::Map<Eigen::VectorXd>(delta_theta_vec.data(), delta_theta_vec.size());
104-
105-
bool ret = convert_cartesian_deltas_to_joint_deltas(joint_pos, delta_x, link_name, delta_theta);
106-
for (auto i = 0ul; i < delta_theta_vec.size(); i++)
107-
{
108-
delta_theta_vec[i] = delta_theta[i];
109-
}
110-
return ret;
111-
}
95+
const std::string & link_name, std::vector<double> & delta_theta_vec);
11296

11397
bool convert_joint_deltas_to_cartesian_deltas(
11498
const std::vector<double> & joint_pos_vec, const std::vector<double> & delta_theta_vec,
115-
const std::string & link_name, std::vector<double> & delta_x_vec)
116-
{
117-
auto joint_pos = Eigen::Map<const Eigen::VectorXd>(joint_pos_vec.data(), joint_pos_vec.size());
118-
Eigen::VectorXd delta_theta =
119-
Eigen::Map<const Eigen::VectorXd>(delta_theta_vec.data(), delta_theta_vec.size());
120-
if (delta_x_vec.size() != 6)
121-
{
122-
RCLCPP_ERROR(
123-
LOGGER, "The length of the cartesian delta vector (%zu) must be 6.", delta_x_vec.size());
124-
return false;
125-
}
126-
Eigen::Matrix<double, 6, 1> delta_x(delta_x_vec.data());
127-
bool ret = convert_joint_deltas_to_cartesian_deltas(joint_pos, delta_theta, link_name, delta_x);
128-
for (auto i = 0ul; i < delta_x_vec.size(); i++)
129-
{
130-
delta_x_vec[i] = delta_x[i];
131-
}
132-
return ret;
133-
}
99+
const std::string & link_name, std::vector<double> & delta_x_vec);
134100

135101
bool calculate_link_transform(
136102
const std::vector<double> & joint_pos_vec, const std::string & link_name,
137-
Eigen::Isometry3d & transform)
138-
{
139-
auto joint_pos = Eigen::Map<const Eigen::VectorXd>(joint_pos_vec.data(), joint_pos_vec.size());
140-
141-
return calculate_link_transform(joint_pos, link_name, transform);
142-
}
103+
Eigen::Isometry3d & transform);
143104

144105
bool calculate_jacobian(
145106
const std::vector<double> & joint_pos_vec, const std::string & link_name,
146-
Eigen::Matrix<double, 6, Eigen::Dynamic> & jacobian)
147-
{
148-
auto joint_pos = Eigen::Map<const Eigen::VectorXd>(joint_pos_vec.data(), joint_pos_vec.size());
149-
150-
return calculate_jacobian(joint_pos, link_name, jacobian);
151-
}
107+
Eigen::Matrix<double, 6, Eigen::Dynamic> & jacobian);
152108
};
153109

154110
} // namespace kinematics_interface
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// Copyright (c) 2022, PickNik, Inc.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
//
15+
/// \author: Andy Zelenak, Paul Gesel
16+
/// \description: Base class for kinematics interface
17+
18+
#include "kinematics_interface/kinematics_interface.hpp"
19+
20+
namespace kinematics_interface
21+
{
22+
23+
rclcpp::Logger LOGGER = rclcpp::get_logger("kinematics_interface");
24+
25+
bool KinematicsInterface::convert_cartesian_deltas_to_joint_deltas(
26+
std::vector<double> & joint_pos_vec, const std::vector<double> & delta_x_vec,
27+
const std::string & link_name, std::vector<double> & delta_theta_vec)
28+
{
29+
auto joint_pos = Eigen::Map<const Eigen::VectorXd>(joint_pos_vec.data(), joint_pos_vec.size());
30+
auto delta_x = Eigen::Map<const Eigen::VectorXd>(delta_x_vec.data(), delta_x_vec.size());
31+
// TODO(anyone): heap allocation should be removed for realtime use
32+
Eigen::VectorXd delta_theta =
33+
Eigen::Map<Eigen::VectorXd>(delta_theta_vec.data(), delta_theta_vec.size());
34+
35+
bool ret = convert_cartesian_deltas_to_joint_deltas(joint_pos, delta_x, link_name, delta_theta);
36+
for (auto i = 0ul; i < delta_theta_vec.size(); i++)
37+
{
38+
delta_theta_vec[i] = delta_theta[i];
39+
}
40+
return ret;
41+
}
42+
43+
bool KinematicsInterface::convert_joint_deltas_to_cartesian_deltas(
44+
const std::vector<double> & joint_pos_vec, const std::vector<double> & delta_theta_vec,
45+
const std::string & link_name, std::vector<double> & delta_x_vec)
46+
{
47+
auto joint_pos = Eigen::Map<const Eigen::VectorXd>(joint_pos_vec.data(), joint_pos_vec.size());
48+
Eigen::VectorXd delta_theta =
49+
Eigen::Map<const Eigen::VectorXd>(delta_theta_vec.data(), delta_theta_vec.size());
50+
if (delta_x_vec.size() != 6)
51+
{
52+
RCLCPP_ERROR(
53+
LOGGER, "The length of the cartesian delta vector (%zu) must be 6.", delta_x_vec.size());
54+
return false;
55+
}
56+
Eigen::Matrix<double, 6, 1> delta_x(delta_x_vec.data());
57+
bool ret = convert_joint_deltas_to_cartesian_deltas(joint_pos, delta_theta, link_name, delta_x);
58+
for (auto i = 0ul; i < delta_x_vec.size(); i++)
59+
{
60+
delta_x_vec[i] = delta_x[i];
61+
}
62+
return ret;
63+
}
64+
65+
bool KinematicsInterface::calculate_link_transform(
66+
const std::vector<double> & joint_pos_vec, const std::string & link_name,
67+
Eigen::Isometry3d & transform)
68+
{
69+
auto joint_pos = Eigen::Map<const Eigen::VectorXd>(joint_pos_vec.data(), joint_pos_vec.size());
70+
71+
return calculate_link_transform(joint_pos, link_name, transform);
72+
}
73+
74+
bool KinematicsInterface::calculate_jacobian(
75+
const std::vector<double> & joint_pos_vec, const std::string & link_name,
76+
Eigen::Matrix<double, 6, Eigen::Dynamic> & jacobian)
77+
{
78+
auto joint_pos = Eigen::Map<const Eigen::VectorXd>(joint_pos_vec.data(), joint_pos_vec.size());
79+
80+
return calculate_jacobian(joint_pos, link_name, jacobian);
81+
}
82+
83+
} // namespace kinematics_interface

0 commit comments

Comments
 (0)