ROS----ROSSerial的使用

Posted fliestream

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS----ROSSerial的使用相关的知识,希望对你有一定的参考价值。

OS: ubuntu 16.04

ROS:kinetic

1.安装arduino  sudo apt-get install arduino

2.安装ros包  sudo apt-get install ros-kinetic-rosserial-arduino

sudo apt-get install ros-kinetic-rosserial

3.设置arduino的SketchBook,将ros_lib弄进去,关于SketchBook的文件目录,在File->Preferences

也可以自己定义该目录.

cd <sketchbook>/libraries 如果没有libraries目录,自己创建这个目录就可以啦,如果里面已经包含ros_lib目录,请使用rm -rf ros_lib ,防止发生冲突.
rosrun rosserial_arduino make_libraries.py .   用来生成ros_lib库,(注意使用.,当前目录)

 

 由于ubuntu下截图不怎么好用,就用了官网的图,道理是一样的。可以依据这些demo来制作ardunio下的节点,和服务。

关于arduino IDE的串口链接,在 Tools->Serial Port下,选材/dev/ttyACM×(× 可能是0,1,2,3...)

关于brltty和Arduino之间冲突,但在unbuntu 16.04下没什么影响,在Tools->Serial Port 依然可以看到/dev/ttyACM*,并且成功烧入。

并不是一定要卸载brltty,这个我觉得要实际试过才可以这么说.

rosrun rosserial_python serial_node.py /dev/ttyACM* 用来启动rosserial节点。

跑的时候,如果arduino 串口监听,rosserial一起启动,经常导致串口异常,导致串口插拔,才可以重新使用。
这个问题,比较不好理解,linux串口非独占的。目前还在解决中。

由于linux串口的跳动,必须固定串口。

 

lsusb 可以查看当前的usb口。

当然也可以用dmesg

可以查看具体的设备。我觉得用arduino 的serial port看起来更合理点。

如果当前arduino的串口好是/dev/ttyACM0,

使用udevadm info /dev/ttyACM0 查看串口的具体信息。

这中方式查看我觉得不是很好,就使用lsusb -vv

可以看得更清楚

可以清楚的看到 idVendor 和idpProduct,这两个是自定义串口的重要参数。

 

根据这些信息重写串口设备命名规则,采用Linux的udev来自定义规则来管理设备名称

(1)https://unix.stackexchange.com/questions/66901/how-to-bind-usb-device-under-a-static-name?noredirect=1&lq=1

具体步骤如下。

/etc/udev/rules.d/10-local.rules

修改这个文件,我发现不存在这个文件(ubuntu 16.04),那么我 touch 10-local.rules (其实这个文件名可以随便定义,但是毕竟不是太了解,所以按照Q&A来做,防止无法复现)

接着 根据查询的idVendor 和idpProduct

ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="MyAruduino"添加到10-local.rules文件中
udevadm info -a -p $(udevadm info -q path -n /dev/ttyACM0)

然后重启电脑。

但发现Arduino IDE中显示的还是/dev/ttyACM0,所以我觉得直接使用cutecom串口调试工具来使用.

cutecom -> sudo apt-get install cutecom(安装)

Device:直接写/dev/MyArduino ,下拉是无法选择的,

我在Arduino中写serial.write("ggg"); 在cutecom中已经显示数据,说明可用。

有一点要说明,当你直连Arduino的烧入线的时候,/dev/ttyACM0,当你用扩展板的是/dev/ttyUSB*.(这个是有区别的)。

 

至于ROSSerial其他的问题,必须在长期使用中慢慢积累。

 

(2接下来详细的使用ROSSerial

开启 一个console  : roscore

再重新开起一个console

 

再开起一个console :

rostopic pub [topic] [msg_type] [args]

当跑一段时间,Serial_node就会报错(无法同步),关于这个问题,

我觉的是我开启来Ardunio IDE 的Serial Monitor.所以我关闭Ardunio IDE的Serial Monitor,发现没有出现这个错误。(大概测试来半个小时)

虽然说linux 串口是非独占的,但同时使用可能会导致无法同步的问题,这样的话对于调试感觉很麻烦。

所以在Arduino 中加来发布代码,在rostopic中看是否接受正确,以下是Arduino代码:

#include <ros.h>
#include <std_msgs/String.h>

ros::NodeHandle  nh;
std_msgs::String str_msg;
ros::Publisher ServoPub("ServoPub", &str_msg);
void servo_cb( const std_msgs::String &cmd_msg)
{
  str_msg =cmd_msg;
  ServoPub.publish(&str_msg);
  nh.spinOnce();
  delay(1);
}

ros::Subscriber<std_msgs::String> sub("ServoControl", servo_cb);

void setup()
{

  nh.initNode();
  nh.advertise(ServoPub);
  nh.subscribe(sub);
}

void loop()
{
  nh.spinOnce();
  delay(1);

}

接着启动 :  rosrun rosserial_python serial_node.py /dev/MyArduino

接着: rostopic echo ServoPub
接着发布消息:rostopic pub ServoControl std_msgs/String \'gg\'

下图是接受到的数据:

接受到publish 的String消息.

 以上就是rosserial的一些基本使用,如果有新的内容继续更新。

 

 

 




 

 

 


 

 

 

 

 





 

 

以上是关于ROS----ROSSerial的使用的主要内容,如果未能解决你的问题,请参考以下文章

webstorm代码片段的创建

使用 Git 来管理 Xcode 中的代码片段

Android课程---Android Studio使用小技巧:提取方法代码片段

VIM 代码片段插件 ultisnips 使用教程

使用 Pygments 检测代码片段的编程语言

创建自己的代码片段(CodeSnippet)