状态监控示例
约 608 字大约 2 分钟
2025-05-29
该示例展示了如何使用 Magicbot-Gen1 SDK 进行初始化、连接机器人、机器人状态监控(故障、BMS)等基本操作。
C++
示例文件:monitor_example.cpp
参考文档:monitor_reference.md
#include "magic_robot.h"
#include <unistd.h>
#include <csignal>
#include <iostream>
using namespace magic::gen1;
magic::gen1::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.54.111";
// Configure local IP address for direct network connection and initialize SDK
if (!robot.Initialize(local_ip)) {
std::cerr << "robot sdk initialize 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 5s
usleep(5000000);
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
参考文档:monitor_reference.md
完整代码示例
#!/usr/bin/env python3
import sys
import time
import signal
import logging
from typing import Optional
import magicbot_gen1_python as magicbot
# Configure logging format and level
logging.basicConfig(
level=logging.INFO, # Minimum log level
format="%(asctime)s [%(levelname)s] %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
# Global variables
robot: Optional[magicbot.MagicRobot] = None
def signal_handler(signum, frame):
"""Signal handler function for graceful exit"""
global robot
logging.info("Received interrupt signal (%s), exiting...", signum)
if robot:
robot.disconnect()
logging.info("Robot disconnected")
robot.shutdown()
logging.info("Robot shutdown")
exit(-1)
def main():
"""Main function"""
global robot
# Bind signal handler
signal.signal(signal.SIGINT, signal_handler)
logging.info("Robot model: %s", magicbot.get_robot_model())
# Create robot instance
robot = magicbot.MagicRobot()
try:
# Configure local IP address for direct network connection and initialize SDK
local_ip = "192.168.54.111"
if not robot.initialize(local_ip):
logging.error("Failed to initialize robot SDK")
robot.shutdown()
return -1
# Connect to robot
status = robot.connect()
if status.code != magicbot.ErrorCode.OK:
logging.error(
"Failed to connect to robot, code: %s, message: %s",
status.code,
status.message,
)
robot.shutdown()
return -1
logging.info("Successfully connected to robot")
# Wait 5 seconds
logging.info("Waiting 5 seconds...")
time.sleep(5)
# Get state monitor
monitor = robot.get_state_monitor()
# Get current state
state = monitor.get_current_state()
# Print battery information
logging.info("Battery health: %s", state.bms_data.battery_health)
logging.info("Battery percentage: %s%%", state.bms_data.battery_percentage)
logging.info("Battery state: %s", state.bms_data.battery_state)
logging.info("Power supply status: %s", state.bms_data.power_supply_status)
# Print fault information
faults = state.faults
for fault in faults:
logging.info(
"Error code: %s, Error message: %s",
fault.error_code,
fault.error_message,
)
return 0
except Exception as e:
logging.error("Exception occurred during program execution: %s", e)
return -1
finally:
# Clean up resources
try:
logging.info("Clean up resources")
# Close state monitor
monitor = robot.get_state_monitor()
monitor.shutdown()
# Disconnect
robot.disconnect()
logging.info("Robot connection disconnected")
# Shutdown robot
robot.shutdown()
logging.info("Robot shutdown")
except Exception as e:
logging.error("Exception occurred while cleaning up resources: %s", e)
if __name__ == "__main__":
sys.exit(main())
运行说明
- 环境准备:
# 设置环境变量
export PYTHONPATH=/opt/magic_robotics/magicbot_gen1_sdk/lib:$PYTHONPATH
export LD_LIBRARY_PATH=/opt/magic_robotics/magicbot_gen1_sdk/lib:$LD_LIBRARY_PATH
- 运行示例:
# C++
./monitor_example
# Python
python3 monitor_example.py
- 停止程序:
- 按
Ctrl+C
可以安全停止程序 - 程序会自动清理所有资源