import asyncio
from viam.robot.client import RobotClient
from viam.services.navigation import NavigationClient
from viam.proto.common import GeoPoint
from viam.proto.service.navigation import Mode
async def main():
opts = RobotClient.Options.with_api_key(
api_key="YOUR-API-KEY",
api_key_id="YOUR-API-KEY-ID"
)
robot = await RobotClient.at_address("YOUR-MACHINE-ADDRESS", opts)
nav = NavigationClient.from_robot(robot, "my-nav")
# Add a waypoint (replace with your target coordinates)
target = GeoPoint(latitude=40.6640, longitude=-73.9387)
await nav.add_waypoint(target)
print(f"Added waypoint at {target.latitude}, {target.longitude}")
# Start navigating
await nav.set_mode(Mode.MODE_WAYPOINT)
print("Navigation started")
# Monitor progress
while True:
location = await nav.get_location()
waypoints = await nav.get_waypoints()
print(f"Position: {location.latitude:.6f}, {location.longitude:.6f}")
print(f"Remaining waypoints: {len(waypoints)}")
if len(waypoints) == 0:
print("All waypoints reached")
break
await asyncio.sleep(2)
# Stop navigation
await nav.set_mode(Mode.MODE_MANUAL)
await robot.close()
if __name__ == "__main__":
asyncio.run(main())
package main
import (
"context"
"fmt"
"time"
"github.com/golang/geo/s2"
"go.viam.com/rdk/logging"
"go.viam.com/rdk/robot/client"
"go.viam.com/rdk/services/navigation"
"go.viam.com/rdk/utils"
)
func main() {
ctx := context.Background()
logger := logging.NewLogger("nav-test")
robot, err := client.New(ctx, "YOUR-MACHINE-ADDRESS", logger,
client.WithCredentials(utils.Credentials{
Type: utils.CredentialsTypeAPIKey,
Payload: "YOUR-API-KEY",
}),
client.WithAPIKeyID("YOUR-API-KEY-ID"),
)
if err != nil {
logger.Fatal(err)
}
defer robot.Close(ctx)
nav, err := navigation.FromProvider(robot, "my-nav")
if err != nil {
logger.Fatal(err)
}
// Add a waypoint (replace with your target coordinates)
target := s2.LatLngFromDegrees(40.6640, -73.9387)
point := s2.PointFromLatLng(target)
geoPoint := geo.NewPoint(target.Lat.Degrees(), target.Lng.Degrees())
err = nav.AddWaypoint(ctx, geoPoint, nil)
if err != nil {
logger.Fatal(err)
}
fmt.Printf("Added waypoint at %f, %f\n", target.Lat.Degrees(), target.Lng.Degrees())
// Start navigating
err = nav.SetMode(ctx, navigation.ModeWaypoint, nil)
if err != nil {
logger.Fatal(err)
}
fmt.Println("Navigation started")
// Monitor progress
for {
loc, err := nav.Location(ctx, nil)
if err != nil {
logger.Fatal(err)
}
waypoints, err := nav.Waypoints(ctx, nil)
if err != nil {
logger.Fatal(err)
}
fmt.Printf("Position: %f, %f\n", loc.Location().Lat(), loc.Location().Lng())
fmt.Printf("Remaining waypoints: %d\n", len(waypoints))
if len(waypoints) == 0 {
fmt.Println("All waypoints reached")
break
}
time.Sleep(2 * time.Second)
}
// Stop navigation
nav.SetMode(ctx, navigation.ModeManual, nil)
}