通过UDP

时间:2016-01-02 10:26:08

标签: c++ matlab sockets udp ros

我想通过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();
}

1 个答案:

答案 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的连接。