从PC到RaspberryPi的ROS通信

时间:2019-03-23 18:02:31

标签: python raspberry-pi iptables ros netcat

我使用ROS从PC到RaspberryPi出现通信问题,因为我无法从PC到Rasp发送消息,反之亦然。我不明白问题出在哪里。

我在PC和RaspberryPi上运行ros-kinetic,并在两台计算机上都实现了ros_pub和ros_sub软件包。我想在PC上使用ros_pub包发布传感器消息主题,并在RaspberryPi上使用ros_sub包订阅该传感器消息主题。

主URI在RaspberryPi上运行。

publisher.py

#!/usr/bin/python
import rospy
from std_msgs.msg import String
from ros_msgs.msg import SensorInformation

def publisher():
    rospy.init_node('publisher')
    pub = rospy.Publisher('message_topic', SensorInformation, queue_size=1)
    rate = rospy.Rate(1)

    sensor = SensorInformation()
    sensor.data.header.stamp = rospy.Time.now()
    sensor.data.header.frame_id = "Ultrasonic Sensor Frame"
    sensor.data.radiation_type=sensor.data.ULTRASOUND
    #sensor.data.field_of_view = 0.5
    sensor.data.range = 23.10
    #sensor.data.min_range = 0.002
    #sensor.data.max_range= 2.00
    #sensor.part_number = 14320
    #sensor.manufacturer_name= "Sri"

    while not rospy.is_shutdown():
        pub.publish(sensor)
        rate.sleep()

if __name__ == '__main__':
    try:
        publisher()
    except rospy.ROSInterruptException:
        pass

subscriber.py

#!/usr/bin/python
import rospy
from std_msgs.msg import String
from ros_msgs.msg import SensorInformation

def subCallback(data):
    rospy.loginfo(data.data.range)

def subscriber():
    rospy.init_node('subscriber')
    rospy.Subscriber('message_topic', SensorInformation, subCallback)
    rospy.spin()

if __name__ == '__main__':
    try:
        subscriber()
    except rospy.ROSInterruptException:
        pass

SensorInformation.msg

sensor_msgs/Range data
string manufacturer_name
uint32 part_number

PC的.bashrc

export ROS_MASTER_URI=http://192.168.1.81:11311/
export ROS_HOSTNAME=192.168.1.102
export ROS_IP=192.168.1.102

RaspPi的.bashrc

export ROS_MASTER_URI=http://192.168.1.81:11311/
export ROS_HOSTNAME=192.168.1.81
export ROS_IP=192.168.1.81

当我在PC上运行rosrun ros_pub Publisher.py并测试了rostopic echo / message_topic时,主题是否正在同一计算机上发布。它正在发布带有一些数据的消息

并在RaspberryPi上运行rosrun ros_subsubscriber.py,如果我可以看到任何消息数据,并且没有数据,我无法接收消息数据并测试了rostopic echo / message_topic。

这是运行rosnode info / publisher时的结果

rosnode info /publisher 
--------------------------------------------------------------------------------
Node [/publisher]
Publications: 
 * /message_topic [std_msgs/String]
 * /rosout [rosgraph_msgs/Log]

Subscriptions: None

Services: 
 * /publisher/get_loggers
 * /publisher/set_logger_level


contacting node http://192.168.1.102:44631/ ...
ERROR: Communication with node[http://192.168.1.102:44631/] failed!

反之亦然,即,发布者为RaspberryPi,订阅者为PC。

问题可能出在哪里?怎么解决?

此外,我使用rospy_tutorials尝试在PC上运行talker.py,在RaspberryPi上运行listener.py,却无法在RaspberryPi上收到消息。

此外,我有一个基本问题,如下所述: 在PC上

netcat -l 1234

在RaspPi上

netcat 192.168.1.102 1234

这没有任何结果,至少没有错误。

然后我运行下面的内容,该内容没有指向主机的路径,

netcat -nvz -w 1 192.168.1.102 1234
netcat: connect to 192.168.1.102 port 1234 (tcp) failed: No route to host

3 个答案:

答案 0 :(得分:1)

因此,在全面了解我的问题并收集了有关linux网络/配置的知识之后,我意识到问题出在我的PC / Linux的防火墙配置中,这阻止了访问。

基本上,iptables是Linux上的默认防火墙。我通过运行以下命令清除了PC上的iptables规则

# iptables -F
# iptables -X
# iptables -t nat -F
# iptables -t nat -X
# iptables -t mangle -F
# iptables -t mangle -X

那行得通! :D

来源:https://www.cyberciti.biz/tips/no-route-to-host-error-and-solution.html

答案 1 :(得分:1)

我遇到了完全相同的问题!我一直在尝试很多不同的东西,一切都是由于我的 Ubuntu 18.04 防火墙!它阻止了连接,即使我能够 ping 和 rostopic 和 rosnode 列表似乎很好! 但是,这种清除Srivardhan Cholkar给出的iptables规则的方式 对我不起作用,它正在关闭我的互联网连接...

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

我通过运行解决了它:

sudo ufw disable

成功了!

来源:https://linuxconfig.org/how-to-enable-disable-firewall-on-ubuntu-18-04-bionic-beaver-linux

答案 2 :(得分:0)

问题与您的ROS主ROS配置有关。

由于您可以ping主服务器,但订阅者无法订阅主题,因此这表明主计算机(在您的情况下为RaspberryPi)可能不接受远程连接,而仅接受本地连接。为了验证该假设,请尝试在RaspberryPi上同时运行发布者和订阅者,您应该获得期望的结果。如果是这样,则在ROS master上配置以下内容:

export ROS_IP=0.0.0.0

这是监听任何界面。

尝试解决此问题,否则,请尝试以下操作:

将以下内容添加到PC的/etc/hosts

192.168.1.81 PUT_HOSTNAME_OF_RASPBERRYPI_HERE