一、第一种安装方式(不支持自定义消息)

第一步打开官网

http://wiki.ros.org/rosserial_arduino/Tutorials/Arduino%20IDE%20Setup

第二步按第一种方式安装

第三步生成arduino ros库

第四步编译arduino等等等

二、第一种安装方式的问题

一切正常了吧,但如果使用自定义数据类型,会发现source /opt/ros/indigo/setup.bash会找不到在catkin_ws中的自定义类型。

但如果使用source catkin_ws/devel/setup.bash,你会发现无法找到ros_rosserial这个包。

所以需要再进行一次第二种安装(也许第一种还有其他改进方法)

三、接着进行第二种安装方式

之后可以开始自定义消息类型了

四、自定义消息类型

参见官网

http://wiki.ros.org/ROS/Tutorials/CreatingMsgAndSrv

在自己包里创建自定义数据类型后,catkin_make

重复一中的第三步,生成arduino ros库,之后就会在arduino的roslibaray中找到自定义消息类型的.h文件了。

如图mycat包中cat自定义消息类型

四、如果只用第二种方法

用第二种方法安装ros_rosserial,在生成arduino ros库后,arduino无法编译ros内容

五、备注

也许是我出错了

我第一个电脑中默认source catkin_ws/devel/setup.bash

但后来只用第二种方法时忘了source究竟是不是指向了catkin_ws/devel/setup.bash

第一种方法是否还可以挽救下??使用rospack profile。

六、arduino代码

事实上在rosrun rosserial_python serial_node.py /dev/ttyUSB0后

在arduino端生成一个节点,含有发布器或订阅器。

代码里的数据类型就是ros里的消息类型,必须先导入消息的头文件。

七、发布器(publisher)(多线程)

*
* rosserial Publisher Example
* Prints "hello world!"
*/
#include <NewPing.h>
#include <ros.h>
#include <std_msgs/Float32.h> ros::NodeHandle nh;
const int TrigPin2 = 4;
const int EchoPin2 = 5;
const int TrigPin1 = 2;
const int EchoPin1 = 3;
const int TrigPin3= 8;
const int EchoPin3 = 9;
std_msgs::Float32 str_msg1;
std_msgs::Float32 str_msg2;
std_msgs::Float32 str_msg3;
ros::Publisher chatter1("chatter1", &str_msg1);
ros::Publisher chatter2("chatter2", &str_msg2);
ros::Publisher chatter3("chatter3", &str_msg3);
float distance1;
float distance2;
float distance3;
NewPing sonar1(TrigPin1, EchoPin1, 200);
NewPing sonar2(TrigPin2, EchoPin2, 200);
NewPing sonar3(TrigPin3, EchoPin3, 200);
void setup()
{
// 初始化串口通信及连接SR04的引脚
Serial.begin(9600); Serial.println("Ultrasonic sensor:"); nh.initNode();
nh.advertise(chatter1);
nh.advertise(chatter2);
nh.advertise(chatter3);
} void loop()
{
distance1 = sonar1.ping_cm();
str_msg1.data =distance1;
chatter1.publish( &str_msg1 ); // 检测脉冲宽度,并计算出距离
distance2 = sonar2.ping_cm();
str_msg2.data =distance2;
chatter2.publish( &str_msg2 ); distance3 = sonar3.ping_cm();
str_msg3.data =distance3;
chatter3.publish( &str_msg3); nh.spinOnce();
delay(15);
}

八、订阅器

实例一无参实例

