Skip to content
Snippets Groups Projects
Commit 9c905d69 authored by Sebastian Matz's avatar Sebastian Matz
Browse files

update

parent dca75967
Branches
No related tags found
No related merge requests found
Bilder/algorithmus.jpg

153 KiB

Bilder/render 6.jpg

360 KiB

......@@ -40,6 +40,7 @@ class LineFollowerNode(Node):
try:
# Liniensensor-Daten als Liste von 1/0 verarbeiten
self.line_sensor_data = [int(x) for x in msg.data.split(',')]
self.line_sensor_data.reverse()
self.get_logger().info(f'Line sensor data: {self.line_sensor_data}')
self.control_robot()
except ValueError as e:
......@@ -69,62 +70,41 @@ class LineFollowerNode(Node):
# Sensoren: [rechts, mittig-rechts, mittig, mittig-links, links]
# Linienverfolgungslogik basierend auf den Liniensensoren
# Sensoren: [rechts, mittig-rechts, mittig, mittig-links, links]
if self.line_sensor_data == [0, 0, 1, 0, 0]:
if self.line_sensor_data[2] == 1 and self.line_sensor_data[1] == 1 and self.line_sensor_data[3] == 1:
# Geradeaus
twist.linear.x = 0.2
twist.angular.z = 0.0
elif self.line_sensor_data == [1, 0, 0, 0, 0]:
# Voll nach rechts
twist.linear.x = 0.1
twist.angular.z = -0.7
elif self.line_sensor_data == [0, 0, 0, 0, 1]:
# Voll nach links
twist.linear.x = 0.1
twist.angular.z = 1.0
elif self.line_sensor_data == [1, 1, 0, 0, 0]:
# Medium rechts
twist.linear.x = 0.1
twist.angular.z = -1.0
elif self.line_sensor_data == [0, 0, 0, 1, 1]:
# Medium links
twist.linear.x = 0.1
twist.angular.z = 1.0
elif self.line_sensor_data == [0, 1, 0, 0, 0]:
# Linie leicht nach rechts
twist.linear.x = 0.1
twist.angular.z = -1.0
elif self.line_sensor_data == [0, 0, 0, 1, 0]:
# Linie leicht nach links
twist.linear.x = 0.1
twist.angular.z = 1.0
elif self.line_sensor_data == [0, 1, 1, 1, 0]:
# Linie breit mittig erkannt
twist.linear.x = 0.1
twist.angular.z = 0.0
elif self.line_sensor_data == [1, 1, 1, 0, 0]:
# Breite Linie nach rechts
twist.linear.x = 0.1
twist.angular.z = -0.2
elif self.line_sensor_data == [0, 0, 1, 1, 1]:
# Breite Linie nach links
self.get_logger().info('Geradeaus')
elif self.line_sensor_data[1] == 1:
# Nach links
twist.linear.x = 0.05
twist.angular.z = 0.4
self.get_logger().info('Leicht Links')
elif self.line_sensor_data[3] == 1:
# Nach rechts
twist.linear.x = 0.05
twist.angular.z = -0.4
self.get_logger().info('Leicht Rechts')
elif self.line_sensor_data[2] == 1:
# Geradeaus
twist.linear.x = 0.1
twist.angular.z = 0.2
elif self.line_sensor_data == [1, 1, 1, 1, 1]:
# Komplett schwarze Linie, vermutlich Kreuzung
twist.linear.x = 0.0
twist.angular.z = 0.0
self.get_logger().info('Geradeaus')
elif self.line_sensor_data[0] == 1:
# Voll nach links
twist.linear.x = 0.05
twist.angular.z = 0.8
self.get_logger().info('Hart Links')
elif self.line_sensor_data[4] == 1:
# Voll nach rechts
twist.linear.x = 0.05
twist.angular.z = -0.8
self.get_logger().info('Hart Rechts')
else:
# Langsam weiter
# Linie verloren
self.get_logger().warn('Line verloren, fahre geradeaus')
twist.linear.x = 0.05
twist.angular.z = 0.0
# else:
# # Linie verloren, leichte Drehung zur Suche
# self.get_logger().warn('Line lost, performing search...')
# twist.linear.x = 0.0
# twist.angular.z = 0.2 # Leicht drehen, um die Linie zu suchen
# Steuerungsbefehle veröffentlichen
self.cmd_vel_publisher.publish(twist)
......
......@@ -69,7 +69,7 @@ Wir bauen auf dem ersten Szenario auf, erweitern es auf insgesamt fünf Liniense
## Einhausung Liniensensoren + Ultraschall
<img src="/Bilder/sensoreinhausung.jpg" alt="Sensoreinhausung" width="600">
<img src="/Bilder/frontal.jpg" alt="Sensoreinhausung" width="600">
Ziel ist es die fünf Liniensensoren und einen Ultraschallsensor mit einem Raspberry Pi Pico auszulesen und über diesen die Messwerte per serieller USB Schnittstelle an den Raspberry Pi 4 weiterzugeben. Hierfür braucht es ein Gehäuse in welchem
- 1x HC-SR04,
......@@ -104,9 +104,13 @@ Platz finden. Dieses wird vorne an den Turtlebot angebracht. Der USB Port des Pi
## ROS2 Code
<img src="/Bilder/ros_architektur.jpg" alt="Sensoren" width="800">
<img src="/Bilder/ros_architektur.jpg" alt="ROS2 Architektur" width="800">
<img src="/Bilder/algorithmus.jpg" alt="Algorithmus" width="800">
Die beiden ROS2 Nodes finden sich [hier](/Code/ROS_Nodes_fuer_5_Sensoren). Die Benutzung funktioniert analog zum ersten Beispiel.
Die beiden ROS2 Nodes finden sich [hier](/Code/ROS_Nodes_fuer_5_Sensoren).
![Turtlebot fährt eine Acht](/Bilder/acht.mp4)
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
ISO-10303-21;
HEADER;
/* Generated by software containing ST-Developer
* from STEP Tools, Inc. (www.steptools.com)
*/
FILE_DESCRIPTION(
/* description */ (''),
/* implementation_level */ '2;1');
FILE_NAME(
/* name */ 'spacer.stp',
/* time_stamp */ '2025-01-13T19:50:38+01:00',
/* author */ ('seb'),
/* organization */ (''),
/* preprocessor_version */ 'ST-DEVELOPER v20',
/* originating_system */ 'Autodesk Inventor 2025',
/* authorisation */ '');
FILE_SCHEMA (('AUTOMOTIVE_DESIGN { 1 0 10303 214 3 1 1 }'));
ENDSEC;
DATA;
#10=MECHANICAL_DESIGN_GEOMETRIC_PRESENTATION_REPRESENTATION('',(#13),#134);
#11=SHAPE_REPRESENTATION_RELATIONSHIP('SRR','None',#141,#12);
#12=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#14),#133);
#13=STYLED_ITEM('',(#150),#14);
#14=MANIFOLD_SOLID_BREP('Volumenk\X\F6rper1',#65);
#15=FACE_BOUND('',#26,.T.);
#16=FACE_BOUND('',#28,.T.);
#17=PLANE('',#94);
#18=PLANE('',#95);
#19=FACE_OUTER_BOUND('',#23,.T.);
#20=FACE_OUTER_BOUND('',#24,.T.);
#21=FACE_OUTER_BOUND('',#25,.T.);
#22=FACE_OUTER_BOUND('',#27,.T.);
#23=EDGE_LOOP('',(#47,#48,#49,#50));
#24=EDGE_LOOP('',(#51,#52,#53,#54));
#25=EDGE_LOOP('',(#55));
#26=EDGE_LOOP('',(#56));
#27=EDGE_LOOP('',(#57));
#28=EDGE_LOOP('',(#58));
#29=LINE('',#121,#31);
#30=LINE('',#127,#32);
#31=VECTOR('',#102,2.25);
#32=VECTOR('',#109,3.75);
#33=CIRCLE('',#89,2.25);
#34=CIRCLE('',#90,2.25);
#35=CIRCLE('',#92,3.75);
#36=CIRCLE('',#93,3.75);
#37=VERTEX_POINT('',#118);
#38=VERTEX_POINT('',#120);
#39=VERTEX_POINT('',#124);
#40=VERTEX_POINT('',#126);
#41=EDGE_CURVE('',#37,#37,#33,.T.);
#42=EDGE_CURVE('',#37,#38,#29,.T.);
#43=EDGE_CURVE('',#38,#38,#34,.T.);
#44=EDGE_CURVE('',#39,#39,#35,.T.);
#45=EDGE_CURVE('',#39,#40,#30,.T.);
#46=EDGE_CURVE('',#40,#40,#36,.T.);
#47=ORIENTED_EDGE('',*,*,#41,.F.);
#48=ORIENTED_EDGE('',*,*,#42,.T.);
#49=ORIENTED_EDGE('',*,*,#43,.T.);
#50=ORIENTED_EDGE('',*,*,#42,.F.);
#51=ORIENTED_EDGE('',*,*,#44,.F.);
#52=ORIENTED_EDGE('',*,*,#45,.T.);
#53=ORIENTED_EDGE('',*,*,#46,.T.);
#54=ORIENTED_EDGE('',*,*,#45,.F.);
#55=ORIENTED_EDGE('',*,*,#44,.T.);
#56=ORIENTED_EDGE('',*,*,#41,.T.);
#57=ORIENTED_EDGE('',*,*,#46,.F.);
#58=ORIENTED_EDGE('',*,*,#43,.F.);
#59=CYLINDRICAL_SURFACE('',#88,2.25);
#60=CYLINDRICAL_SURFACE('',#91,3.75);
#61=ADVANCED_FACE('',(#19),#59,.F.);
#62=ADVANCED_FACE('',(#20),#60,.T.);
#63=ADVANCED_FACE('',(#21,#15),#17,.T.);
#64=ADVANCED_FACE('',(#22,#16),#18,.F.);
#65=CLOSED_SHELL('',(#61,#62,#63,#64));
#66=DERIVED_UNIT_ELEMENT(#69,1.);
#67=DERIVED_UNIT_ELEMENT(#136,-3.);
#68=DIMENSIONAL_EXPONENTS(0.,1.,0.,0.,0.,0.,0.);
#69=(
CONVERSION_BASED_UNIT('gram',#71)
MASS_UNIT()
NAMED_UNIT(#68)
);
#70=(
MASS_UNIT()
NAMED_UNIT(*)
SI_UNIT(.KILO.,.GRAM.)
);
#71=MASS_MEASURE_WITH_UNIT(MASS_MEASURE(0.001),#70);
#72=DERIVED_UNIT((#66,#67));
#73=MEASURE_REPRESENTATION_ITEM('density measure',
POSITIVE_RATIO_MEASURE(1.),#72);
#74=PROPERTY_DEFINITION_REPRESENTATION(#79,#76);
#75=PROPERTY_DEFINITION_REPRESENTATION(#80,#77);
#76=REPRESENTATION('material name',(#78),#133);
#77=REPRESENTATION('density',(#73),#133);
#78=DESCRIPTIVE_REPRESENTATION_ITEM('Generisch','Generisch');
#79=PROPERTY_DEFINITION('material property','material name',#143);
#80=PROPERTY_DEFINITION('material property','density of part',#143);
#81=DATE_TIME_ROLE('creation_date');
#82=APPLIED_DATE_AND_TIME_ASSIGNMENT(#83,#81,(#143));
#83=DATE_AND_TIME(#84,#85);
#84=CALENDAR_DATE(2025,7,1);
#85=LOCAL_TIME(0,0,0.,#86);
#86=COORDINATED_UNIVERSAL_TIME_OFFSET(0,0,.BEHIND.);
#87=AXIS2_PLACEMENT_3D('',#116,#96,#97);
#88=AXIS2_PLACEMENT_3D('',#117,#98,#99);
#89=AXIS2_PLACEMENT_3D('',#119,#100,#101);
#90=AXIS2_PLACEMENT_3D('',#122,#103,#104);
#91=AXIS2_PLACEMENT_3D('',#123,#105,#106);
#92=AXIS2_PLACEMENT_3D('',#125,#107,#108);
#93=AXIS2_PLACEMENT_3D('',#128,#110,#111);
#94=AXIS2_PLACEMENT_3D('',#129,#112,#113);
#95=AXIS2_PLACEMENT_3D('',#130,#114,#115);
#96=DIRECTION('axis',(0.,0.,1.));
#97=DIRECTION('refdir',(1.,0.,0.));
#98=DIRECTION('center_axis',(0.,0.,1.));
#99=DIRECTION('ref_axis',(-1.,0.,0.));
#100=DIRECTION('center_axis',(0.,0.,-1.));
#101=DIRECTION('ref_axis',(-1.,0.,0.));
#102=DIRECTION('',(0.,0.,-1.));
#103=DIRECTION('center_axis',(0.,0.,-1.));
#104=DIRECTION('ref_axis',(-1.,0.,0.));
#105=DIRECTION('center_axis',(0.,0.,1.));
#106=DIRECTION('ref_axis',(1.,0.,0.));
#107=DIRECTION('center_axis',(0.,0.,1.));
#108=DIRECTION('ref_axis',(1.,0.,0.));
#109=DIRECTION('',(0.,0.,-1.));
#110=DIRECTION('center_axis',(0.,0.,1.));
#111=DIRECTION('ref_axis',(1.,0.,0.));
#112=DIRECTION('center_axis',(0.,0.,1.));
#113=DIRECTION('ref_axis',(1.,0.,0.));
#114=DIRECTION('center_axis',(0.,0.,1.));
#115=DIRECTION('ref_axis',(1.,0.,0.));
#116=CARTESIAN_POINT('',(0.,0.,0.));
#117=CARTESIAN_POINT('Origin',(0.,0.,0.));
#118=CARTESIAN_POINT('',(2.25,2.75545529808154E-16,10.));
#119=CARTESIAN_POINT('Origin',(0.,0.,10.));
#120=CARTESIAN_POINT('',(2.25,2.75545529808154E-16,0.));
#121=CARTESIAN_POINT('',(2.25,2.75545529808154E-16,0.));
#122=CARTESIAN_POINT('Origin',(0.,0.,0.));
#123=CARTESIAN_POINT('Origin',(0.,0.,0.));
#124=CARTESIAN_POINT('',(-3.75,-4.59242549680257E-16,10.));
#125=CARTESIAN_POINT('Origin',(0.,0.,10.));
#126=CARTESIAN_POINT('',(-3.75,-4.59242549680257E-16,0.));
#127=CARTESIAN_POINT('',(-3.75,-4.59242549680257E-16,0.));
#128=CARTESIAN_POINT('Origin',(0.,0.,0.));
#129=CARTESIAN_POINT('Origin',(0.,0.,10.));
#130=CARTESIAN_POINT('Origin',(0.,0.,0.));
#131=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.01),#135,
'DISTANCE_ACCURACY_VALUE',
'Maximum model space distance between geometric entities at asserted c
onnectivities');
#132=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(0.01),#135,
'DISTANCE_ACCURACY_VALUE',
'Maximum model space distance between geometric entities at asserted c
onnectivities');
#133=(
GEOMETRIC_REPRESENTATION_CONTEXT(3)
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#131))
GLOBAL_UNIT_ASSIGNED_CONTEXT((#135,#137,#138))
REPRESENTATION_CONTEXT('','3D')
);
#134=(
GEOMETRIC_REPRESENTATION_CONTEXT(3)
GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((#132))
GLOBAL_UNIT_ASSIGNED_CONTEXT((#135,#137,#138))
REPRESENTATION_CONTEXT('','3D')
);
#135=(
LENGTH_UNIT()
NAMED_UNIT(*)
SI_UNIT(.MILLI.,.METRE.)
);
#136=(
LENGTH_UNIT()
NAMED_UNIT(*)
SI_UNIT(.CENTI.,.METRE.)
);
#137=(
NAMED_UNIT(*)
PLANE_ANGLE_UNIT()
SI_UNIT($,.RADIAN.)
);
#138=(
NAMED_UNIT(*)
SI_UNIT($,.STERADIAN.)
SOLID_ANGLE_UNIT()
);
#139=SHAPE_DEFINITION_REPRESENTATION(#140,#141);
#140=PRODUCT_DEFINITION_SHAPE('',$,#143);
#141=SHAPE_REPRESENTATION('',(#87),#133);
#142=PRODUCT_DEFINITION_CONTEXT('part definition',#147,'design');
#143=PRODUCT_DEFINITION('spacer','spacer',#144,#142);
#144=PRODUCT_DEFINITION_FORMATION('',$,#149);
#145=PRODUCT_RELATED_PRODUCT_CATEGORY('spacer','spacer',(#149));
#146=APPLICATION_PROTOCOL_DEFINITION('international standard',
'automotive_design',2009,#147);
#147=APPLICATION_CONTEXT(
'Core Data for Automotive Mechanical Design Process');
#148=PRODUCT_CONTEXT('part definition',#147,'mechanical');
#149=PRODUCT('spacer','spacer',$,(#148));
#150=PRESENTATION_STYLE_ASSIGNMENT((#151));
#151=SURFACE_STYLE_USAGE(.BOTH.,#154);
#152=SURFACE_STYLE_RENDERING_WITH_PROPERTIES($,#158,(#153));
#153=SURFACE_STYLE_TRANSPARENT(0.);
#154=SURFACE_SIDE_STYLE('',(#155,#152));
#155=SURFACE_STYLE_FILL_AREA(#156);
#156=FILL_AREA_STYLE('',(#157));
#157=FILL_AREA_STYLE_COLOUR('',#158);
#158=COLOUR_RGB('',0.749019607843137,0.749019607843137,0.749019607843137);
ENDSEC;
END-ISO-10303-21;
<img src="/Bilder/igmr.png" alt="IGMR" width="500">
# Navigation mit dem Turtlebot 4
*Eine Projektarbeit von Julian Kühne und Sebastian Matz betreut durch Sophie Charlotte Keunecke am IGMR der RWTH*
*Eine Projektarbeit von Julian Kühne und Sebastian Matz betreut von Sophie Charlotte Keunecke am IGMR der RWTH*
<img src="/Bilder/seitlich.jpg" alt="Turtlebot" width="800">
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment