FancySafeBot 0.0.1
A safe robotics library
Loading...
Searching...
No Matches
fsb_urdf_name_map.h
1
2#pragma once
3
4#include <cstddef>
5#include <string>
6#include <unordered_map>
7
8namespace fsb::urdf
9{
10
19enum class NameMapError
20{
22 SUCCESS,
26 EXISTS
27};
28
33{
34public:
35 NameMap() = default;
36
43 NameMapError add(size_t index, const std::string& name);
44
51 size_t get_index(const std::string& name, NameMapError& err) const;
52
59 std::string get_name(size_t index, NameMapError& err) const;
60
66 [[nodiscard]] bool name_exists(const std::string& name) const
67 {
68 const auto iter = m_index_map.find(name);
69 return (iter != m_index_map.end());
70 }
71
76 [[nodiscard]] size_t size() const
77 {
78 return m_index_map.size();
79 }
80
81private:
82 std::unordered_map<size_t, std::string> m_name_map;
83 std::unordered_map<std::string, size_t> m_index_map;
84};
85
88{
89public:
90 UrdfNameMap() = default;
91
96 void set_robot_name(const std::string& name)
97 {
98 m_robot_name = name;
99 }
100
107 NameMapError add_body(const size_t index, const std::string& name)
108 {
109 return m_bodies.add(index, name);
110 }
111
118 NameMapError add_joint(const size_t index, const std::string& name)
119 {
120 return m_joints.add(index, name);
121 }
122
129 size_t get_body_index(const std::string& name, NameMapError& err) const
130 {
131 return m_bodies.get_index(name, err);
132 }
133
141 size_t get_joint_index(const std::string& name, NameMapError& err) const
142 {
143 return m_joints.get_index(name, err);
144 }
145
151 [[nodiscard]] bool body_exists(const std::string& name) const
152 {
153 return m_bodies.name_exists(name);
154 }
155
161 [[nodiscard]] bool joint_exists(const std::string& name) const
162 {
163 return m_joints.name_exists(name);
164 }
165
170 [[nodiscard]] size_t get_num_bodies() const
171 {
172 return m_bodies.size();
173 }
174
179 [[nodiscard]] size_t get_num_joints() const
180 {
181 return m_joints.size();
182 }
183
184private:
185 std::string m_robot_name;
186 NameMap m_bodies;
187 NameMap m_joints;
188};
189
194inline NameMapError NameMap::add(const size_t index, const std::string& name)
195{
196 auto err = NameMapError::SUCCESS;
197
198 auto name_err = NameMapError::SUCCESS;
199 const std::string existing_name = get_name(index, name_err);
200 auto index_err = NameMapError::SUCCESS;
201 const size_t existing_index = get_index(name, index_err);
202 if (name_err == NameMapError::NOT_FOUND && index_err == NameMapError::NOT_FOUND)
203 {
204 // Name and index do not exist - Add to map
205 m_index_map[name] = index;
206 m_name_map[index] = name;
207 }
208 else if ((name_err == NameMapError::EXISTS) &&
209 (existing_name == name) &&
210 (index_err == NameMapError::EXISTS) &&
211 (existing_index == index))
212 {
213 // no error, already in map
214 }
215 else
216 {
217 // name-index pair already exists but does not have the same index and/or name
219 }
220 return err;
221}
222
223inline size_t NameMap::get_index(const std::string& name, NameMapError& err) const
224{
225 size_t index = 0U;
226 if (const auto iter = m_index_map.find(name); iter == m_index_map.end())
227 {
229 }
230 else
231 {
233 index = iter->second;
234 }
235 return index;
236}
237
238inline std::string NameMap::get_name(const size_t index, NameMapError& err) const
239{
240 std::string name = {};
241 if (const auto iter = m_name_map.find(index); iter == m_name_map.end())
242 {
244 }
245 else
246 {
248 name = iter->second;
249 }
250 return name;
251}
252
253} // namespace fsb::urdf
Name map relating names to object indices.
Definition fsb_urdf_name_map.h:33
size_t get_index(const std::string &name, NameMapError &err) const
Get index of named object.
Definition fsb_urdf_name_map.h:223
NameMapError add(size_t index, const std::string &name)
Add named object with index.
Definition fsb_urdf_name_map.h:194
std::string get_name(size_t index, NameMapError &err) const
Get name of indexed object.
Definition fsb_urdf_name_map.h:238
size_t size() const
Get number of name-index pairs in map.
Definition fsb_urdf_name_map.h:76
bool name_exists(const std::string &name) const
Check if name exists in map.
Definition fsb_urdf_name_map.h:66
Name-index map of joints and bodies in rigid body tree.
Definition fsb_urdf_name_map.h:88
size_t get_num_joints() const
Get number of joints in map.
Definition fsb_urdf_name_map.h:179
void set_robot_name(const std::string &name)
Set robot name.
Definition fsb_urdf_name_map.h:96
size_t get_body_index(const std::string &name, NameMapError &err) const
Get index of body in tree.
Definition fsb_urdf_name_map.h:129
bool joint_exists(const std::string &name) const
Check if joint name is set in map.
Definition fsb_urdf_name_map.h:161
NameMapError add_joint(const size_t index, const std::string &name)
Definition fsb_urdf_name_map.h:118
NameMapError add_body(const size_t index, const std::string &name)
Definition fsb_urdf_name_map.h:107
size_t get_joint_index(const std::string &name, NameMapError &err) const
Get index of joint in body tree.
Definition fsb_urdf_name_map.h:141
bool body_exists(const std::string &name) const
Check if body name is set in map.
Definition fsb_urdf_name_map.h:151
size_t get_num_bodies() const
Get number of bodies in map.
Definition fsb_urdf_name_map.h:170
NameMapError
Name map errors.
Definition fsb_urdf_name_map.h:20
@ EXISTS
Joint or body already exists.
@ NOT_FOUND
Joint or body name not found.