From dcf391e744c3ea183d1b32e323d907173599eb64 Mon Sep 17 00:00:00 2001 From: Vasilii_Sokolov Date: Sun, 18 Feb 2024 04:39:04 +0300 Subject: [PATCH 1/2] p-controller added --- launch/step_0.launch.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/launch/step_0.launch.py b/launch/step_0.launch.py index cea1f5a..aab3dd7 100644 --- a/launch/step_0.launch.py +++ b/launch/step_0.launch.py @@ -11,9 +11,17 @@ def generate_launch_description(): name='sim' ), Node( - package='lesson_05', - namespace='', - executable='step_0', - name='square' + package='lesson_05', #указывает на имя пакета, к которому относится данный узел (node). В данном случае, узел относится к пакету 'lesson_05'. + namespace='', #определяет пространство имен, в котором находится узел. В данном случае, пространство имен пустое, что означает, что узел находится в + # глобальном пространстве имен. + executable='step_0', #указывает на исполняемый файл, который будет запущен для данного узла. В этом случае, исполняемый файл называется 'step_0'. + name='square' #задает имя данного узла. В данном случае, узел называется 'square'. + ), + Node( #В данном примере, указан пакет 'rqt', который содержит исполняемый файл 'rqt'. + package='rqt', #указывает на имя пакета, к которому относится нода. В данном случае, узел относится к пакету 'rqt' + namespace='', #определяет пространство имен, в котором находится узел. В данном случае, пространство имен пустое, что означает, что узел находится в + # глобальном пространстве имен. + executable='rqt', #указывает на исполняемый файл, который будет запущен для данного узла. В этом случае, исполняемый файл называется 'rqt. + name='some_rqt' #задает имя данного узла. В данном случае, узел называется 'some_rqt'. ) ]) -- GitLab From e65809b77e76271d6d87cc62ee3c845310ef89ef Mon Sep 17 00:00:00 2001 From: Vasilii_Sokolov Date: Sun, 18 Feb 2024 04:39:39 +0300 Subject: [PATCH 2/2] p-controller added --- lesson_05/step_4.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lesson_05/step_4.py b/lesson_05/step_4.py index 0aadcee..2ef917c 100644 --- a/lesson_05/step_4.py +++ b/lesson_05/step_4.py @@ -27,11 +27,22 @@ class RurMover(Node): msg_pub = Twist() msg_pub.linear.x = self.LINEAR_SPEED error = angle_diff(self.desired_heading, msg.theta) + + # 1. error - разница текущего угла поворота и необходимого угла поворота, получается эта переменная содержит в себе и значение обратной связи и + # и само референсное (так сказать эталонное) значение. + # 2. для реализации p регулятора необходимо взять отклонение (error), умножить его на константу (С) и выдать(?) его в качестве управляющего воздействия. + # 3. в исходном коде,как я понимаю,управляющее воздействие - поворот на 90 - слишком резкий, таким образом нужно поворачить не на 90 градусов, а на угол, зависящий от error + # 4. если есть разница в желаемом и фактическом углах поворота, то, наверное, нужно все время поворачивать на error*С, пока углы не сровняются + # 5. теперь нужно понять как задать С, чему эту константу сделать равной. как я поняла из статьи, подбор коэффициентов на примере "Пропорциональное управление двигателем с редуктором" + # был эмпирическим - смотрели на поведение системы при каждом конкретном коэф-те. Пусть в данном решении константа будет принята 0,5. + + С = 0.5; + if error < 0: - msg_pub.angular.z = math.radians(90.0) + msg_pub.angular.z = math.radians(С*error) self.get_logger().info('Turn left') else: - msg_pub.angular.z = math.radians(-90.0) + msg_pub.angular.z = math.radians(-С*error) self.get_logger().info('Turn right') self.publisher_twist.publish(msg_pub) @@ -51,4 +62,4 @@ def main(args=None): rclpy.shutdown() if __name__ == '__main__': - main() \ No newline at end of file + main() -- GitLab