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.xandangular.zto 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.bashTerminal 1 — Turtlesim
ros2 run turtlesim turtlesim_nodeTerminal 2 — Circle (pick one)
ros2 run robot_pkg circleOr square:
ros2 run robot_pkg squareExpected Result¶
- circle: the turtle draws a smooth continuous circle
- square: the turtle traces a 4-sided square then stops