FancySafeBot 0.0.1
A safe robotics library
Loading...
Searching...
No Matches
fsb_urdf_name_map.h
1
2#pragma once
3
4#include <cstdint>
5#include <string>
6#include <unordered_map>
7
8namespace fsb::urdf
9{
10
19enum class NameMapError : uint8_t
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 (
209 (name_err == NameMapError::EXISTS) && (existing_name == name)
210 && (index_err == NameMapError::EXISTS) && (existing_index == index))
211 {
212 // no error, already in map
213 }
214 else
215 {
216 // name-index pair already exists but does not have the same index and/or name
218 }
219 return err;
220}
221
222inline size_t NameMap::get_index(const std::string& name, NameMapError& err) const
223{
224 size_t index = 0U;
225 if (const auto iter = m_index_map.find(name); iter == m_index_map.end())
226 {
228 }
229 else
230 {
232 index = iter->second;
233 }
234 return index;
235}
236
237inline std::string NameMap::get_name(const size_t index, NameMapError& err) const
238{
239 std::string name = {};
240 if (const auto iter = m_name_map.find(index); iter == m_name_map.end())
241 {
243 }
244 else
245 {
247 name = iter->second;
248 }
249 return name;
250}
251
252} // 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:222
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:237
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.