ros2的通讯采用的是FastDDS,因此理论上fastDDS可以与ros2通讯。经过测试完成了通讯工程的编写。
具体实现如下。
- 测试了同一局域网中fastdds和ros2的节点互相识别,用任意的idl文件,通过
fastddsgen -example CMake -typeros2 teststring.idl
生成c++源码,注意有一个生成参数-typeros2,是告诉fastddsgen这次的源码要面对ros2通讯。
- 然后cmake之后生成sln工程,打开工程,修改topic,因为若想让ros2识别到topic需要在topic名前加"rt/"。具体位置在publisher.cxx文件的publisher::init()函数中。
- 编译生成程序,然后运行publisher。
- 在ros2中查看活动的topic
ros2 topic list
这时可以看到刚刚的publisher的topic。
- 无法识别数据内容
此时用ros2 topic echo /<topicname>,发现无法读取message内容。其实是因为ros2的内嵌数据结构中没有对应的数据,所以无法解析数据。 - 统一数据格式
直接查看ros2内的现有数据结构,查看std_msgs包的存储位置,在opt/ros/<ros2版本名例如"foxy">/share/std_msgs/msg,文件夹中有各类数据的.msg文件和.idl文件。把某数据类型的idl文件复制到fastdds节点的电脑上,重复上述1、2步,然后给数据格式赋值,例如string.idl的工程下,在publisher.cxx文件下的publisher::run()函数下,添加两行代码如下,
std_msgs::msg::String st;
std::string str("SUCCEED!"); //新加
st.data(str); //新加
/* Initialize your structure here */
进行上述的3-5步骤,ros2中读到“SUCCEED!”,通讯成功。