我想通过UDP将数据从ROS计算机传输到非ROS计算机。
现在指定我的作品:
我有一个LiDAR(Sick TiM561),我可以成功地通过ROS计算机启动它,我可以使用" Subscriber"现在使用roscpp获取LiDAR的数据,roscpp是ROS中的c ++代码。现在,我需要将LiDAR的数据传输到microbox,这是一台基于MATLAB的计算机(这台PC可以通过MATLAB在其中构建程序)。但是我对c ++代码不太熟悉,有人可以建议我或指导我如何修改下面的代码并将其添加到我的roscpp代码中吗?提前谢谢!
对于结构,Micro box是客户端,ROS PC是服务器。 这是我的roscpp的代码:
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "sensor_msgs/LaserScan.h"
void laser_msg_Callback(const sensor_msgs::LaserScan::ConstPtr& scan)
{
for (int x=0;x< scan->ranges.size();x++)
{
ROS_INFO("I heard: [%f]", scan->ranges[x]);
}
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "sick_listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("scan", 811, laser_msg_Callback);
ros::spin();
return 0;
}
这段代码可能就是我所需要的:
UdpClient client;
public IPAddress serverIP = IPAddress.Parse("140.124.35.1");
public Form1()
{
InitializeComponent();
client = new UdpClient();
}
public void SendData()
{
client.Connect(serverIP, 3000);
byte[] data = Encoding.ASCII.GetBytes("Hi, I'm new client.");
client.Send(data, data.Length);
DoListening();
}
public void DoListening()
{
IPEndPoint adress = new IPEndPoint(serverIP, 3000);
byte[] receivedbytes = client.Receive(ref adress);
string recieved = Encoding.ASCII.GetString(receivedbytes);
MessageBox.Show("Recieved: " + recieved);
}
private void button1_Click(object sender, EventArgs e)
{
SendData();
}
答案 0 :(得分:1)
我认为可能的方法是查看rossereal实现。我不熟悉microbox的开发,可能没有一个支持rosserial的平台可以开箱即用,但我认为这是rosserial的用途:提供符合ros的protocol用于通信ros服务器与非ros设备。为此,您的ros-nodes代码甚至不需要知道客户端的发布者和/或订阅者是否是在运行ros的计算机上运行的常规ros节点,或者是否由非{ros}上的rosserial client模仿它们设备
当我使用它时,rosserial_windows的效率对我有好处。我能够控制连接到连接到网络的Windows计算机的相当高分辨率的摄像机,该计算机具有多台运行中的计算机,以令人满意的速率从摄像机传输图像信息。
如果没有可用的rosserial实现与microbox兼容,那么您可能需要查看rosserial的“Adding Support for New Hardware”以及rosserial_embeddedlinux的现有代码,以通过udp实现类似rosserial的连接。