3535/* Author: John Hsu */
3636
3737#include " urdf_parser/visual_sensor_parsers.h"
38+ #include " urdf_parser/utils.h"
39+ #include " urdf_parser/pose.h"
3840#include < urdf_sensor/camera.h>
3941#include < urdf_sensor/ray.h>
40-
41- #include < boost/lexical_cast.hpp>
4242#include < console_bridge/console.h>
43- #include " urdf_parser/pose.h"
4443
4544namespace urdf {
4645
@@ -51,110 +50,19 @@ SensorBaseSharedPtr CameraParser::parse(TiXmlElement &config)
5150 TiXmlElement *image = config.FirstChildElement (" image" );
5251 if (image)
5352 {
54- const char * width_char = image->Attribute (" width" );
55- if (width_char)
56- {
57- try
58- {
59- camera->width = boost::lexical_cast<unsigned int >(width_char);
60- }
61- catch (boost::bad_lexical_cast &e)
62- {
63- CONSOLE_BRIDGE_logError (" Camera image width [%s] is not a valid int: %s" , width_char, e.what ());
64- return CameraSharedPtr ();
65- }
53+ try {
54+ camera->width = parseAttribute<unsigned int >(*image, " width" );
55+ camera->height = parseAttribute<unsigned int >(*image, " height" );
56+ camera->format = parseAttribute<std::string>(*image, " format" );
57+ camera->hfov = parseAttribute<double >(*image, " hfov" );
58+ camera->near = parseAttribute<double >(*image, " near" );
59+ camera->far = parseAttribute<double >(*image, " far" );
6660 }
67- else
61+ catch ( const std::exception &e)
6862 {
69- CONSOLE_BRIDGE_logError (" Camera sensor needs an image width attribute " );
63+ CONSOLE_BRIDGE_logError (" Camera sensor %s " , e. what () );
7064 return CameraSharedPtr ();
7165 }
72-
73- const char * height_char = image->Attribute (" height" );
74- if (height_char)
75- {
76- try
77- {
78- camera->height = boost::lexical_cast<unsigned int >(height_char);
79- }
80- catch (boost::bad_lexical_cast &e)
81- {
82- CONSOLE_BRIDGE_logError (" Camera image height [%s] is not a valid int: %s" , height_char, e.what ());
83- return CameraSharedPtr ();
84- }
85- }
86- else
87- {
88- CONSOLE_BRIDGE_logError (" Camera sensor needs an image height attribute" );
89- return CameraSharedPtr ();
90- }
91-
92- const char * format_char = image->Attribute (" format" );
93- if (format_char)
94- camera->format = std::string (format_char);
95- else
96- {
97- CONSOLE_BRIDGE_logError (" Camera sensor needs an image format attribute" );
98- return CameraSharedPtr ();
99- }
100-
101- const char * hfov_char = image->Attribute (" hfov" );
102- if (hfov_char)
103- {
104- try
105- {
106- camera->hfov = boost::lexical_cast<double >(hfov_char);
107- }
108- catch (boost::bad_lexical_cast &e)
109- {
110- CONSOLE_BRIDGE_logError (" Camera image hfov [%s] is not a valid float: %s" , hfov_char, e.what ());
111- return CameraSharedPtr ();
112- }
113- }
114- else
115- {
116- CONSOLE_BRIDGE_logError (" Camera sensor needs an image hfov attribute" );
117- return CameraSharedPtr ();
118- }
119-
120- const char * near_char = image->Attribute (" near" );
121- if (near_char)
122- {
123- try
124- {
125- camera->near = boost::lexical_cast<double >(near_char);
126- }
127- catch (boost::bad_lexical_cast &e)
128- {
129- CONSOLE_BRIDGE_logError (" Camera image near [%s] is not a valid float: %s" , near_char, e.what ());
130- return CameraSharedPtr ();
131- }
132- }
133- else
134- {
135- CONSOLE_BRIDGE_logError (" Camera sensor needs an image near attribute" );
136- return CameraSharedPtr ();
137- }
138-
139- const char * far_char = image->Attribute (" far" );
140- if (far_char)
141- {
142- try
143- {
144- camera->far = boost::lexical_cast<double >(far_char);
145- }
146- catch (boost::bad_lexical_cast &e)
147- {
148- CONSOLE_BRIDGE_logError (" Camera image far [%s] is not a valid float: %s" , far_char, e.what ());
149- return CameraSharedPtr ();
150- }
151- }
152- else
153- {
154- CONSOLE_BRIDGE_logError (" Camera sensor needs an image far attribute" );
155- return CameraSharedPtr ();
156- }
157-
15866 }
15967 else
16068 {
@@ -172,120 +80,32 @@ SensorBaseSharedPtr RayParser::parse(TiXmlElement &config)
17280 TiXmlElement *horizontal = config.FirstChildElement (" horizontal" );
17381 if (horizontal)
17482 {
175- const char * samples_char = horizontal->Attribute (" samples" );
176- if (samples_char)
177- {
178- try
179- {
180- ray->horizontal_samples = boost::lexical_cast<unsigned int >(samples_char);
181- }
182- catch (boost::bad_lexical_cast &e)
183- {
184- CONSOLE_BRIDGE_logError (" Ray horizontal samples [%s] is not a valid float: %s" , samples_char, e.what ());
185- return RaySharedPtr ();
186- }
187- }
188-
189- const char * resolution_char = horizontal->Attribute (" resolution" );
190- if (resolution_char)
191- {
192- try
193- {
194- ray->horizontal_resolution = boost::lexical_cast<double >(resolution_char);
195- }
196- catch (boost::bad_lexical_cast &e)
197- {
198- CONSOLE_BRIDGE_logError (" Ray horizontal resolution [%s] is not a valid float: %s" , resolution_char, e.what ());
199- return RaySharedPtr ();
200- }
83+ try {
84+ ray->horizontal_samples = parseAttribute<unsigned int >(*horizontal, " samples" );
85+ ray->horizontal_resolution = parseAttribute<double >(*horizontal, " resolution" );
86+ ray->horizontal_min_angle = parseAttribute<double >(*horizontal, " min_angle" );
87+ ray->horizontal_max_angle = parseAttribute<double >(*horizontal, " max_angle" );
20188 }
202-
203- const char * min_angle_char = horizontal->Attribute (" min_angle" );
204- if (min_angle_char)
205- {
206- try
207- {
208- ray->horizontal_min_angle = boost::lexical_cast<double >(min_angle_char);
209- }
210- catch (boost::bad_lexical_cast &e)
211- {
212- CONSOLE_BRIDGE_logError (" Ray horizontal min_angle [%s] is not a valid float: %s" , min_angle_char, e.what ());
213- return RaySharedPtr ();
214- }
215- }
216-
217- const char * max_angle_char = horizontal->Attribute (" max_angle" );
218- if (max_angle_char)
89+ catch (const std::exception &e)
21990 {
220- try
221- {
222- ray->horizontal_max_angle = boost::lexical_cast<double >(max_angle_char);
223- }
224- catch (boost::bad_lexical_cast &e)
225- {
226- CONSOLE_BRIDGE_logError (" Ray horizontal max_angle [%s] is not a valid float: %s" , max_angle_char, e.what ());
227- return RaySharedPtr ();
228- }
91+ CONSOLE_BRIDGE_logError (" Ray horizontal: %s" , e.what ());
92+ return RaySharedPtr ();
22993 }
23094 }
23195
23296 TiXmlElement *vertical = config.FirstChildElement (" vertical" );
23397 if (vertical)
23498 {
235- const char * samples_char = vertical->Attribute (" samples" );
236- if (samples_char)
237- {
238- try
239- {
240- ray->vertical_samples = boost::lexical_cast<unsigned int >(samples_char);
241- }
242- catch (boost::bad_lexical_cast &e)
243- {
244- CONSOLE_BRIDGE_logError (" Ray vertical samples [%s] is not a valid float: %s" , samples_char, e.what ());
245- return RaySharedPtr ();
246- }
247- }
248-
249- const char * resolution_char = vertical->Attribute (" resolution" );
250- if (resolution_char)
251- {
252- try
253- {
254- ray->vertical_resolution = boost::lexical_cast<double >(resolution_char);
255- }
256- catch (boost::bad_lexical_cast &e)
257- {
258- CONSOLE_BRIDGE_logError (" Ray vertical resolution [%s] is not a valid float: %s" , resolution_char, e.what ());
259- return RaySharedPtr ();
260- }
261- }
262-
263- const char * min_angle_char = vertical->Attribute (" min_angle" );
264- if (min_angle_char)
265- {
266- try
267- {
268- ray->vertical_min_angle = boost::lexical_cast<double >(min_angle_char);
269- }
270- catch (boost::bad_lexical_cast &e)
271- {
272- CONSOLE_BRIDGE_logError (" Ray vertical min_angle [%s] is not a valid float: %s" , min_angle_char, e.what ());
273- return RaySharedPtr ();
274- }
99+ try {
100+ ray->vertical_samples = parseAttribute<unsigned int >(*vertical, " samples" );
101+ ray->vertical_resolution = parseAttribute<double >(*vertical, " resolution" );
102+ ray->vertical_min_angle = parseAttribute<double >(*vertical, " min_angle" );
103+ ray->vertical_max_angle = parseAttribute<double >(*vertical, " max_angle" );
275104 }
276-
277- const char * max_angle_char = vertical->Attribute (" max_angle" );
278- if (max_angle_char)
105+ catch (const std::exception &e)
279106 {
280- try
281- {
282- ray->vertical_max_angle = boost::lexical_cast<double >(max_angle_char);
283- }
284- catch (boost::bad_lexical_cast &e)
285- {
286- CONSOLE_BRIDGE_logError (" Ray vertical max_angle [%s] is not a valid float: %s" , max_angle_char, e.what ());
287- return RaySharedPtr ();
288- }
107+ CONSOLE_BRIDGE_logError (" Ray horizontal: %s" , e.what ());
108+ return RaySharedPtr ();
289109 }
290110 }
291111 return ray;
0 commit comments