当前位置:   article > 正文

ros之pid_ros参数p i d参数分别是

ros参数p i d参数分别是

PID口诀

参数整定找最佳,从小到[大顺序查 先是比例后积分,最后再把微分加 曲线振荡很频繁,比例度盘要放大 曲线漂浮绕大湾,比例度盘往小扳 曲线偏离回复慢,积分时间往下降 曲线波动周期长,积分时间再加长 曲线振荡频率快,先把微分降下来 动差大来波动慢。微分时间应加长 理想曲线两个波,前高后低4比1 一看二调多分析,调节质量不会低

MainWindow.h

  1. //
  2. // Created by wt on 2020/7/2.
  3. //
  4. #ifndef DEMO_SWEEPING_ROBOT_MAINWINDOW_H
  5. #define DEMO_SWEEPING_ROBOT_MAINWINDOW_H
  6. #include <QWidget>
  7. #include <QLineEdit>
  8. #include <QPushButton>
  9. #include <QFormLayout>
  10. #include <ros/ros.h>
  11. #include <QLabel>
  12. #include <geometry_msgs/Twist.h>
  13. #include <turtlesim/Pose.h>
  14. #include <std_msgs/Float64.h>
  15. #include <thread>
  16. class MainWindow: public QWidget {
  17. private:
  18. QFormLayout layout;
  19. QLineEdit xEdit;
  20. QLineEdit yEdit;
  21. QLabel xLabel;
  22. QLabel yLabel;
  23. QLabel thetaLabel;
  24. QPushButton btn;
  25. QPushButton sweepBtn;
  26. QLineEdit kpEdit;
  27. QLineEdit kdEdit;
  28. QLineEdit kiEdit;
  29. //发布者
  30. ros::Publisher publisher;
  31. //plot发布者
  32. ros::Publisher plotPublisher;
  33. //订阅者
  34. ros::Subscriber subscriber;
  35. //保存的当前x和y
  36. float curx;
  37. float cury;
  38. //小乌龟的角度
  39. float curTheta;
  40. public:
  41. MainWindow(ros::NodeHandle node,QWidget* parent = Q_NULLPTR);
  42. ~MainWindow();
  43. //点击
  44. void click();
  45. //扫地
  46. void sweep();
  47. //纵向扫地
  48. void vSweep();
  49. //求距离
  50. float distance(float curx,float cury,float dstx,float dsty);
  51. //回调
  52. void callBack(const turtlesim::Pose::ConstPtr & pose);
  53. //控制小乌龟
  54. void controlTurtle(float dstx,float dsty);
  55. //计算需要转的角度
  56. float caclAngle(float dstx,float dsty,float curx,float cury,float theta);
  57. };
  58. #endif //DEMO_SWEEPING_ROBOT_MAINWINDOW_H

MainWindow.cpp

  1. //
  2. // Created by wt on 2020/7/2.
  3. //
  4. #include "MainWindow.h"
  5. MainWindow::MainWindow(ros::NodeHandle node, QWidget *parent) : QWidget(parent),
  6. btn("执行"),sweepBtn("扫地") {
  7. //发布者
  8. publisher = node.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 5);
  9. //订阅者
  10. subscriber = node.subscribe("/turtle1/pose", 5, &MainWindow::callBack, this);
  11. //plot发布者
  12. plotPublisher = node.advertise<std_msgs::Float64>("/tutle/speed", 5);
  13. setLayout(&layout);
  14. //默认值
  15. xEdit.setText("5.544444561");
  16. yEdit.setText("5.544444561");
  17. layout.addRow("目标x:", &xEdit);
  18. layout.addRow("目标y:", &yEdit);
  19. layout.addRow("当前x:", &xLabel);
  20. layout.addRow("当前y:", &yLabel);
  21. layout.addRow("当前theta:", &thetaLabel);
  22. kpEdit.setText("0.1");
  23. kdEdit.setText("0.1");
  24. kiEdit.setText("0.1");
  25. layout.addRow("kp:",&kpEdit);
  26. layout.addRow("kd:",&kdEdit);
  27. layout.addRow("ki:",&kiEdit);
  28. layout.addRow("", &btn);
  29. layout.addRow("", &sweepBtn);
  30. //信号和槽绑定
  31. connect(&btn, &QPushButton::clicked, this, &MainWindow::click);
  32. connect(&sweepBtn, &QPushButton::clicked, this, &MainWindow::sweep);
  33. }
  34. MainWindow::~MainWindow() {
  35. }
  36. //真实的速度
  37. void MainWindow::click() {
  38. //当前的x和y
  39. //目标的x和y
  40. float dstx = xEdit.text().toFloat();
  41. float dsty = yEdit.text().toFloat();
  42. //开启线程执行耗时操作
  43. new std::thread(&MainWindow::controlTurtle, this, dstx, dsty);
  44. }
  45. //转向
  46. void MainWindow::controlTurtle(float dstx, float dsty) {
  47. //走的距离
  48. float dst = distance(curx, cury, dstx, dsty);
  49. //走的时间
  50. float time = 5.0;
  51. //调头时间
  52. float turnTime = time/12;
  53. //频率
  54. float hz = 10;
  55. //频率
  56. ros::Rate rate(hz);
  57. //当前速度
  58. float curSpeed = 0;
  59. //记录上一次误差
  60. float lastError = 0;
  61. //总误差
  62. float totalError = 0;
  63. //kp系数
  64. float kp = kpEdit.text().toFloat();
  65. //kd系数
  66. float kd = kdEdit.text().toFloat();
  67. //ki系数
  68. float ki = kiEdit.text().toFloat();
  69. geometry_msgs::Twist data;
  70. while (distance(curx, cury, dstx, dsty) > 0.1) {
  71. //目标速度
  72. float tarSpeed = distance(curx, cury, dstx, dsty) / time;
  73. /*-------------------------- p --------------------------*/
  74. //误差= 目标速度 - 当前速度
  75. float pError = tarSpeed - curSpeed;
  76. //调节速度 当前速度=当前速度 + 误差*kp系数(比例系数)
  77. curSpeed += pError * kp;
  78. /*-------------------------- d --------------------------*/
  79. // dError = 当前误差-记录的上一次误差
  80. float dError = pError - lastError;
  81. //
  82. curSpeed += dError * kd;
  83. //记录当前误差
  84. lastError = pError;
  85. /*-------------------------- i --------------------------*/
  86. // 总误差 = 当前误差累加
  87. totalError += pError;
  88. curSpeed+=totalError*ki;
  89. //数据
  90. data.linear.x = curSpeed;
  91. //角速度
  92. data.angular.z = caclAngle(dstx,dsty,curx,cury,curTheta)/turnTime;
  93. //移动 (只会按照当前这个速度走1秒钟)
  94. publisher.publish(data);
  95. //数据
  96. std_msgs::Float64 sp;
  97. sp.data = curSpeed;
  98. //发送速度给plot展示
  99. plotPublisher.publish(sp);
  100. //剩下的时间
  101. time -= 1 / hz;
  102. //睡眠
  103. rate.sleep();
  104. }
  105. //把速度设置为0
  106. //数据
  107. data.linear.x = 0;
  108. data.angular.z = 0;
  109. //移动 (只会按照当前这个速度走1秒钟)
  110. publisher.publish(data);
  111. }
  112. //D算法
  113. //void MainWindow::controlTurtle(float dstx, float dsty) {
  114. // //走的距离
  115. // float dst = distance(curx, cury, dstx, dsty);
  116. // //走的时间
  117. // float time = 5.0;
  118. // //频率
  119. // float hz = 10;
  120. // //频率
  121. // ros::Rate rate(hz);
  122. // //当前速度
  123. // float curSpeed = 0;
  124. // //记录上一次误差
  125. // float lastError = 0;
  126. // //总误差
  127. // float totalError = 0;
  128. // //kp系数
  129. // float kp = kpEdit.text().toFloat();
  130. // //kd系数
  131. // float kd = kdEdit.text().toFloat();
  132. // //ki系数
  133. // float ki = kiEdit.text().toFloat();
  134. //
  135. // geometry_msgs::Twist data;
  136. // while (distance(curx, cury, dstx, dsty) > 0.1) {
  137. // //目标速度
  138. // float tarSpeed = distance(curx, cury, dstx, dsty) / time;
  139. // /*-------------------------- p --------------------------*/
  140. // //误差
  141. // float pError = tarSpeed - curSpeed;
  142. // //调节速度
  143. // curSpeed += pError * kp;
  144. // /*-------------------------- d --------------------------*/
  145. // float dError = pError - lastError;
  146. // curSpeed += dError * kd;
  147. // lastError = pError;
  148. // /*-------------------------- i --------------------------*/
  149. // totalError += pError;
  150. // curSpeed+=totalError*ki;
  151. //
  152. // //数据
  153. // data.linear.x = curSpeed;
  154. // data.angular.z = 0;
  155. // //移动 (只会按照当前这个速度走1秒钟)
  156. // publisher.publish(data);
  157. //
  158. // //数据
  159. // std_msgs::Float64 sp;
  160. // sp.data = curSpeed;
  161. // //发送速度给plot展示
  162. // plotPublisher.publish(sp);
  163. // //剩下的时间
  164. // time -= 1 / hz;
  165. // //睡眠
  166. // rate.sleep();
  167. // }
  168. // //把速度设置为0
  169. // //数据
  170. // data.linear.x = 0;
  171. // data.angular.z = 0;
  172. // //移动 (只会按照当前这个速度走1秒钟)
  173. // publisher.publish(data);
  174. //}
  175. //P算法
  176. //void MainWindow::controlTurtle(float dstx, float dsty) {
  177. // //走的距离
  178. // float dst = distance(curx,cury,dstx,dsty);
  179. // //走的时间
  180. // float time = 5.0;
  181. // //频率
  182. // float hz = 10;
  183. // //频率
  184. // ros::Rate rate(hz);
  185. // //当前速度
  186. // float curSpeed = 0;
  187. // //kp系数
  188. // float kp = 0.1;
  189. //
  190. // geometry_msgs::Twist data;
  191. // while (distance(curx,cury,dstx,dsty)>0.1){
  192. // //目标速度
  193. // float tarSpeed = distance(curx,cury,dstx,dsty)/time;
  194. // //误差
  195. // float pError = tarSpeed-curSpeed;
  196. // //调节速度
  197. // curSpeed += pError*kp;
  198. //
  199. // //数据
  200. // data.linear.x = curSpeed;
  201. // data.angular.z = 0;
  202. // //移动 (只会按照当前这个速度走1秒钟)
  203. // publisher.publish(data);
  204. //
  205. // //数据
  206. // std_msgs::Float64 sp;
  207. // sp.data = curSpeed;
  208. // //发送速度给plot展示
  209. // plotPublisher.publish(sp);
  210. // //剩下的时间
  211. // time -= 1/hz;
  212. // //睡眠
  213. // rate.sleep();
  214. // }
  215. // //把速度设置为0
  216. // //数据
  217. // data.linear.x = 0;
  218. // data.angular.z = 0;
  219. // //移动 (只会按照当前这个速度走1秒钟)
  220. // publisher.publish(data);
  221. //}
  222. //计算速度
  223. //void MainWindow::controlTurtle(float dstx, float dsty) {
  224. // //走的距离
  225. // float dst = distance(curx,cury,dstx,dsty);
  226. // //走的时间
  227. // float time = 5.0;
  228. // //频率
  229. // float hz = 10;
  230. // //频率
  231. // ros::Rate rate(hz);
  232. // //速度
  233. // float speed = dst/time;
  234. // geometry_msgs::Twist data;
  235. // while (distance(curx,cury,dstx,dsty)>0.1){
  236. // speed = distance(curx,cury,dstx,dsty)/time;
  237. // //数据
  238. // data.linear.x = speed;
  239. // data.angular.z = 0;
  240. // //移动 (只会按照当前这个速度走1秒钟)
  241. // publisher.publish(data);
  242. //
  243. // //数据
  244. // std_msgs::Float64 sp;
  245. // sp.data = speed;
  246. // //发送速度给plot展示
  247. // plotPublisher.publish(sp);
  248. // //剩下的时间
  249. // time -= 1/hz;
  250. // //睡眠
  251. // rate.sleep();
  252. // }
  253. // //把速度设置为0
  254. // //数据
  255. // data.linear.x = 0;
  256. // data.angular.z = 0;
  257. // //移动 (只会按照当前这个速度走1秒钟)
  258. // publisher.publish(data);
  259. //}
  260. //指定时间走完
  261. //void MainWindow::click() {
  262. // //当前的x和y
  263. // //目标的x和y
  264. // float dstx = xEdit.text().toFloat();
  265. // float dsty = yEdit.text().toFloat();
  266. // //走的距离
  267. // float dst = distance(curx,cury,dstx,dsty);
  268. // //走的时间
  269. // float time = 5.0;
  270. // //频率
  271. // float hz = 10;
  272. // //频率
  273. // ros::Rate rate(hz);
  274. // //速度
  275. // float speed = dst/time;
  276. // geometry_msgs::Twist data;
  277. // while (distance(curx,cury,dstx,dsty)>0.1){
  278. // //数据
  279. // data.linear.x = speed;
  280. // data.angular.z = 0;
  281. // //移动 (只会按照当前这个速度走1秒钟)
  282. // publisher.publish(data);
  283. //
  284. // //数据
  285. // std_msgs::Float64 sp;
  286. // sp.data = speed;
  287. // //发送速度给plot展示
  288. // plotPublisher.publish(sp);
  289. // //睡眠
  290. // rate.sleep();
  291. // }
  292. // //把速度设置为0
  293. // //数据
  294. // data.linear.x = 0;
  295. // data.angular.z = 0;
  296. // //移动 (只会按照当前这个速度走1秒钟)
  297. // publisher.publish(data);
  298. //}
  299. //指定时间走完
  300. //void MainWindow::click() {
  301. // //当前的x和y
  302. // //目标的x和y
  303. // float dstx = xEdit.text().toFloat();
  304. // float dsty = yEdit.text().toFloat();
  305. // //走的距离
  306. // float dst = distance(curx,cury,dstx,dsty);
  307. // //走的时间
  308. // float time = 5.0;
  309. // //频率
  310. // float hz = 10;
  311. // //频率
  312. // ros::Rate rate(hz);
  313. // //速度
  314. // float speed = dst/time;
  315. // //走的距离
  316. // float runDst = 0;
  317. // geometry_msgs::Twist data;
  318. // while (runDst<dst){
  319. // //数据
  320. // data.linear.x = speed;
  321. // data.angular.z = 0;
  322. // //移动 (只会按照当前这个速度走1秒钟)
  323. // publisher.publish(data);
  324. // //增加走的距离
  325. // runDst += speed/hz;
  326. // //睡眠
  327. // rate.sleep();
  328. // }
  329. // //把速度设置为0
  330. // //数据
  331. // data.linear.x = 0;
  332. // data.angular.z = 0;
  333. // //移动 (只会按照当前这个速度走1秒钟)
  334. // publisher.publish(data);
  335. //}
  336. //指定时间走完
  337. //void MainWindow::click() {
  338. // //当前的x和y
  339. // //目标的x和y
  340. // float dstx = xEdit.text().toFloat();
  341. // float dsty = yEdit.text().toFloat();
  342. // //走的距离
  343. // float dst = distance(curx,cury,dstx,dsty);
  344. // //走的时间
  345. // float time = 5.0;
  346. // //频率
  347. // float hz = 10;
  348. // //频率
  349. // ros::Rate rate(hz);
  350. // //速度
  351. // float speed = dst/time;
  352. // geometry_msgs::Twist data;
  353. // for (int i = 0; i < (int)(time*hz); ++i) {
  354. // //数据
  355. // data.linear.x = speed;
  356. // data.angular.z = 0;
  357. // //移动 (只会按照当前这个速度走1秒钟)
  358. // publisher.publish(data);
  359. // //睡眠
  360. // rate.sleep();
  361. // }
  362. // //把速度设置为0
  363. // //数据
  364. // data.linear.x = 0;
  365. // data.angular.z = 0;
  366. // //移动 (只会按照当前这个速度走1秒钟)
  367. // publisher.publish(data);
  368. //}
  369. //5秒钟走完(问题)
  370. //void MainWindow::click() {
  371. // //当前的x和y
  372. // //目标的x和y
  373. // float dstx = xEdit.text().toFloat();
  374. // float dsty = yEdit.text().toFloat();
  375. // //走的距离
  376. // float dst = distance(curx,cury,dstx,dsty);
  377. // //走的时间
  378. // float time = 5;
  379. // //频率
  380. // ros::Rate rate(1);
  381. // //速度
  382. // float speed = dst/time;
  383. // for (int i = 0; i < (int)time; ++i) {
  384. // //数据
  385. // geometry_msgs::Twist data;
  386. // data.linear.x = speed;
  387. // data.angular.z = 0;
  388. // //移动 (只会按照当前这个速度走1秒钟)
  389. // publisher.publish(data);
  390. // //睡眠
  391. // rate.sleep();
  392. // }
  393. //}
  394. //1秒钟走完
  395. //void MainWindow::click() {
  396. // //当前的x和y
  397. // //目标的x和y
  398. // float dstx = xEdit.text().toFloat();
  399. // float dsty = yEdit.text().toFloat();
  400. // //走的距离
  401. // float dst = distance(curx,cury,dstx,dsty);
  402. // //走的时间
  403. // float time = 1;
  404. // //速度
  405. // float speed = dst/time;
  406. // //数据
  407. // geometry_msgs::Twist data;
  408. // data.linear.x = speed;
  409. // data.angular.z = 0;
  410. // //移动
  411. // publisher.publish(data);
  412. //}
  413. float MainWindow::distance(float curx, float cury, float dstx, float dsty) {
  414. return sqrt(pow(curx - dstx, 2) + pow(cury - dsty, 2));
  415. }
  416. void MainWindow::callBack(const turtlesim::Pose_<std::allocator<void>>::ConstPtr &pose) {
  417. curx = pose->x;
  418. cury = pose->y;
  419. curTheta = pose->theta;
  420. xLabel.setText(QString::number(curx));
  421. yLabel.setText(QString::number(cury));
  422. thetaLabel.setText(QString::number(pose->theta));
  423. }
  424. /**
  425. * 计算需要转的角度
  426. * @param dstx
  427. * @param dsty
  428. * @param curx
  429. * @param cury
  430. * @param theta 小乌龟当前角度
  431. * @return
  432. */
  433. float MainWindow::caclAngle(float dstx,float dsty,float curx,float cury,float theta){
  434. float angle = atan2(dsty-cury,dstx-curx)-theta;
  435. //角度范围在0-180 -180-0
  436. if(angle>M_PI){
  437. angle -= 2*M_PI;
  438. } else if (angle<-M_PI){
  439. angle += 2*M_PI;
  440. }
  441. return angle;
  442. }
  443. void MainWindow::sweep() {
  444. new std::thread(&MainWindow::vSweep,this);
  445. }
  446. void MainWindow::vSweep() {
  447. for (int i = 1; i < 11; ++i) {
  448. controlTurtle((float)i,1);
  449. controlTurtle((float)i,10);
  450. }
  451. }

main.cpp

  1. //
  2. // Created by wt on 2020/7/2.
  3. //
  4. #include <iostream>
  5. #include <ros/ros.h>
  6. #include <QApplication>
  7. #include "MainWindow.h"
  8. using namespace std;
  9. int main(int argc,char *argv[]){
  10. //节点名
  11. string nodeName = "sweeping_node";
  12. //初始化节点
  13. ros::init(argc,argv,nodeName);
  14. //创建节点
  15. ros::NodeHandle node;
  16. /*-------------------------- 异步spiner --------------------------*/
  17. ros::AsyncSpinner spinner(1);
  18. spinner.start();
  19. /*-------------------------- qt --------------------------*/
  20. QApplication app(argc,argv);
  21. MainWindow w(node);
  22. w.show();
  23. return QApplication::exec();
  24. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/671617
推荐阅读
相关标签
  

闽ICP备14008679号