1. Laden Sie den Code von sonar_layer herunter
https://github.com/DLu/navigation_layers
Tatsächlich muss nur der range_sensor_layer im Arbeitsbereich catkin_make platziert werden. Es wird während des Experiments in src abgelegt und kann zum Ausprobieren als im Navigationsordner abgelegt angesehen werden.
2. Fügen Sie das Plugin in das Ros-System ein
Referenz: http://www.cnblogs.com/W-chocolate/p/4328725.html
Tatsächlich wurde die Konfiguration des heruntergeladenen Quellcodes perfektioniert. Nach Abschluss der Kompilierung wurde der range_sensor_layer in das ROS-System eingefügt. Hier müssen Sie nur cartkin_ws als Quelle angeben und überprüfen: Rospack Plugins --attrib=plugin costmap_2d.
3. Die Verwendung von sonar_layer in costmap_2d (Navigation)
3.1. Konfigurieren Sie sonar_layer-Parameter in costmap_common_params.yaml
sonar_layer:
ns ( string , Standard: "" ): Namespace, wird als Präfix für alle Themen verwendet;
themen(Array von Zeichenfolgen, Standard: ['/sonar']): Listen Sie die Entfernungsthemen auf, die abonniert werden können.
no_readings_timeout (double, Standard: 0.0): Wenn er 0 ist, hat dieser Parameter keine Auswirkung. Andernfalls gibt der Layer eine Warnung aus und wird als markiert, wenn er innerhalb der durch diesen Parameter angegebenen Zeit keine Daten vom Sensor empfängt kein Datenfluss;
clear_threshold( double, default : .2 ): Zellen mit einer Wahrscheinlichkeit kleiner als clear_threshold werden in der Master-Kostenkarte als freier Speicherplatz markiert;
mark_threshold (double, Standard: .8): Zellen mit einer höheren Wahrscheinlichkeit als mark_threshold werden in der Master-Kostenkarte als tödliche Hindernisse markiert.
clear_on_max_reading (bool, Standard: false): Ob die maximale Sonarentfernung gelöscht werden soll.
3.2. Sonar_layer in global_costmap_params.yaml einfügen
Plugins:
- {Name: sonar_layer, Typ: „range_sensor_layer::RangeSensorLayer“}
Tatsächlich können Sie sonar_layer auch in local_costmap_params.yaml einfügen, die Methode ist dieselbe. Wählen Sie einfach den Einfügeort entsprechend Ihren spezifischen Anforderungen.
4. ROS-Treiber für das Ultraschall-Entfernungsmessmodul
Nachdem der Mikrocontroller den Wert des Ultraschall-Entfernungsmessmoduls gelesen hat, sendet er ihn über die serielle Schnittstelle an den ROS-Host. Der ROS-Host muss den ROS-Treiber verwenden, um die Daten von der seriellen Schnittstelle zu empfangen und den Entfernungswert im ROS-Thema zu veröffentlichen . Hier wird der in Python geschriebene ROS-Treiber verwendet. Der Hauptcode des Knotens lautet wie folgt. Andere Konfigurationsdateien zum ROS-Funktionspaket sind üblich und die Speicherplatzbeschränkung wird nicht veröffentlicht.
#!/usr/bin/env python
import rospy
import serial
import binascii
from sensor_msgs.msg import Range
class Sonar():
def __init__(self):
rospy.init_node('sonar_publisher')
self.rate = rospy.get_param('~rate', 10.0)
self.device_port = rospy.get_param('~device_port',"/dev/ttyUSB0")
self.frame_id = rospy.get_param('~sonar_frame_id', '/sonar')
self.field_of_view = rospy.get_param('~field_of_view', 0.1)
self.min_range = rospy.get_param('~min_range', 0.02)
self.max_range = rospy.get_param('~max_range', 4.50)
self.sonar_pub = rospy.Publisher('/sonar', Range, queue_size=50)
self.ser = serial.Serial(self.device_port, 9600, timeout=1)
def handleSonar(self):
sonar = Range()
sonar.header.frame_id = self.frame_id
sonar.radiation_type = Range.ULTRASOUND
sonar.field_of_view = 0.1
sonar.min_range = self.min_range
sonar.max_range = self.max_range
self.ser.write(binascii.a2b_hex('55')) ##modify as your UART command
line = self.ser.readline()
try:
high = ord(line[0])
low = ord(line[1])
distance = (high*256. + low)/1000.
except:
distance = 11.
# print distance,'m'
# print ":".join("{:02x}".format(ord(c)) for c in line)
sonar.header.stamp = rospy.Time.now()
sonar.range = distance
self.sonar_pub.publish(sonar)
def spin(self):
r = rospy.Rate(self.rate)
while not rospy.is_shutdown():
self.handleSonar()
r.sleep()
if __name__ == '__main__':
scanner = Sonar()
rospy.loginfo("=== run")
scanner.spin()
rospy.loginfo("=== end")
Die Startup-Datei des entsprechenden Knotens wird ebenfalls unten veröffentlicht.
<launch>
<node pkg="ultrasonic_sonar" type="sonar.py" name="sonar" output="screen">
<param name="rate" value="10.0"/>
<param name="device_port" value="/dev/ttyUSB1"/>
<param name="sonar_frame_id" value="/sonar"/>
</node>
</launch>