我正在为RPi 3B +使用泛泛性的Raspberry Pi image,这是Ubuntu Xenial和ROS Kinetic。我的基本计算机正在运行Ubuntu 18.04,并安装了ROS Melodic。我在基本PC上创建了subo_base
工作区,并在RPi中创建了subo_rpi
工作区(通过ssh评估RPi)。然后,我在基本PC和RPi中都创建了一个程序包,并在每个程序包中添加了Publisher和Subscriber(http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28python%29)文件。当我从RPi运行发布者时,基本PC可以订阅,但是当我从基本PC进行发布时,RPi不会显示任何输出,并且会停留(即使使用rostopic list
在RPi上可以看到主题)。
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
连接到RPi
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进行文件传输,所以我猜netwkr可能不是问题吗?
问题很可能是主机名解析和/或ROS网络变量配置。
我不喜欢在变量中使用主机名,因此我仅使用IP给出示例。
而且'hostname -I'
绝对不适合在所有情况下设置ROS_IP变量。因此,这也可能是您遇到问题的原因之一。
从主机名手册页
-I,--all-ip-addresses>
显示主机的所有网络地址。此选项枚举所有网络接口上的所有已配置地址。省略了环回接口和IPv6链接本地地址。与选项-i相反,此选项不依赖于名称解析。不要对以下顺序做任何假设输出。
您将要使用所需的任何特定IP地址,因此只需使用该IP地址或找到一种更好的方法来确定要设置的IP。 echo $ROS_IP
或printenv | grep ROS
会告诉您变量当前设置为什么,因此您可以验证其设置是否正确。
为了获得最有效的证据,您可以尝试以下操作:
假设您的RPi ip为192.168.0.2,而PC ip为192.168.0.3
您需要确定哪台计算机将成为主计算机,在本例中,我将假定PC将成为主计算机。
在PC的终端中,运行以下命令:
roscore
在不同的终端运行中(用于代替订户/发布者节点来测试是否正常)
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窗口回显在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