我使用ROS从PC到RaspberryPi存在通信问题,因为我无法从PC向Rasp发送消息,反之亦然。我不明白问题出在哪里。
我正在我的PC和RaspberryPi上运行ros-kinetic,并在两台机器上实现了ros_pub和ros_sub包。我想在PC上使用ros_pub包发布传感器消息主题,并在RaspberryPi上使用ros_sub包订阅该传感器消息主题。
主URI正在RaspberryPi上运行。
publisher.朋友
#!/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.朋友
#!/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_sub subscriber.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,Subscriber为PC。
问题出在哪里?什么是解决方案?
另外,使用rospy_tutorials我试图在PC上运行talker.py,在RaspberryPi上运行listener.py,我无法在RaspberryPi上收到消息。
另外,我有一个基本问题,如下所述:在PC上
netcat -l 1234
是Raspi
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
因此,在彻底了解我的问题并收集有关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
该问题与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