完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
4.1 Arduino IDE和rosserial_arduino安装
Arduino IDE----- 在arduino官网下载linux 64位的压缩包,然后放到Ubuntu中解压,在解压好的文件中输入sudo ./install.sh即可安装。安装完后只是会在home/用户名/下多一个arduino文件夹,因为它本身的所有软件内容都已经被压缩包解压好了。 rosserial_arduino----- 在终端输入sudo apt-get install ros-XX-rosserial-arduino和sudo apt-get install ros-XX-rosserial以及ros-XX-genpy即可安装rosserial_arduino包。然后跳转到arduino IDE在home下创建的Arduino目录的libraries目录(/home/Arduino/libraries)里,输入rosrun rosserial_arduino make_libraries.py .安装ros_lib包。注意这时针对的是刚刚解压安装好的Arduino IDE,如果arduino 的libraries有ros_lib记得删除。 4.2 Arduino发布ros话题“hello world”测试功能包 接入arduino开发板,查看串口号(接入后打开arduino IDE在tools栏下的port目录里,可以查看到全部串口号,一般串口名称为ttyUSB和ttyACM)。在file下的examples里选中ros_lib的helloworld程序打开。 进入到helloworld程序的tools栏下配置arduino,对于只接入了arduino nano的IDE,则需要将board arduino uno改成arduino nano;其次Processor选择ATmega328P的Old BootLoader;其次是port导入到的是/dev/ttyUSB0。如下图左。对于接入了arduino uno基本上选择好串口,其余是默认的即可,如下图右。 烧录前需要赋予串口权限:新开终端输入sudo chmod 666 /dev/ttyUSB0。然后在arduino IDE里点击箭头烧录程序。 新建终端打开roscore,然后打开rosserial_arduino文件。但是由于本次是二进制安装(apt-get install),serial_node.py文件不和官方教程一样存放在rosserial_arduino目录下而是在rosserial_python目录下。输入rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0打开rosserial_arduino文件。(如果报错提示rosmsg问题则是因为有些包太旧不兼容,需要下载ros-XX-genpy包) 输入rostopic list查看话题单,输入rostopic echo /chatter查看arduino发来的消息。 4.3 Arduino通过红外遥控器发布速度话题控制乌龟运动 本例来自于Arduino发布的String类型hello world的扩展例子。采用的红外模块是1838红外接头(三个引脚)。 本例中包括的功能包为有Arduino的ros_lib和IRremote扩展包,以及ros的rosserial_arduino和rosserial_python。 // your file(.ino) #include #include #include int IR_RECEIVE_PIN = 11;//红外传输的数据引脚 float linear = 3.0;//定义速度话题的线速度大小 float angular = 3.0;//定义熟读话题的角速度大小 IRrecv irrecv(IR_RECEIVE_PIN);//红外模块初始化 decode_results results;//用于存放红外模块返回的数据 ros::NodeHandle nh;//ros句柄 geometry_msgs::Twist twist;//定义控制速度消息 ros::Publisher cmd_vel("/turtle1/cmd_vel", &twist);//创建arduino的发布者 void pub_twist(int a,int b,int c,int d)//用于方便指定速度大小构造的函数 { twist.linear.x=a*linear; twist.linear.y=b*linear; twist.linear.z=c*linear; twist.angular.x=0; twist.angular.y=0; twist.angular.z=d*angular; cmd_vel.publish(&twist); } void set_cmd_vel(int k)//创建发布速度的函数 { switch(k) { case(1): { pub_twist(1,0,0,1); break; } case(2): { pub_twist(1,0,0,0); break; } case(3): { pub_twist(1,0,0,-1); break; } case(4): { pub_twist(0,0,0,1); break; } case(6): { pub_twist(0,0,0,-1); break; } case(7): { pub_twist(-1,0,0,-1); break; } case(8): { pub_twist(-1,0,0,-0); break; } case(9): { pub_twist(-1,0,0,-1); break; } } } void setup() { pinMode(LED_BUILTIN, OUTPUT);//显示指示灯 Serial.begin(57600);//设置Arduino通信的波特率 irrecv.enableIRIn(); Serial.println("Enabling IRin");//串口打印消息 nh.initNode();//初始化ros节点 nh.advertise(cmd_vel);//Arduino订阅自身发布的话题,目的是为了显示出Arduino发布ros话题的情况 } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value);//提前测试出红外模块传输进来的十进制数据,方便后面case语句的判断,来进行发布话题的操作!!!!!! switch(results.value) { case(16753245)://用测试得到的results.value来进行判断 { Serial.println(1); set_cmd_vel(1); break; } case(16736925): { Serial.println(2); set_cmd_vel(2); break; } case(16769565): { Serial.println(3); set_cmd_vel(3); break; } //...略去其他重复内容 //... //... case(16730805): { Serial.println("down"); set_cmd_vel(8); break; } } Serial.println(results.value,HEX);//在serial monitor串口通讯器打印十六进制的红外数据 irrecv.resume(); } delay(100); nh.spinOnce(); } 判断出红外传感器输出值: 运行与结果: |
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2990 浏览 16 评论
3490 浏览 1 评论
9052 浏览 16 评论
4085 浏览 18 评论
1173浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 08:11 , Processed in 0.426413 second(s), Total 43, Slave 34 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号