[{"content":"“learning ROS”\nmkdir -p demo01_ws/src cd demo01_ws/ catkin_make cd src catkin_create_pkg helloworld roscpp rospy std_msg #include \u0026#34;ros/ros.h\u0026#34; int main (int argc, char *argv[]) { ros::init(argc, argv, \u0026#34;hello_node\u0026#34;); ROS_INFO(\u0026#34;hello world\u0026#34;); return 0; } add_executable(haha src/helloworld_c.cpp) target_link_libraries(haha ${catkin_LIBRARIES}) roscore source ./devel/setup.bash rosrun helloworld haha \u0026lt;launch\u0026gt; \u0026lt;node pkg = \u0026#34;turtlesim\u0026#34; type = \u0026#34;turtlesim_node\u0026#34; name = \u0026#34;turtle_GUI\u0026#34;/\u0026gt; \u0026lt;node pkg = \u0026#34;turtlesim\u0026#34; type = \u0026#34;turtle_teleop_key\u0026#34; name = \u0026#34;turtle_key\u0026#34;/\u0026gt; \u0026lt;node pkg = \u0026#34;hello_vscode\u0026#34; type = \u0026#34;hello_vscode_c\u0026#34; name = \u0026#34;hello\u0026#34; output = \u0026#34;screen\u0026#34;/\u0026gt; \u0026lt;/launch\u0026gt; rospack list rospack find turtlesim roscd turtlesim rosls turtlesim apt search ros-noetic-* | grep -i gmapping rosrun rqt_grah rqt_grah #include \u0026#34;ros/ros.h\u0026#34; #include \u0026#34;std_msgs/String.h\u0026#34; #include \u0026lt;sstream\u0026gt; int main (int argc, char *argv[]) { ros::init(argc, argv, \u0026#34;erGouZi\u0026#34;); ros::NodeHandle nh; ros::Publisher pub = nh.advertise\u0026lt;std_msgs::String\u0026gt;(\u0026#34;fang\u0026#34;, 10); std_msgs::String msg; ros::Rate rate(10); int count = 0; ros::Duration(3).sleep(); while (ros::ok()) { count++; std::stringstream ss; ss \u0026lt;\u0026lt; \u0026#34;hello ---\u0026gt;\u0026#34; \u0026lt;\u0026lt; count; //msg.data = \u0026#34;hello\u0026#34;; msg.data = ss.str(); pub.publish = (msg); ROS_INFO(\u0026#34;The published data is:%s\u0026#34;, ss.str().c_str()); rate.sleep(); } return 0; } add_executable(demo01_pub src.demo01_pub.cpp) target_link_libraries(demo01_pub ${catkin_LIBRARIES}) #include \u0026#34;ros/ros.h\u0026#34; #include \u0026#34;std_msgs/String.h\u0026#34; void doMsg(const std_msgs::String::ConstPtr \u0026amp;msg) { ROS_INFO(\u0026#34;cuiHua subsription data:%s\u0026#34;, msg-\u0026gt;data.c_str()) } int main(int argc, char *argv[]) { ros::init(argc, argv, \u0026#34;cuiHua\u0026#34;); ros::NodeHandle nh; ros::Subscriber sub = nh.subcribe(\u0026#34;fang\u0026#34;, 10, doMsg); ros::spin(); return 0; } add_executable(demo02_sub src/deom02_sub.cpp) target_link_libraries(demo01_pub ${catkin_LIBARIES}) rqt_graph Person.msg\nstring name int32 age float32 height package.xml\n\u0026lt;build_depend\u0026gt;message_generation\u0026lt;/build_depend\u0026gt; \u0026lt;exec_depend\u0026gt;message_runtime\u0026lt;/exec_depend\u0026gt; CMakeLists.txt\nfind_package(cakin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation ) add_message_files( FILES Person.msg ) generate_messages( DEPENDENCIES std_msgs ) catkin_package( CATKIN_DEPENDS roscpp rospy std_msgs message_runtime ) demo3_pub_person.cpp\n#include \u0026#34;ros/ros.h\u0026#34; #include \u0026#34;plumbing_pub_sub/Person.h\u0026#34; /* publisher:The publisher\u0026#39;s message 1.Include header files #include \u0026#34;plumbing_pub_sub/Person.h\u0026#34; 2.Initialize the ROS node 3.Create a node handle 4.Create a publisher object 5.Write release logic and release data */ int main(int argc, char *argv[]) { setlocale(LC_ALL, \u0026#34;\u0026#34;); ROS_INFO(\u0026#34;This is the publisher of the message\u0026#34;) // 2.Initialize the ROS node ros::init(argc, argv, \u0026#34;banZhuRen\u0026#34;); // 3.Create a node handle ros::NodeHandle nh; // 4.Create a publisher object ros::Publisher pub = nh.advertise\u0026lt;plumbing_pub_sub::Person\u0026gt;(\u0026#34;liaoTian\u0026#34;, 10); // 5.Write release logic and release data // 5-1.Create published data plumbing_pub_sub::Person person; person.name = \u0026#34;single\u0026#34;; person.age = 1; person.height = 1.73; // 5-2.Setting the publication frequency ros::Rate rate(1); // 5-3.Circular release the data while(ros::ok()) { person.age += 1; pub.publish(person); ROS_INFO(\u0026#34;Published message:%s,%d,%.2f\u0026#34;, person.name.c_str(), person.age, person.height); rate.sleep(); ros::spinOnce(); } return 0; } CMakeLists.txt\nadd_executable(demo03_pub_person src/demo03_pub_person.cpp) target_link_libraries(demo03_pub_person ${catkin_LIBRARIES}) add_dependencies(demo03_pub_person ${PROJECT_NAME}_generate_messages_cpp) souce ./devel/setup.bash rostopic echo liaoTian demo04_sub_person.cpp\n#include \u0026#34;ros/ros.h\u0026#34; #include \u0026#34;plumbing_pub_sub/Person.h\u0026#34; /* Subscriber:Subscribes to message 1.Include header files #include \u0026#34;plumbing_pub_sub/Person.h\u0026#34; 2.Initialize the ROS node 3.Create a node handle 4.Create a subsriber object 5.Process subscription data 6.Call the \u0026#39;spin()\u0026#39; function */ void doPerson(const plumbing_pub_sub::Person::ConstPtr\u0026amp; person) { ROS_INFO(\u0026#34;Subscriber information:%s,%d,%.2f\u0026#34;, person-\u0026gt;name.c_str(), person-\u0026gt;age, person-\u0026gt;height) } int main(int argc, char *argv[]) { setlocale(LC_ALL, \u0026#34;\u0026#34;); ROS_IFNO(\u0026#34;Subscriber implementation\u0026#34;); // 2.Initialize the ROS node ros::init(argc, argv, \u0026#34;jiaZhang\u0026#34;); // 3.Create a node handle ros::NodeHandle nh; // 4.Create a subsriber object ros::Subscriber sub = nh.subscribe(\u0026#34;liaoTian\u0026#34;, 10, doPerson); ros::spin(); return 0; } CMakeLists.txt\nadd_executable(demo04_sub_person src/demo04_sub_person.cpp) add_dependencies(demo04_sub_person ${PROJECT_NAME}_generate_messages_cpp) target_link_libraries(demo04_sub_person ${catkin_LIBRARIES}) rqt_graph\nAddInts.srv\nint32 numl1 int32 numl2 --- int32 sum package.xml\n\u0026lt;bulid_depend\u0026gt;message_generation\u0026lt;/bulid_depend\u0026gt; \u0026lt;exec_depend\u0026gt;message_runtime\u0026lt;/exec_depend\u0026gt; CMakeLists.txt\nfind_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation ) add_service_files( FILES AddInts.srv ) generate_messages( DEPENDENCIES std_msgs ) catkin_package( CATKIN_DEPENDA roscpp rospy std_msgs message_runtime ) demo01_server.cpp\n#include \u0026#34;ros/ros.h\u0026#34; #include \u0026#34;plumbing_server_client/ADDInts.h\u0026#34; /* Server-side implementation:parses the data submitted by the client, calculates and generates a response */ bool doNums(plumbing_server_client::AddInts::Request \u0026amp;request, plumbing_server_client::AddInts::Response \u0026amp;response) { int num1 = request.num1; int num2 = request.num2; ROS_INFO(\u0026#34;Request data received:num1 = %d, num2 = %d\u0026#34;, num1, num2); int sum = num1 + num2; response.sum = sum; ROS_INFO(\u0026#34;Sum result: sum = %d\u0026#34;, sum); return true; } int main(int argc, char *argv[]) { setlocale(LC_ALL,\u0026#34;\u0026#34;); ros::init(argc, argv, \u0026#34;heiShui\u0026#34;); ros::NodeHandle nh; ros::ServiceServer server = nh.advertiseService(\u0026#34;addInts\u0026#34;, doNums); ros::spin(); } CMakeLists.txt\nadd_executable(demo01_server src/demo01_server.cpp) add_dependencies(demo01_server ${PROHECT_NAME}_gencpp) target_link_libraries(demo01_server ${catkin_LIBRARIES} ) \u0026lt;robot name = \u0026#34;mycar\u0026#34;\u0026gt; \u0026lt;link name = \u0026#34;base_footprint\u0026#34;\u0026gt; \u0026lt;visual\u0026gt; \u0026lt;geometry\u0026gt; \u0026lt;box size = \u0026#34;0.0001 0.0001 0.0001\u0026#34; /\u0026gt; \u0026lt;!-- \u0026lt;cylinder radius = \u0026#34;0.1\u0026#34; length = \u0026#34;2\u0026#34;/\u0026gt; --\u0026gt; \u0026lt;!-- \u0026lt;sphere radius = \u0026#34;1\u0026#34; /\u0026gt; --\u0026gt; \u0026lt;/geometry\u0026gt; \u0026lt;/visual\u0026gt; \u0026lt;/link\u0026gt; \u0026lt;link name = \u0026#34;base_link\u0026#34;\u0026gt; \u0026lt;visual\u0026gt; \u0026lt;geometry\u0026gt; \u0026lt;box size = \u0026#34;0.3 0.2 0.1\u0026#34; /\u0026gt; \u0026lt;!-- \u0026lt;cylinder radius = \u0026#34;0.1\u0026#34; length = \u0026#34;2\u0026#34;/\u0026gt; --\u0026gt; \u0026lt;!-- \u0026lt;sphere radius = \u0026#34;1\u0026#34; /\u0026gt; --\u0026gt; \u0026lt;/geometry\u0026gt; \u0026lt;origin xyz = \u0026#34;0 0 0\u0026#34; rpy = \u0026#34;0 0 0\u0026#34;/\u0026gt; \u0026lt;material name = \u0026#34;car_color\u0026#34;\u0026gt; \u0026lt;color rgba = \u0026#34;0.5 0.3 0.7 0.5\u0026#34;/\u0026gt; \u0026lt;/material\u0026gt; \u0026lt;/visual\u0026gt; \u0026lt;/link\u0026gt; \u0026lt;link name = \u0026#34;camera\u0026#34;\u0026gt; \u0026lt;visual\u0026gt; \u0026lt;geometry\u0026gt; \u0026lt;box size = \u0026#34;0.02 0.05 0.05\u0026#34; /\u0026gt; \u0026lt;!-- \u0026lt;cylinder radius = \u0026#34;0.1\u0026#34; length = \u0026#34;2\u0026#34;/\u0026gt; --\u0026gt; \u0026lt;!-- \u0026lt;sphere radius = \u0026#34;1\u0026#34; /\u0026gt; --\u0026gt; \u0026lt;/geometry\u0026gt; \u0026lt;origin xyz = \u0026#34;0 0 0.025\u0026#34; rpy = \u0026#34;0 0 0\u0026#34;/\u0026gt; \u0026lt;material name = \u0026#34;camare_color\u0026#34;\u0026gt; \u0026lt;color rgba = \u0026#34;0.7 0.2 0.3 0.5\u0026#34;/\u0026gt; \u0026lt;/material\u0026gt; \u0026lt;/visual\u0026gt; \u0026lt;/link\u0026gt; \u0026lt;joint name = \u0026#34;link2footprint\u0026#34; type = \u0026#34;fixed\u0026#34;\u0026gt; \u0026lt;parent link = \u0026#34;base_footprint\u0026#34;/\u0026gt; \u0026lt;child link = \u0026#34;base_link\u0026#34;/\u0026gt; \u0026lt;origin xyz = \u0026#34;0 0 0.05\u0026#34; rpy = \u0026#34;0 0 0\u0026#34;/\u0026gt; \u0026lt;/joint\u0026gt; \u0026lt;joint name = \u0026#34;camera2base\u0026#34; type = \u0026#34;continuous\u0026#34;\u0026gt; \u0026lt;parent link = \u0026#34;base_link\u0026#34;/\u0026gt; \u0026lt;child link = \u0026#34;camera\u0026#34;/\u0026gt; \u0026lt;origin xyz = \u0026#34;0.12 0 0.05\u0026#34; rpy = \u0026#34;0 0 0\u0026#34;/\u0026gt; \u0026lt;axis xyz = \u0026#34;0 0 1\u0026#34;/\u0026gt; \u0026lt;/joint\u0026gt; \u0026lt;/robot\u0026gt; ","date":"2022-05-17T23:55:58+08:00","permalink":"https://www.gechengzhen.com/en/posts/leaning-ros/","title":"learning ros"},{"content":"“learning foc”\n代码 int Vd = 0; int Vq = 1; float theta = 0.0; float Valpha = 0.0; float Vbeta = 0.0; float out1 = 0.0; float out2 = 0.0; float out3 = 0.0; while (1) { theta = angle; Valpha = Vd * cos(theta) - Vq * sin(theta); Vbeta = Vd * sin(theta) + Vq * cos(theta); out1 = Valpha; out2 = (-Valpha + Vbeta * sqrt(3)) / 2; out3 = (-Valpha - Vbeta * sqrt(3)) / 2; //上面是为了产生三相正弦波 TIM3-\u0026gt;CCR1 = ((out1 + 1) / 2) * 1000; TIM3-\u0026gt;CCR2 = ((out2 + 1) / 2) * 1000; TIM3-\u0026gt;CCR3 = ((out3 + 1) / 2) * 1000; //这是调制pwm /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim == (\u0026amp;htim5)) { angle +=0.1; if (angle \u0026gt; 3.1415926*2) angle = 0; } } 代码解释 首先单片机开三个pwm输出引脚。 angle 变量放在一个定时器中断里面。从0到2Π递增，到2Π归零。产生锯齿波形。锯齿波形的周期越短，得出的三相正弦波周期越短。电机转速越快。想要改变转速即改变中断的频率，即对应定时器ARR的值。==ARR越大电机转的越慢.== 后面的数学运算都是为了将Vd，Vq，angle，变成三相正弦波。控制这三个参数改变正弦波的周期，幅值。用到反park变换，反clark变换等。 最后是将产生的三相正弦波，调制成pwm波。 图像说明 Vq Vd angle 的图像：\n三相正弦波图像：\npwm调制：\n资料链接 【自制FOC驱动器】深入浅出讲解FOC算法与SVPWM技术 - 知乎 (zhihu.com)\nFOC视频教程_哔哩哔哩_bilibili\n彻底搞懂两电平SVPWM调制原理及其仿真_哔哩哔哩_bilibili\n","date":"2022-04-12T16:30:00+08:00","permalink":"https://www.gechengzhen.com/en/posts/foc/","title":"foc"},{"content":"Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.\nQuick Start Create a new post $ hexo new \u0026#34;My New Post\u0026#34; More info: Writing\nRun server $ hexo server More info: Server\nGenerate static files $ hexo generate More info: Generating\nDeploy to remote sites $ hexo deploy More info: Deployment\n","date":"2022-03-29T22:46:10+08:00","permalink":"https://www.gechengzhen.com/en/posts/hello-world/","title":"Hello World"}]