馬達模組使用 === FPGA --- #### 要問冠綸怎麼定義,窩不知道ಥ﹏ಥ,好嘛,對不起辣。 C++ --- 如總覽篇所說,若需要個別的控制每一個模組,而不使用四足的專案,那麼只需要執行NodeCore,以及前部分fpga-server的執行檔,和你自己撰寫的模組控制檔案。 模組控制檔案範例如下,以控制第一模組為例: ```cpp= #include "NodeHandler.hpp" #include <boost/thread.hpp> #include "std_msg.hpp" #include "geometry_msg.hpp" #include "motor_msg.hpp" #include "utils.hpp" motor_msg::MotorModule motor_msg; inline void motor_cb(std::shared_ptr<motor_msg::MotorModule> msg) { motor_msg = *msg; } int main(int argc, char* argv[]) { std::string master_ip = "127.0.0.1"; std::string local_ip = "127.0.0.1"; uint32_t port = 9999; double freq = 1000; core::ArgParse aps(argc, argv); aps.get("MasterIP", master_ip); aps.get("MasterPort", port); aps.get("LocalIP", local_ip); aps.get("Frequency", freq); boost::asio::io_context timer_io(1); motor_msg::MotorModule pub_msg; pub_msg.header.seq = 0; pub_msg.header.timestamp = 0; core::NodeHandler nh(master_ip, port, local_ip); core::Subscriber motor_sub = nh.subscriber("/fpga/state1"); core::Publisher motor_pub = nh.publisher("/fpga/command1"); boost::thread node_service(boost::bind(&boost::asio::io_service::run, &core::node_ios)); uint sleep_us = 1000000 / freq; while(1) { boost::asio::deadline_timer timer(timer_io, boost::posix_time::microseconds(sleep_us)); motor_sub.spinOnce(&motor_cb); // get the data of motor state /* ... your operation, for example change absolute position to {pi, pi}*/ pub_msg.angle[0] = pi; pub_msg.angle[1] = pi; pub_msg.state = true; pub_msg.pid = {1, 0, 0, 1, 0, 0}; motor_pub.publish(pub_msg); // send the command data for motor command timer.wait(); } return 0; } ``` 訊息的可讀與可控定義如下,兩顆馬達的順序如前定義,狀態<font face="monospace" color="green">**true**</font>為可以運動的狀態: ```cpp= class MotorModule { public: double angle[2] = {0, 0}; double twist[2] = {0, 0}; double current[2] = {0, 0}; double torque[2] = {0, 0}; bool state[2] = {false, false}; double pid[6] = {0, 0, 0, 0, 0, 0}; // pidpid }; ```