State Monitoring Example
About 438 wordsAbout 1 min
2025-05-29
This example demonstrates how to use the MagicDog SDK for initialization, connecting to the robot, and basic operations such as robot state monitoring (faults, BMS).
C++
Example file: monitor_example.cpp
Reference documentation: C++ API/monitor_reference.md
#include "magic_robot.h"
#include <unistd.h>
#include <csignal>
#include <iostream>
using namespace magic::dog;
magic::dog::MagicRobot robot;
void signalHandler(int signum) {
std::cout << "Interrupt signal (" << signum << ") received.\n";
robot.Shutdown();
// Exit process
exit(signum);
}
int main() {
// Bind SIGINT(Ctrl+C)
signal(SIGINT, signalHandler);
std::string local_ip = "192.168.55.10";
// Configure local IP address for direct network connection to machine and initialize SDK
if (!robot.Initialize(local_ip)) {
std::cerr << "Robot SDK initialization failed." << std::endl;
robot.Shutdown();
return -1;
}
// Set RPC timeout to 5s
robot.SetTimeout(5000);
// Connect to robot
auto status = robot.Connect();
if (status.code != ErrorCode::OK) {
std::cerr << "Connect robot failed"
<< ", code: " << status.code
<< ", message: " << status.message << std::endl;
robot.Shutdown();
return -1;
}
// Wait 10s
usleep(10000000);
auto& monitor = robot.GetStateMonitor();
auto state = monitor.GetCurrentState();
std::cout << "Health: " << state.bms_data.battery_health
<< ", Percentage: " << state.bms_data.battery_percentage
<< ", State: " << std::to_string((int8_t)state.bms_data.battery_state)
<< ", Power supply status: " << std::to_string((int8_t)state.bms_data.power_supply_status)
<< std::endl;
auto& faults = state.faults;
for (auto& [code, msg] : faults) {
std::cout << "Code: " << std::to_string(code)
<< ", Message: " << msg;
}
// Disconnect from robot
status = robot.Disconnect();
if (status.code != ErrorCode::OK) {
std::cerr << "Disconnect robot failed"
<< ", code: " << status.code
<< ", message: " << status.message << std::endl;
robot.Shutdown();
return -1;
}
robot.Shutdown();
return 0;
}
Python
Example file: monitor_example.py
Reference documentation: Python API/monitor_reference.md
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
MagicDog SDK Python Usage Example
This file demonstrates how to use MagicDog SDK Python bindings to control the robot.
"""
import sys
import time
import logging
from typing import Optional
logging.basicConfig(
level=logging.INFO, # Minimum log level
format="%(asctime)s [%(levelname)s] %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
try:
import magicdog_python as magicdog
logging.info("Successfully imported MagicDog Python module!")
except ImportError as e:
logging.error(f"Import failed: {e}")
logging.error("Please run build_python.sh to build Python bindings first")
sys.exit(1)
def main():
"""Main function"""
logging.info("MagicDog SDK Python Example Program")
robot = magicdog.MagicRobot()
if not robot.initialize("192.168.55.10"):
logging.error("Initialization failed")
return
robot.set_timeout(5000)
if not robot.connect():
logging.error("Connection failed")
robot.shutdown()
return
time.sleep(10)
monitor = robot.get_state_monitor()
state = monitor.get_current_state()
logging.info(f"health: {state.bms_data.battery_health}, percentage: {state.bms_data.battery_percentage}, state: {state.bms_data.battery_state}, power_supply_status: {state.bms_data.power_supply_status}")
for fault in state.faults:
logging.info(f"code: {fault.error_code}, message: {fault.error_message}")
robot.disconnect()
robot.shutdown()
logging.info("\nExample program execution completed!")
if __name__ == "__main__":
main()
Running Instructions
- Environment Setup:
# Set environment variables
export PYTHONPATH=/opt/magic_robotics/magicdog_sdk/lib:$PYTHONPATH
export LD_LIBRARY_PATH=/opt/magic_robotics/magicdog_sdk/lib:$LD_LIBRARY_PATH
- Run Example:
# C++
./monitor_example
# Python
python3 monitor_example.py
- Stop the Program:
- Press
Ctrl+C
to safely stop the program - The program will automatically clean up all resources