小鱼 ROS 2 新书上线!点击链接查看, 新书配套视频点击链接查看。
提问前必看的发帖注意事项—— 提问前必看!不符合要求的问题拒绝回答!!
社区使用指南—如何添加标签修改密码
我在使用ros2-foxy服务时,明明有服务节点,但是客户端却无法链接,手动call也无法链接。
-
我定义了一个节点,里面有一个启动cartographer的service,启动节点之后,有时候能通过服务端发送信息给服务端来启动cartographer,有时候却启动不了,启动客户端之后客户端一直等待服务端启动,但是服务端已经启动了,打印service list也显示有服务/carto_mode手动call /carto_mode也说服务端未启动 明明已经启动了,这个情况困扰我很久了,请问有人知道是怎么回事吗,谢谢!
-
@哦哦哦 在 我在使用ros2-foxy服务时,明明有服务节点,但是客户端却无法链接,手动call也无法链接。 中说:
/carto_mode
不知道你的服务内部是如何实现的,如果启动后没有spin即使可以看到服务,但是依然无法通信,具体要看代码了。
你的命令行和客户端都显示服务未启动,这可以排除你的客户端代码问题。
-
@小鱼 我是创建了一个节点,这个节点有三个服务,一个用于启动nav2,一个用于启动cartographer,还有一个服务用于关闭nav和cartographer,目前是这样,我先用启动cartographer的服务来启动cartographer,然后用关闭的服务关闭它,关闭之后有时能再次启动,有时就启动不了了,前面说的那种情况。
-
@哦哦哦 你是通过什么启动的nav2,子进程吗?
-
@小鱼 我在服务端用的Popen启动的launch文件,结束通过客户端发送请求,服务端收到请求后,通过查找launch启动的节点的pid来kill的
-
@哦哦哦 popen机制其实有很大问题,你启动了子进程,再用pid杀可能是杀不死的(该进程极有可能变成僵尸进程),在ros2中其实有更好的方案,生命周期节点(详细见动手学ros2中介绍)
-
@小鱼 会不会是一个节点不能同时提供多个服务,多个服务同时运行会不会导致节点卡死,或者锁死之类的问题,导致我这种情况?
-
@哦哦哦 同一个节点肯定是可以提供多个服务的,但是默认情况服务的对请求处理是顺序的,不能并行,如果其中某一个处理堵塞,就会导致后续的无法处理也进不来,解决方法可以使用回调组(详见动手学ROS2教程),不过最好不要堵塞.
-
@小鱼 好的 谢谢 我去调试一下看看
-
@哦哦哦 老哥,你的问题解决了吗,我也遇到了类似的问题
-
@846863428 可以ros2 service list -t 查看参数接口是否正确,如果是empty的话,不用加传参,有参数就必须要传参的,如果是多个node同时调用同意给service,可以加callback_group来排队处理