diff --git a/launch/step_0.launch.py b/launch/step_0.launch.py index cea1f5a3b42016b2fe842153b878522543e75059..aab3dd7f42abb0fb7ffa5bae58b75392b983fa11 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'. ) ]) diff --git a/lesson_05/step_4.py b/lesson_05/step_4.py index 0aadceeac49995ffb174c923ca75f496161bf2eb..2ef917c2d6862bfb1828af1c231f612d7b944a19 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()