Autonomous Geometric Motion

Concept

By publishing geometry_msgs/Twist messages directly from code, you can make the turtle move without any user input. linear.x controls forward speed; angular.z controls rotation rate (radians/second).

  • Circle: set both linear.x and angular.z to non-zero constants simultaneously
  • Square: alternate between moving forward and turning 90°

File Locations

Both files go in ~/ROBOT/src/robot_pkg/robot_pkg/

circle.py

import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist

def main():
    rclpy.init()
    node = Node('circle_mover')
    pub = node.create_publisher(Twist, '/turtle1/cmd_vel', 10)

    msg = Twist()
    msg.linear.x  = 2.0   # forward speed
    msg.angular.z = 1.0   # turning rate (rad/s)

    def timer_callback():
        pub.publish(msg)

    node.create_timer(0.1, timer_callback)  # publish 10 times/sec
    rclpy.spin(node)
    rclpy.shutdown()

main()

square.py

import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist
import time

def move(pub, lx, az, duration):
    msg = Twist()
    msg.linear.x  = lx
    msg.angular.z = az
    end = time.time() + duration
    while time.time() < end:
        pub.publish(msg)
        time.sleep(0.1)

def main():
    rclpy.init()
    node = Node('square_mover')
    pub = node.create_publisher(Twist, '/turtle1/cmd_vel', 10)

    for _ in range(4):
        move(pub, 2.0, 0.0, 2.0)   # go forward for 2 seconds
        move(pub, 0.0, 1.57, 1.0)  # rotate ~90° in 1 second

    rclpy.shutdown()

main()

Register in setup.py

entry_points={
    'console_scripts': [
        'publisher  = robot_pkg.publisher:main',
        'subscriber = robot_pkg.subscriber:main',
        'circle     = robot_pkg.circle:main',
        'square     = robot_pkg.square:main',
    ],
},

Build and Run

cd ~/ROBOT && colcon build && source install/setup.bash

Terminal 1 — Turtlesim

ros2 run turtlesim turtlesim_node

Terminal 2 — Circle (pick one)

ros2 run robot_pkg circle

Or square:

ros2 run robot_pkg square

Expected Result

  • circle: the turtle draws a smooth continuous circle
  • square: the turtle traces a 4-sided square then stops