Raspberry Pi 无法订阅从基本 PC 发布的 ros 主题,但反之亦然?
Raspberry Pi is not able to subscribe to ros topic published from base PC but vice-verse is working?
我正在为 RPi 3B+ 使用 ubiquityrobotics Raspberry Pi image,即 Ubuntu Xenial 和 ROS Kinetic。我的基础计算机是 运行ning Ubuntu 18.04 并且安装了 ROS Melodic。
我在基础 PC 中创建了 subo_base
工作区,在 RPi 中创建了 subo_rpi
工作区(通过 ssh 评估 RPi)。
然后我在基础 PC 和 RPi 中创建了一个包,并在每个包中添加了发布者和订阅者 (http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28python%29) 文件。
当我 运行 来自 RPi 的发布者时,基础 PC 能够订阅,但是当我从基础 PC 发布时,RPi 不显示任何输出并保持卡住(即使主题在 RPi 上可见使用 rostopic list
).
Base PC is able to subscribe to RPi
RPi unable to subscribe to topic from PC
部分代码用于基础 PC
aakash@aakash:~$ mkdir -p ~/subo_base/src
aakash@aakash:~$ cd ~/subo_base/
aakash@aakash:~/subo_base$ catkin_make
aakash@aakash:~/subo_base$ source devel/setup.bash
aakash@aakash:~/subo_base$ echo $ROS_PACKAGE_PATH
aakash@aakash:~/subo_base$ cd ~/subo_base/src/
aakash@aakash:~/subo_base/src$ catkin_create_pkg motion_plan std_msgs rospy roscpp
连接树莓派
aakash@aakash:~/subo_base/src/motion_plan/scripts$ export ROS_MASTER_URI=http://ubiquityrobot.local:11311
aakash@aakash:~/subo_base/src/motion_plan/scripts$ export ROS_IP='hostname -I'
此外,我可以通过 ssh scp
与基本 PC 之间传输文件 scp
所以我猜 netwkr 可能不是问题所在?
问题很可能是主机名解析 and/or ROS 网络变量配置。
我不喜欢在变量中使用主机名,所以我将仅使用 IP 给出示例。
此外,'hostname -I'
绝对不适合在所有情况下设置您的 ROS_IP 变量。所以这也可能是您问题的根源之一。
来自主机名手册页
-I, --all-ip-addresses>
Display all network addresses of the host. This option enumerates all configured addresses on all network interfaces. The loop‐back interface and IPv6 link-local addresses are omitted. Contrary to option -i, this option does not depend on name resolution. Do not make any assumptions about the order of
the output.
您会想要使用您需要的任何特定 ip 地址,因此只需使用它或找到更好的方法来确定要设置的 ip。 echo $ROS_IP
或 printenv | grep ROS
会告诉您当前设置的变量,以便您验证它是否设置正确。
为了证明一切正常,您可以尝试以下操作:
假设您的树莓派 ip 是 192.168.0.2,PC ip 是 192.168.0.3
您将需要决定哪台机器将成为主机,对于本示例,我假设 PC 将成为主机。
In a terminal on the PC run the following commands:
roscore
在不同的终端运行(这用来代替 subscriber/publisher 节点来测试是否正常)
rostopic pub /test/topic std_msgs/String 'Hello World from PC' -r 1
现在在 RPi 的 SSH 终端上 运行:
export ROS_MASTER_URI=http://192.168.0.3:11311 && export ROS_IP=192.168.0.2
现在您应该可以从 SSH window.
回显在 PC 上发布的主题
rostopic echo /test/topic
ctrl+c 退出回显,您可以尝试在 RPi 上发布一些消息,例如:
rostopic pub /test2/topic std_msgs/String 'Hello World from RPi' -r 1
现在在 PC 上打开一个新终端并尝试从 RPi 回显主题,任何使用 ROS 安装空间的终端,通常 source /opt/ros/kinetic/setup.bash
,应该可以工作:
rostopic echo /test2/topic
ROS1
机器 1 [大师]:
- 会 运行
roscore
,但在配置完成之前不要 运行 它。
- IP 为
192.168.1.10
。
1- 运行 终端中的以下内容:
1.1- export ROS_MASTER_URI=http://192.168.1.10:11311
.
1.2- export ROS_IP=192.168.1.10
.
2- 现在,运行 roscore
.
机器 2 [从机]
- 不会 运行
roscore
.
- 拥有 IP
192.168.1.15
。
1- 运行 终端中的以下内容:
1.1- export ROS_MASTER_URI=http://192.168.1.10:11311
.
1.2- export ROS_IP=192.168.1.15
.
2- 现在,您已连接到 Master。
ROS2
ROS2 将立即填充 LAN 上的信息,无需任何配置。
我正在为 RPi 3B+ 使用 ubiquityrobotics Raspberry Pi image,即 Ubuntu Xenial 和 ROS Kinetic。我的基础计算机是 运行ning Ubuntu 18.04 并且安装了 ROS Melodic。
我在基础 PC 中创建了 subo_base
工作区,在 RPi 中创建了 subo_rpi
工作区(通过 ssh 评估 RPi)。
然后我在基础 PC 和 RPi 中创建了一个包,并在每个包中添加了发布者和订阅者 (http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28python%29) 文件。
当我 运行 来自 RPi 的发布者时,基础 PC 能够订阅,但是当我从基础 PC 发布时,RPi 不显示任何输出并保持卡住(即使主题在 RPi 上可见使用 rostopic list
).
Base PC is able to subscribe to RPi
RPi unable to subscribe to topic from PC
部分代码用于基础 PC
aakash@aakash:~$ mkdir -p ~/subo_base/src
aakash@aakash:~$ cd ~/subo_base/
aakash@aakash:~/subo_base$ catkin_make
aakash@aakash:~/subo_base$ source devel/setup.bash
aakash@aakash:~/subo_base$ echo $ROS_PACKAGE_PATH
aakash@aakash:~/subo_base$ cd ~/subo_base/src/
aakash@aakash:~/subo_base/src$ catkin_create_pkg motion_plan std_msgs rospy roscpp
连接树莓派
aakash@aakash:~/subo_base/src/motion_plan/scripts$ export ROS_MASTER_URI=http://ubiquityrobot.local:11311
aakash@aakash:~/subo_base/src/motion_plan/scripts$ export ROS_IP='hostname -I'
此外,我可以通过 ssh scp
与基本 PC 之间传输文件 scp
所以我猜 netwkr 可能不是问题所在?
问题很可能是主机名解析 and/or ROS 网络变量配置。
我不喜欢在变量中使用主机名,所以我将仅使用 IP 给出示例。
此外,'hostname -I'
绝对不适合在所有情况下设置您的 ROS_IP 变量。所以这也可能是您问题的根源之一。
来自主机名手册页
-I, --all-ip-addresses>
Display all network addresses of the host. This option enumerates all configured addresses on all network interfaces. The loop‐back interface and IPv6 link-local addresses are omitted. Contrary to option -i, this option does not depend on name resolution. Do not make any assumptions about the order of the output.
您会想要使用您需要的任何特定 ip 地址,因此只需使用它或找到更好的方法来确定要设置的 ip。 echo $ROS_IP
或 printenv | grep ROS
会告诉您当前设置的变量,以便您验证它是否设置正确。
为了证明一切正常,您可以尝试以下操作:
假设您的树莓派 ip 是 192.168.0.2,PC ip 是 192.168.0.3
您将需要决定哪台机器将成为主机,对于本示例,我假设 PC 将成为主机。
In a terminal on the PC run the following commands:
roscore
在不同的终端运行(这用来代替 subscriber/publisher 节点来测试是否正常)
rostopic pub /test/topic std_msgs/String 'Hello World from PC' -r 1
现在在 RPi 的 SSH 终端上 运行:
export ROS_MASTER_URI=http://192.168.0.3:11311 && export ROS_IP=192.168.0.2
现在您应该可以从 SSH window.
回显在 PC 上发布的主题
rostopic echo /test/topic
ctrl+c 退出回显,您可以尝试在 RPi 上发布一些消息,例如:
rostopic pub /test2/topic std_msgs/String 'Hello World from RPi' -r 1
现在在 PC 上打开一个新终端并尝试从 RPi 回显主题,任何使用 ROS 安装空间的终端,通常
source /opt/ros/kinetic/setup.bash
,应该可以工作:
rostopic echo /test2/topic
ROS1
机器 1 [大师]:
- 会 运行
roscore
,但在配置完成之前不要 运行 它。 - IP 为
192.168.1.10
。
1- 运行 终端中的以下内容:
1.1- export ROS_MASTER_URI=http://192.168.1.10:11311
.
1.2- export ROS_IP=192.168.1.10
.
2- 现在,运行 roscore
.
机器 2 [从机]
- 不会 运行
roscore
. - 拥有 IP
192.168.1.15
。
1- 运行 终端中的以下内容:
1.1- export ROS_MASTER_URI=http://192.168.1.10:11311
.
1.2- export ROS_IP=192.168.1.15
.
2- 现在,您已连接到 Master。
ROS2
ROS2 将立即填充 LAN 上的信息,无需任何配置。