/*
* rosserial Subscriber Example
* Blinks an LED on callback
*/ #include <Servo.h>
#include <ros.h>
#include <std_msgs/Empty.h>
Servo myservo;
ros::NodeHandle nh;
int pos; void messageCb( const std_msgs::Empty& toggle_msg){
digitalWrite(13, HIGH-digitalRead(13)); // blink the led
for(pos = 0; pos < 180; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for(pos = 180; pos>=1; pos-=1) // goes from 180 degrees to 0 degrees
{
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
} ros::Subscriber<std_msgs::Empty> sub("toggle_led", &messageCb );
///toggle_led is pubisher in ros void setup()
{ myservo.attach(9);
pinMode(13, OUTPUT);
nh.initNode();
nh.subscribe(sub);
} void loop()
{
nh.spinOnce();
delay(1);
} 在nh节点激活后
void messageCb()函数会被调用执行。

实例二有参实例

*
* rosserial Servo Control Example
*
* This sketch demonstrates the control of hobby R/C servos
* using ROS and the arduiono
*
* For the full tutorial write up, visit
* www.ros.org/wiki/rosserial_arduino_demos
*
* For more information on the Arduino Servo Library
* Checkout :
* http://www.arduino.cc/en/Reference/Servo
*/ #if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include <WProgram.h>
#endif #include <Servo.h>
#include <ros.h>
#include <std_msgs/UInt16.h> ros::NodeHandle nh; Servo servo; void servo_cb( const std_msgs::UInt16& cmd_msg){
servo.write(cmd_msg.data); //set servo angle, should be from 0-180
digitalWrite(13, HIGH-digitalRead(13)); //toggle led
} ros::Subscriber<std_msgs::UInt16> sub("servo", servo_cb); void setup(){
pinMode(13, OUTPUT); nh.initNode();
nh.subscribe(sub);
servo.attach(9); //attach it to pin 9
} void loop(){
nh.spinOnce();
delay(1);
}

九、自定义消息类型

(原ros_rosserial自带adc.h自定义消息类型)(自定义消息还可以,但自定义数组一直搞不定)

发布器

#include <ros.h>
#include <mycat/cat.h> ros::NodeHandle nh; mycat::cat cat_msg;
ros::Publisher p("cat", &cat_msg); void setup()
{ nh.initNode(); nh.advertise(p);
} //We average the analog reading to elminate some of the noise void loop()
{
cat_msg.num = 1;
cat_msg.num1 = 2;
cat_msg.num2 = 3;
cat_msg.num3 = 4;
p.publish(&cat_msg); nh.spinOnce();
} 订阅器 #include <Servo.h>
#include <ros.h>
#include <mycat/cat.h> ros::NodeHandle nh; Servo servo; void servo_cb( const mycat::cat& cmd_msg){
servo.write(cmd_msg.num); //set servo angle, should be from 0-180
delay(1000);
servo.write(cmd_msg.num1); //set servo angle, should be from 0-180
delay(1000);
servo.write(cmd_msg.num2); //set servo angle, should be from 0-180
delay(1000);
servo.write(cmd_msg.num3); //set servo angle, should be from 0-180
delay(1000); } ros::Subscriber<mycat::cat> sub("cat", servo_cb); void setup(){ nh.initNode();
nh.subscribe(sub);
servo.attach(9); //attach it to pin 9
} void loop(){
nh.spinOnce();
delay(100);
}

ROS之arduino交互的更多相关文章

  1. ROS机器人语音交互(一)

    语音交互早期已经广泛应用在手机端,电脑端,随着技术的成熟,接口逐渐开放,ROS上老外搞的开源语音识别只支持英文,识别率还低. 国内语音识别技术已经相当成熟稳定.感谢ros小课堂的讲解,解决了自己的疑惑 ...

  2. Ros使用Arduino 3用rosserial创建一个subscriber

    在前面的一节中,我们已经使用arduino创建了一个publisher节点,接下来将会用arduino来创建一个subscriber,接收电脑传去的信息并做出相应的反应. 1启动Arduino 将ar ...

  3. Ros使用Arduino 2 使用rosserial创建一个publisher

    1 启动arduino 将arduino开发板连接到电脑的usb口,在arduino IDE中进行设置. 选择Tools->Board,选择你所使用的arduino开发板的类型,所使用的ardu ...

  4. Ros使用Arduino 1安装Arduino IDE

    安装Arsuino IDE sudo apt-get install arduino 设置库文件路径 在使用ROS的库文件时,必须在代码的开头包括: #include <ros.h> 接下 ...

  5. ROS Learning-016 Arduino-For-ROS-001 搭建 Arduino 和 ROS 之间相连接的开发环境

    Arduino For ROS-001 - 搭建 ROS 和 Arduino 相连接的开发环境 我的Ubuntu系统:Ubuntu 14.04.10 TLS 32位 Arduino的版本:Arduin ...

  6. 【Arduino】、Arduino+ESP8266上传至oneNet云

    一.硬件简介 1. Arudino 是一种开源的电子平台,该平台最初主要基于AVR单片机的微控制器和相应的开发软件,包含硬件(各种型号的Arduino板)和软件(Arduino IDE). 2. ES ...

  7. ROS Learning-018 Arduino-For-ROS-003 (总结篇) 模板程序 即 如何运行

    Arduino For ROS-003 - (总结篇) 模板程序 即 如何运行 我的Ubuntu系统:Ubuntu 14.04.10 TLS 32位 Arduino的版本:Arduino 1.6.11 ...

  8. ROS Learning-017 Arduino-For-ROS-002 第一个程序: Hello World

    Arduino For ROS-002 - 第一个程序: Hello World 我的Ubuntu系统:Ubuntu 14.04.10 TLS 32位 Arduino的版本:Arduino 1.6.1 ...

  9. ROS和Gazebo进行机器人仿真(一)

    Gazebo是一种多机器人仿真器,可用于室内外机器人仿真.Gazebo在ROS中有良好的接口,包含ROS和Gazebo的所有控制. 若要实现ROS到Gazebo的通信,我们必须安装ROS-Gazebo ...

