@@ -18,10 +18,67 @@ int main(int argc, char** argv)
1818{
1919 uros::agent::Agent micro_ros_agent;
2020
21- if (!micro_ros_agent.create (argc, argv))
21+ /* * Bypass '--ros-args' flag, as we use our own CLI parser.
22+ * As a workaround for launch files, arguments will be passed from
23+ * ros2launch as a single token with spaces,
24+ * to preserve the correct argument order; split it here.
25+ * TODO(jamoralp): investigate ROS2 tools for properly parsing params from launch
26+ **/
27+ std::vector<std::string> params;
28+ for (int i = 0 ; i < argc; ++i)
29+ {
30+ params.emplace_back (std::string (argv[i]));
31+ }
32+
33+ auto it = std::find (params.begin (), params.end (), " --ros-args" );
34+ if (params.end () != it)
35+ {
36+ if ((it - params.begin ()) != 2 )
37+ {
38+ std::ostringstream ss;
39+ ss << " Error: when using ros2 launch, please specify " ;
40+ ss << " your arguments in a single variable." << std::endl;
41+ ss << " Instead of 'arguments: {'udp4', '-p', '8888'}', do " ;
42+ ss << " 'arguments: {'udp4 -p 8888'}" << std::endl;
43+
44+ std::cerr << ss.str ();
45+ return 1 ;
46+ }
47+ const std::string& agent_args (params.at (1 ));
48+ std::istringstream iss (agent_args);
49+ std::vector<std::string> agent_args_split (
50+ std::istream_iterator<std::string>{iss},
51+ std::istream_iterator<std::string>());
52+
53+ char ** agent_argv = new char *[agent_args_split.size () + 1 ];
54+ agent_argv[0 ] = argv[0 ];
55+ char ** agent_argv_it = &agent_argv[1 ];
56+
57+ for (const auto & arg : agent_args_split)
58+ {
59+ *agent_argv_it = new char [arg.length () + 1 ];
60+ strcpy (*agent_argv_it, arg.c_str ());
61+ agent_argv_it++;
62+ }
63+
64+ bool success = micro_ros_agent.create (agent_args_split.size () + 1 , agent_argv);
65+
66+ for (size_t i = 1 ; i <= agent_args_split.size (); ++i)
67+ {
68+ delete [] agent_argv[i];
69+ }
70+ delete [] agent_argv;
71+
72+ if (!success)
73+ {
74+ return 1 ;
75+ }
76+ }
77+ else if (!micro_ros_agent.create (argc, argv))
2278 {
2379 return 1 ;
2480 }
81+
2582 micro_ros_agent.run ();
2683
2784 return 0 ;
0 commit comments