Skip to content

Commit df9202e

Browse files
authored
Add ros2 launch capabilities and example launch file (#47)
1 parent 837d871 commit df9202e

File tree

3 files changed

+77
-1
lines changed

3 files changed

+77
-1
lines changed

micro_ros_agent/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,13 @@ install(
113113
lib/${PROJECT_NAME}
114114
)
115115

116+
install(
117+
DIRECTORY
118+
launch
119+
DESTINATION
120+
share/${PROJECT_NAME}
121+
)
122+
116123
if(UROSAGENT_GENERATE_PROFILE)
117124
set(_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/python")
118125

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from launch import LaunchDescription
2+
from launch_ros.actions import Node
3+
4+
def generate_launch_description():
5+
return LaunchDescription([
6+
Node(
7+
package='micro_ros_agent',
8+
executable='micro_ros_agent',
9+
name='micro_ros_agent',
10+
arguments={'udp4 --port 8888 -v6'}
11+
)
12+
])

micro_ros_agent/src/main.cpp

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)