随机推荐

  1. java File 类对操作系统文件目录进行操作:增删查

    File类 1,概述 File类是java.io包下代表与平台无关的文件和目录,也就是说,如果希望在程序中操作文件和目录,都可以通过File类来完成. 2,构造方法 public File(Strin ...

  2. 使用docker创建含有FFmpeg的自定义镜像

    Dockerfile文件 FROM openjdk:8-jre-alpine MAINTAINER "yvioo" RUN echo "http://mirrors.al ...

  3. MIUI12.5扫码之后无法连接MIUI+,显示连接失败

    设置-应用设置-应用管理-小米互联通信服务(如果没有找到,进行搜索即可)-清除数据 重新扫码连接就可以连上了 (感觉不怎么样,不知道是不是我网卡,用起来卡卡的...)

  4. IDEA 修改之前保存的git地址的账号和密码

    1.打开控制面板 快捷键 win+R,然后输入control,打开控制面板 2.用户账户 3.管理windows凭据 4.点击里面的git就可以修改了

  5. 基于 SoC 的卷积神经网络车牌识别系统设计(1)概述

    NOTES: 这是第三届全国大学生集成电路创新创业大赛 - Arm 杯 - 片上系统设计挑战赛(本人指导的一个比赛).主要划分为以下的 Top5 重点.难点.亮点.热点以及创新点:1.通过 Arm C ...

  6. 【经验】基于阿里云 Ubuntu 的 LAMP 网站搭建及配置完全教程

    本文同步发表在负雪明烛的博客:https://fuxuemingzhu.cn/2016/03/02/My-Aliyun-Server-Setting/ 起因 最近老师让我做一个众筹系统,可以在微信公众 ...

  7. Capstone CS5218|CS5218参数|CS5218电路

    Capstone CS5218是一款单端口HDMI/DVI电平移位器/中继器,具有重新定时功能.它支持交流和直流耦合信号高达3.0-Gbps的操作与可编程均衡和抖动清洗.它包括2路双模DP电缆适配器寄 ...

  8. CS5210完全替代AG6202|HDMI转VGA不带音频输出的芯片+原理图|替代兼容AG6202

    CS5210完全替代AG6202|HDMI转VGA不带音频输出的芯片+原理图|替代兼容AG6202 安格AG6202是一个HDMI转VGA不带音频解决方案,用于实现HDMI1.4高分辨率视频转VGA转 ...

  9. 剖析Defi之Uinswap_1

    学习UniswapERC20,它是交易对的父合约.UniswapV2ERC20 是流动性代币合约,也称为 LP Token.功能主要实习ERC20代币功能以及对线下签名授权. 1 pragma sol ...

  10. 【jvm】09-full gc分析思路

    [jvm]09-full gc分析思路 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请顺手点个赞. ...