mpc_local_planner动态调参
一、如何打开动态调参注释的具体步骤
在此链接:
通过上面的修改发现后编译时,出现错误:
然后我就注释掉了这行就可以了(我太菜了,不知道原因是什么。可能是melotic和noetic版本区别?有知道的,评论区交流一下呗~):
编译成功了,并且打开rosrun rqt_reconfigure rqt_reconfigure是能动态调参的。
然而,只能添加部分参数。目前github是有人解决了这个问题,下面的链接是它们的讨论:
https://github.com/rst-tu-dortmund/mpc_local_planner/pull/18
有会的教教我呀!!!!!!!!!我会了也会更新的。
------------------------------------------------------------------------------------------------
二、解决添加其他参数的动态调参
怎么说,已经初步实现了,但是跨文件传变量的时候用的是全局变量,有点low就是了。
跨文件传变量还有挺多方式,比如不另外占内存的函数引用,但我C++还不太行啊,目前就只能分享全局变量的方法了,请往下看~~
(看到这里,我已经默认你是照着上面开头链接里的操作执行过了哈)
第一步,在.cfg文件中添加其他变量
这里我们就只添加max_vel_x当做示例(其实会一个就是会很多个,模板的话可以照着Teb的写)
第二步,在mpc_local_planner_ros.cpp文件中的 reconfigureCB 回调函数添加一些东西
(先别着急抄进去,跟着思路一步步来)。
由于我们在.cfg文件中添加了 max_vel_x (添加完记得编译),因此上面reconfigureCB 回调函数中的 config 会多一个 max_vel_x 。(试试config.就会有一排参数,就是.cfg文件添加的参数,我们找找有没有max_vel_x ,没有的话说明.cfg还没弄好)
config中有max_vel_x则说明我们成功把参数传进mpc_local_planner_ros.cpp文件中,可是max_vel_x的应用是在controller.cpp中。因此,我使用的方法是全局变量跨文件传参的方法。
第三步,全局变量跨文件传参
1. 先将config赋值给_param( 就是上图红框的第一句 _param = config; )
2. 这是当然就提示_param未定义对吧,那我们就去定义_param。在mpc_local_planner_ros.cpp文件中添加如下语句:(我放的位置有点难看哈哈哈,但注意的是,我没记错的话,这个定义不要放进namespace mpc_local_planner )
3. 既然是跨文件全局变量,那么我们需要在mpc_local_planner_ros.h文件中添加如下语句:
4. 此时,_param就传到mpc_local_planner_ros.cpp外面了,那controller.cpp怎么接收呢,只需要在controller.cpp中包含mpc_local_planner_ros.h
5. 好了,参数传进controller.cpp文件中了,接下来我们使用一下。我的车型是“unicycle”,大家找到自己对应的车型,然后进行下面图片红框的修改。
至此,完结撒花~~~~~~
emmmmmmmmmmmmmm......
桥豆麻袋!!!!
“还有一件事!” ——老爹
还有什么事呢,其实也没啥事,我们接下来往下看叭~
由于我们上面图片红框所示的语句 double max_vel_x = _param.max_vel_x;// double max_vel_x = 0.4; 它只被调用一次,分析原因后发现是因为这条语句所属函数configureOcp函数只被调用一次,而configureOcp函数又被configure函数所调用,也就是说configure函数只被调用一次。
只调用一次怎么办,那我们就调用两次呗,三次呗,......,n次呗。那我们具体调用几次呢,答案很简单呀,我们动态调参几次就调用几次就好了呀。
emm...动态调参几次就调用几次吗,let me think think...
其实也没think,只需要在上述提到的mpc_local_planner_ros.cpp文件中的 reconfigureCB 回调函数添加下面东西即可:
最后,运行自己的小车车
打开rosrun rqt_reconfigure rqt_reconfigure,进行max_vel_x调参,并打rostopic echo /cmd_vel或者用rosrun rqt_plot rqt_plot 看也行,观察到小车最大速度时是有所变化的。
好咯,这下真的完结撒花咯~各位拜拜~
另外,本人C++代码能力有限,有些地方可以优化改进,也许还有后续,也许我们还会再见面,也许~