状态监控示例
约 479 字大约 2 分钟
2025-05-29
该示例展示了如何使用 MagicDog SDK 进行初始化、连接机器人、机器人状态监控(故障、BMS)等基本操作。
C++
示例文件:monitor_example.cpp
参考文档: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
示例文件:monitor_example.py
参考文档: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()
运行说明
- 环境准备:
# 设置环境变量
export PYTHONPATH=/opt/magic_robotics/magicdog_sdk/lib:$PYTHONPATH
export LD_LIBRARY_PATH=/opt/magic_robotics/magicdog_sdk/lib:$LD_LIBRARY_PATH
- 运行示例:
# C++
./monitor_example
# Python
python3 monitor_example.py
- 停止程序:
- 按
Ctrl+C
可以安全停止程序 - 程序会自动清理所有资源