版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:[https://blog.csdn.net/ZhangRelay/article/details/101394537](https://blog.csdn.net/ZhangRelay/article/details/101394537)
Arduino直接从库中安装ros2arduino:
ros2arduino
然后,就可以在示例中打开代码学习。
一个订阅发布代码如下:
#include <ros2arduino.h>
#define XRCEDDS_PORT Serial
#define PUBLISH_FREQUENCY 1 //hz
void publishString(std_msgs::String* msg, void* arg)
{
(void)(arg);
static int cnt = 0;
sprintf(msg->data, "Hello ROS2 From Arduino %d", cnt++);
}
class StringPub : public ros2::Node
{
public:
StringPub()
: Node("ros2arduino_pub_node")
{
ros2::Publisher<std_msgs::String>* publisher_ = this->createPublisher<std_msgs::String>("ros2_chatter");
this->createWallFreq(PUBLISH_FREQUENCY, (ros2::CallbackFunc)publishString, nullptr, publisher_);
}
};
void subscribeLed(std_msgs::Bool* msg, void* arg)
{
(void)(arg);
digitalWrite(LED_BUILTIN, msg->data);
}
class LedSub : public ros2::Node
{
public:
LedSub()
: Node("ros2arduino_sub_node")
{
this->createSubscriber<std_msgs::Bool>("ros2_led", (ros2::CallbackFunc)subscribeLed, nullptr);
}
};
void setup()
{
XRCEDDS_PORT.begin(115200);
while (!XRCEDDS_PORT);
ros2::init(&XRCEDDS_PORT);
pinMode(LED_BUILTIN, OUTPUT);
}
void loop()
{
static StringPub StringNode;
static LedSub LedNode;
ros2::spin(&StringNode);
ros2::spin(&LedNode);
}
代码实现功能如下:
IDE
主题
Arduino发布消息到主题ros2_chatter,并订阅主题ros2_led。
使用如下命令控制LED灯:
点亮:ros2 topic pub /ros2_led std_msgs/msg/Bool "{data: 1}"
关闭:ros2 topic pub /ros2_led std_msgs/msg/Bool "{data: 0}"
思考题:如何实现LED闪烁?
LED闪烁(不修改代码)
如何修改代码实现?
if(ledblink%2==1)
digitalWrite(LED_BUILTIN, 1);
else
digitalWrite(LED_BUILTIN, 0);
ledblink++;
对YAML不熟悉参考:YAML语法规则
接收到主题消息如下:
pubsub
直接用串口工具看到信息如下:
串口工具
ROS1和Arduino的示例,通过代码移植完全适用与ROS2。
4年前(2015年12月)花费1周时间搭建的小车,同样可以用ROS2实现。
之前案例链接:基于ROS_Arduino室内移动机器人SLAM实验测试
基于ROS2_Arduino移动机器人cartographer(SLAM)小车,课程结束后发布。
ros2cartographer参考:https://github.com/ros2/cartographer。
Arduino使用说明参考:https://www.arduino.cc/en/Guide/ArduinoDue。
下面详细介绍一下如何使用ros2arduino:
必须安装ROS2,必须安装Micro-XRCE-DDS。
ROS2安装可以参考:
Micro-XRCE-DDS:
$ git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
$ cd Micro-XRCE-DDS-Agent && git checkout v1.1.0
$ mkdir build && cd build
$ cmake ..
$ make
$ sudo make install
$ sudo ldconfig /usr/local/lib/
eProsima Micro XRCE-DDS
完整具体的eProsima Micro XRCE-DDS使用文档参考:https://micro-xrce-dds.readthedocs.io/en/latest/index.html
这里如果网络不行,可能凉凉,推荐使用git代理。
git config --global http.proxy <address>:<port>
体验飞一般的感觉。
如果想了解Fast-RTPS,参考eProsima Fast RTPS文档:http://eprosima-fast-rtps.readthedocs.io/
如果想在ros1中使用arm版本的arduino:
1 第一个可行的解决方案。在Arduino Libraries目录中的ArduinoHardware.h版本中,将第75行更改为:
iostream = &Serial;
可行,但无法使用Arduino其他开发板(例如Leonardo)
2 在包含ROS库之前放置以下代码
#define USE_USBCON
可行,但是,必须在每次使用DUE的情况下都添加它,而这容易忘记。
3 将第73行修改为:
#if defined(USBCON) and !(defined(USE_USBCON)) and !(defined(_SAM3XA_))
需修改位置
解决所有以前的问题,但是,如果另一个使用SAM3X ...处理器的主板,会成为问题。
ros1与arduino
arduino完美支持ROS1和ROS2。
编译和使用也会遇到各种各样的小问题,都有成熟解决方案的,查找即可。
具体使用,ROS1略,ROS2。
ros2 arduino node topic
更多课程资料参考:机器人编程实践-ROS2基础与应用- https://blog.csdn.net/ZhangRelay/article/details/101351969