课程主要介绍Arduino,辅助补充ROS机器人操作系统(1&2)。有兴趣同学可以参考如下链接:
什么是机器人?什么是控制器?什么是编程?
什么是机器人控制器??什么是控制器编程??
什么是机器人控制器编程???
课程大纲和要求介绍,第一章1-24页。
分别介绍了起源、类型和安装并下载一个blink示例程序。
为什么选择Arduino,并介绍ROS?
Arduino IDE:
VS Code:
碎片与统一?
ROS机器人操作系统:
turtlesim:
ros2 run turtlesim turtlesim_node
ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.2}}"
tello:
ros2 service call /tello_action tello_msgs/TelloAction "{cmd: 'takeoff'}"
ros2 service call /tello_action tello_msgs/TelloAction "{cmd: 'land'}"
ros2 topic pub /cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.2}}"
cozmo:
ros2 run cozmo_driver_ros2 cozmo_driver
ros2 topic pub /cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.2}}"
如果在windows系统出现安装驱动问题,系统找不到指定文件,解决方法参考:
如果不愿意购买Arduino硬件,那么可以选用仿真完成部分实验:

了解Arduino和ROS之后,如何将两者联系起来呢?
这里以最新版本的ROS 1 Melodic做介绍。安装对应功能包:
sudo apt install ros-melodic-rosserial-arduino
全部支持的串口通讯方式有:
ros-melodic-rosserial ros-melodic-rosserial-server
ros-melodic-rosserial-arduino ros-melodic-rosserial-server-dbgsym
ros-melodic-rosserial-client ros-melodic-rosserial-tivac
ros-melodic-rosserial-embeddedlinux ros-melodic-rosserial-vex-cortex
ros-melodic-rosserial-mbed ros-melodic-rosserial-vex-v5
ros-melodic-rosserial-msgs ros-melodic-rosserial-windows
ros-melodic-rosserial-python ros-melodic-rosserial-xbee
安装完成后,进行环境配置:
打开Arduino IDE(本文版本为1.8.9),直接进入库管理(library Manager),在搜索框输入ros查找:

确保Rosserial Arduino Library 0.7.9安装完成。
这时候,就可以在文件File,示例Examples,自定义示例Costom中找到丰富的示例:

打开一个示例看一看吧,Blink(ROS版本):
/*
* rosserial Subscriber Example
* Blinks an LED on callback
*/
#include <ros.h>
#include <std_msgs/Empty.h>
ros::NodeHandle nh;
void messageCb( const std_msgs::Empty& toggle_msg){
digitalWrite(13, HIGH-digitalRead(13)); // blink the led
}
ros::Subscriber<std_msgs::Empty> sub("toggle_led", &messageCb );
void setup()
{
pinMode(13, OUTPUT);
nh.initNode();
nh.subscribe(sub);
}
void loop()
{
nh.spinOnce();
delay(1);
}
注意串口权限问题,sudo chmod 777 /dev/ttyACM0。/dev/ttyACM0为对应串口号。
程序上传至开发版后,依次运行如下命令:
1. roscore
2. rosrun rosserial_python serial_node.py /dev/ttyACM0
使用如下命令开关LED灯:
rostopic pub toggle_led std_msgs/Empty --once
闪烁:
rostopic pub toggle_led std_msgs/Empty -r 2
/*
* rosserial PubSub Example
* Prints "hello world!" and toggles led
*/
#include <ros.h>
#include <std_msgs/String.h>
#include <std_msgs/Empty.h>
ros::NodeHandle nh;
void messageCb( const std_msgs::Empty& toggle_msg){
digitalWrite(13, HIGH-digitalRead(13)); // blink the led
}
ros::Subscriber<std_msgs::Empty> sub("toggle_led", messageCb );
std_msgs::String str_msg;
ros::Publisher chatter("chatter", &str_msg);
char hello[13] = "hello world!";
void setup()
{
pinMode(13, OUTPUT);
nh.initNode();
nh.advertise(chatter);
nh.subscribe(sub);
}
void loop()
{
str_msg.data = hello;
chatter.publish( &str_msg );
nh.spinOnce();
delay(500);
}

