Closed BrannonKing closed 7 years ago
Is it possible that the lack of calling spin* while waiting for the graph event causes my problem? Maybe CoreDX can't prep its clients without some spin calls? I wanted to modify NodeGraph::wait_for_graph_change
to call spin_once inside its predicate. However, I can't see how to access the executor in that context.
@BrannonKing you do not need to spin to wait for graph events because the necessary waiting is done in the GraphListener
's thread, see:
https://github.com/ros2/rclcpp/blob/master/rclcpp/include/rclcpp/graph_listener.hpp https://github.com/ros2/rclcpp/blob/master/rclcpp/src/rclcpp/graph_listener.cpp#L166
Make sure the test_graph
test in the rcl
package passes with CoreDX.
test_graph passed. I do see this one fail: test_get_node_names__rmw_coredx_cpp
I don't have any other ideas. If this feature works in Fast-RTPS and Connext and test_graph passes, then I guess it must be a gap in the test_graph tests.
Is it possible for you to test one of our other rmw implementations, like Fast-RTPS?
I recompiled this today and it seems to work with both Fast-RTPS and CoreDX. I don't know why it didn't work with CoreDX before; perhaps something in the framework has changed over the past two weeks to resolve that stall I was seeing. I also found my linkage problem. I've put in a pull request for the above methods: https://github.com/ros2/rclcpp/pull/337
I recompiled this today and it seems to work with both Fast-RTPS and CoreDX.
@BrannonKing Can this be closed?
Now that the wait_for_service
method is available, we should call it from the parameter CLI tool.
The current parameter CLI tool is written in C++ and we don't plan to spend any time on it. The goal is to replace it with a Python implementation in the ros2cli
framework as soon as parameters are implemented in rclpy
.
Let's use it in the Python impelmentation, then. I may put in a pull request for the current tool. At ASI we're using a separate tool that loads params from YAML. The wait method will help us there.
When sending parameters to another node using
AsyncParametersClient
on top of CoreDX middleware, there is some delay between the constructor completing and the internal clients ofAsyncParametersClient
being ready. The individual client classes haveservice_is_ready
andwait_for_service
to deal with this issue, but they aren't exposed on the parameters client. Hence, I added the two methods shown below. If I run a tight loop onservice_is_ready
&spin_some
, my internal clients are all ready to go in a few milliseconds. However, thewait_for_service
method always takes the full timeout (but doesn't return false). It appears that the clientwait_for_service
method is waiting for agraph_changed
event that never happens as these clients transition to ready. Is that a bug with rcl, rclcpp or rmw_coredx_cpp? Is there supposed to be a graph-changed event when a service/client's "is_ready" changes?You can see some other discussion on this here: https://github.com/tocinc/rmw_coredx/issues/8