您现在的位置是:首页 >学无止境 >在VSCode下利用PlateFormIO开发Arduino的MicroROS遇到的一些问题网站首页学无止境
在VSCode下利用PlateFormIO开发Arduino的MicroROS遇到的一些问题
文章目录
简介
我是按照鱼香ROS的教程【3.搭建PlateFormIO开发环境】进行的,但是在进行的过程中,遇到了一些问题,这里记录下来,供有同样问题的同学进行参考。其实只要你使用的板子的MCU是ESP32,都可以按照他这个教程进行操作。
1.在第四节编译工程中,教程使用的vscode是有编译、上传的按钮的。但是我的没有。
教程的:
我的:
不过没关系,点击那个小蚂蚁,执行RROJECT TASKS–》General下面的命令,具有同样的效果。
后来又发现在右上角:
2.在【6.串口通信-接收实验】中,没有串行监视器(Serial Monitor)。
教程中是有这个东西的,但是这边没有。
其实这个需要是个独立的拓展,需要自己独立安装。
3.关于trajectory_msgs/msg/joint_trajectory.hpp的相关问题
首先我们要明确,microros这个环境基本是基于c开发的,而不是cpp。所以,trajectory_msgs/msg/joint_trajectory.hpp这个cpp下的目录是没有的,取而代之的是trajectory_msgs/msg/joint_trajectory.h
4.关于control_msgs::action::FollowJointTrajectory的相关问题
假如我们想让我们的microros节点直接接入到moveit中,一种比较好的办法是直接在此节点上实现一个action_server,类型为control_msgs::action::FollowJointTrajectory。
但是目前鱼香ros的microros不支持该类型,而官方的也是不支持的(当使用官方的microros时,需要梯子或者fastgithub)。
不知道怎么回事,我看官方的【micro_ros_arduino】是有这个模块的。
我在上面发起了个提问,到时候再看看。【I couldn’t find the control_msg module in the compiled include folder】
实在没办法的话,可以暂时在电脑端创建个action_server,然后通过用service传给下位机吧。
20230612:他们今天回答了。
意思大概是假如这个库没有control_msgs这个模块,需要自己按照 https://github.com/micro-ROS/micro_ros_platformio#extra-packages 这里的说明来进行添加到编译步骤中。
ok,那我们自己操作一下。
呃,但是,在哪个路径下搞这个extra_packages.repos呢??
虽然在 /home/yong/Desktop/arduino/hello_microros/.pio/libdeps/featheresp32/micro_ros_platformio/ci/extra_packages(你需要根据你自己的项目名字来决定这个路径,其实也就是你当前项目下的) 这个目录下是有一个extra_packages.repos。
我们用的是humble,他这个是galactic-devl与humble可能不匹配。我们去 https://github.com/ros-controls/control_msgs 看看
有humble的,那我们手动改一下:
改完,重新编译,貌似没什么不一样。可能我理解错了。
我还是直接用我发现的一个办法吧:
直接修改 repositories.py
+ Repository("control_msgs", "https://ghproxy.com/https://github.com/ros-controls/control_msgs", "humble"),
修改之后,手动将libmicroros文件夹删除,
然后重新编译
顺利的话,等编译完成后,你就可以看到control_msgs了。
不是很懂为什么官方不直接加进去,难道是出于单片机资源紧张的考虑?
5.publisher以及service不能同时实现的问题
按照教程,假如你想把发布话题、实现服务这两个功能一起放到同一个工程中:
...
// 执行器添加服务
rclc_executor_add_service(&executor, &service, &req, &res, service_callback);
...
// 给执行器添加定时器
rclc_executor_add_timer(&executor, &timer);
...
会发现只能实现其中一个功能,另外一个会被忽略。
这个其实只要改一下执行器的初始化语句就行:
// 创建执行器
- rclc_executor_init(&executor, &support.context, 1, &allocator);
+ rclc_executor_init(&executor, &support.context, 2, &allocator);
也就是把number_of_handles从1改成2.这个参数是控制执行器允许处理的对象数量,可以自己看一下源码。这也是对寸土寸金的单片机的妥协,也没办法,要控制好每一份资源。
其他暂时没问题,遇到再补充。