问题标签 [ros2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Turtlebot 3 中不存在 Frame[map]?
逐步完成 Turtlebot 3 教程。在使用 python 启动第一个脚本时(如教程中所示),我看不到固定框架(显示和错误),而导航 2 也不允许我按照网站上的说明激活启动。有人可以指导我哪里出错了吗?参考,这从https://navigation.ros.org/getting_started/index.html#installation 固定帧错误开始
python-3.x - 如何使用 ros2 服务触发 asyncio 非阻塞功能(无 Actions)
我遇到的问题是:
要在后台启动异步函数,我需要一个 asycio 事件循环。
这个事件循环通常存在于主线程中,并且在启动时会阻塞该线程的执行(即,在事件循环开始后的代码行直到事件循环被取消才会运行)。
然而,ROS2 有它自己的事件循环(执行器),它通常也运行在主线程中并阻止执行。这意味着很难同时运行两个事件循环
我尝试的解决方案是在单独的线程中启动 asyncio 事件循环。这在 Node 构造函数中启动,并在 Node 解构后停止。
这看起来像这样:
这是一种明智的做法吗?有没有更好的办法?我将如何start_incrementing
使用其他服务取消该服务?(我知道这是动作的用途,但我不能在这种情况下使用它们)。
bash - 在 bash 中终止 ros2 节点
我目前有一个启动我的 ros2 节点的 bash 脚本。这工作得很好。我现在尝试将脚本作为后台任务启动并将输出写入文件。这样做时,我无法在以后终止节点。以前我通过点击Ctrl + C
终端来终止它,所有节点都停止了。我尝试通过在启动脚本时保存 PID 然后将其杀死来做同样的事情,但是节点继续运行。
是否有可能停止脚本启动的所有节点?停止所有 ros2 节点是不可能的,因为我并行启动了多个节点。
开始
停止
python - 安装程序应该是本地项目的路径或以 svn+、git+、hg+ 或 bzr+ 开头的 VCS url
我正在尝试使用以下命令通过 pip 进行本地安装:
并收到以下错误:
docker - 与 docker 容器中的 ROS2 节点通信的问题
我正在学习ROS2。我有一个 docker 容器,里面安装了 ROS2 foxy。
这个容器安装了很多其他的东西,所以我最好处理它而不是从 DockerHub 下载的东西。
容器基于 Ubuntu 18.04,我的主机运行 Ubuntu 20.04。
以下不起作用:
在主机上:$ docker run --net host -it <container name>
内部容器:
在另一个终端的同一主机上:
订阅者没有输出。
同时,我看到开放的 UDP 端口:
186xxxx开头的PID属于主机上的ros2_daemon,210xxxx开头的PID属于python,在容器中运行。
如果我/bin/bash
在容器中的另一个执行订阅者,它可以工作,即订阅者打印它从发布者接收到的消息。
多播 UDP 数据报也可以工作:
在容器中:
在主机上:
更新。我试过拉标准容器 osrf/ros:foxy-desktop ... 并且示例按预期工作。
容器中的发布者:
主机上的订阅者:
更新 2:
回到原来的容器。我在 netstat 中看到两个具有相同端口号 7400 的 UDP 套接字。可以吗?
更新:是的,它是:https ://stackoverflow.com/a/1694148
在上面netstat的输出中观察到同样的现象,但是端口号不同。
和流程:
ID 为 2319288 的进程正在从主机运行,我不小心切断了 ps 的输出。
更新 3
如果我在没有 的情况下运行 docker 容器
--net=host
,那么我的订阅者会看到来自发布者的消息。我买不起这个,因为在网络中看不到 docker 容器。我已将容器中的订阅者替换为 netcat (
netcat -l -u 42900
) - 容器中的 netcat 已收到来自在其外部工作的发布者的消息。容器运行--net=host
它表明容器中的网络一切正常,但 ROS2 以某种方式错误地使用它。
我该如何纠正?
c++ - 在 C++ 中为 ROS2 寻找 cv_bridge 示例
我一直在尝试在 C++ 中找到一些示例代码,以深入了解如何将 cv_bridge 用于 ROS2,但是我得到的唯一示例是来自 ROS1 的示例。鉴于它使用 sharedPtr 而不是默认值。任何人都可以通过分享如何执行从 sensor_msgs::msg::Image 订阅的 cv_bridge 教程中所说的类似任务并将其转换为可以由 openCV 函数操作的东西来启发我吗?任何建议表示赞赏,我在这封邮件中附上了我的代码。
c++ - 传递给类初始化时 std::string 的值发生变化
这个错误不容易复制,因为我在 Windows 上使用 ROS 2 并且安装不是那么简单,但我认为这是一个 Visual Studio 问题,所以也许你们知道这里发生了什么。
我想在 Visual Studio 2019 项目中使用 ROS 2。为此,我做了以下事情:
- C/C++ > 附加包含目录 = C:\dev\ros2_foxy\include
- 链接器 > 附加库目录 = C:\dev\ros2_foxy\Lib
- Linker > Input > Additional Dependencies = 所有 .lib 文件在
- C:\dev\ros2_foxy\Lib 将所有 .dll 文件复制到 bin 输出
我将路径 C:/ros2_foxy/install/bin 添加到我的环境路径中。
调用 ROS init 函数可以正常工作,因此与 ROS 的连接应该没问题。在 ROS 中,您使用节点进行通信。您自己的节点是从“节点”父类继承的类,并使用节点名称(此处为“pub”)进行初始化,如下所示:
在 ROS 的 node.cpp 中,节点类的定义如下:
当我通过代码进行调试时,node_name 不包含“pub”,而是包含一些随机字符(它们每次都会更改),然后是“p”“u”“b”和“\0”。
因此,我收到“无效节点名称”错误。我试图找出添加随机字符的确切位置,但老实说,我无法找到比这更早的对 node_name 的引用。
我很高兴知道问题可能出在哪里。
编辑:节点类的定义并不简单,因为它来自 ROS。当使用 colcon 和命令行构建时,所有这些都可以正常工作,只有在使用 Visual Studio 构建和运行代码时才会出现问题。但是,如果您有兴趣,可以在此处找到文档并在此处找到实现。
我的测试代码来自“编写发布者”示例教程。
c++ - 如何理解我的 clion 性能分析报告?
我有一个应用程序,某些部分花费的时间太长,现在我对其进行了分析,我编写的所有功能只占总时间的一小部分,大约 20%。从分析报告中可以看出,大部分 80% 用于调用 libc-2.31.so__clone。问题是,我不知道我在哪里以及如何调用这个函数。可能我正在创建的很多对象都在调用它。但是如何确定呢?有没有办法加快这部分的速度?如果我什至现在都不知道这些电话发生在哪里,我该如何加快速度?“外部范围”只是全部,这并没有真正的帮助。
我查看了本指南:https ://www.jetbrains.com/help/idea/read-the-profiling-report.html#profiler-flame-chart ,基于此,我发现了以下调用列表:
但这也对我没有帮助。如何正确确定我的代码的哪一部分使用 clion profiler 需要多长时间?在python中是这样的:
opencv - 如何在 LXC 容器中使用 OpenCV (Python) 访问网络摄像头
我在主机上运行 Ubuntu 18.04,在 LXC 容器内运行 Ubuntu 20.04。我的目标是在 LXC 容器内运行 ROS2(需要 Ubuntu 20.04),然后用它连接两个 dynamixel 伺服电机和一个 USB Logitech 网络摄像头。我还在容器内安装了 miniconda,以便我可以安装 OpenCV 和 dlib。我还在容器内使用 conda 虚拟环境。
所有提到的软件都可以正常工作。现在我需要使用 OpenCV 访问网络摄像头,我使用此命令进行测试
python -c "import cv2;print(cv2.VideoCapture(0).isOpened())"
True
在主机上返回但返回
从容器内部。
到目前为止,我尝试过:
lxc config device add rosfoxy video0 unix-char path=/dev/video0
,并且仍然得到相同的错误video0
。video1
video2
lxc config device add rosfoxy logitech usb vendorid=046d productid=082b
导致Device logitech added to rosfoxy
,但仍然是同样的错误。- 然后我尝试
lxc profile device add ros logitech usb vendorid=046d productid=082b
了哪个结果Device logitech added to ros
。测试时我得到同样的错误。 - 在主机上进行了测试
glxgears
,都可以正常工作。glxinfo
但是,当从 LXC 容器内部测试它们时,它工作正常,但首先出现此错误:
- 在主机上测试
guvcview
,工作正常。但是在容器上,它不起作用,它给出:
你会建议怎么做吗?
更新1:
尝试过lxc config device add rosfoxy video0 unix-char path=/dev/video0 gid=1000
,但似乎没有用。
他们从容器内部尝试过
但是当我添加时,sudo
我得到了:
在我看来,网络摄像头已被检测到!
但我仍然得到
更新 2:
我应该先lxc config device remove rosfoxy video0
发出lxc config device add rosfoxy video0 unix-char path=/dev/video0 gid=1000
感谢 Simos https://discuss.linuxcontainers.org/t/cant-open-camera-by-index-on-lxc-container/10452/8