Verwendung von Ultraschallnavigation (Sonar) und Hindernisvermeidung in ROS

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>

Verweise

[1] Zhang Hu, Robot SLAM Navigation Core Technology and Practice [M]. Machinery Industry Press, 2022.

Supongo que te gusta

Origin blog.csdn.net/m0_68732180/article/details/130253916
Recomendado
Clasificación