機器人控制器編程課程-教案03-進階
- 2019 年 10 月 6 日
- 筆記
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/ZhangRelay/article/details/101011276
先簡要複習一下上次課的內容,主要介紹了一些理論上的知識,希望有一個宏觀上的概念。
比如點-線-面-體,>感知<~~>控制<的維度需要匹配等。更多詳細內容可以查看:
機器人感知-視覺部分:https://blog.csdn.net/ZhangRelay/article/details/81352622
並思考:二維空間導航與三維空間抓取操作的異同之處?

機器人的空間、時間和頻率
同時可以回顧,資訊傳輸的時間與頻率的關係,各種維度的資訊需要的數據頻寬。
書中40頁先講述了數字IO,然後在54頁講解了模擬IO。這些都是arduino本身具備的功能。
串口的使用(67頁),類似於點對點的網路,使得其可以與其他單片機或各種支援串口通訊的設備交互資訊。
時間控制函數也需要理解後再掌握其用法。
arduino是一款典型的開源IoT設備,課程本身只針對講解C語言編程和ROS介面。
但是arduino玩法是非常多了(APP與API),下面簡單列一下,有興趣的小夥伴可以自己動手嘗試起來:
全模擬:7 best Arduino simulators for PC to use today
課程重點講解Proteus 8 + Arduino:

Matlab:完美支援,自主學習探索

Python:Arduino-Python3-Command-API

JavaScript:http://johnny-five.io/

總之,目前主流的程式語言,都可以實現對Arduino直接或者間接程式碼調試!!!(ROS部分稍後詳細介紹)
程式碼也不想寫,可不可以呢?Scratch+Arduino,需要先安裝插件。

Chrome插件
這裡需要注意,下圖中間的arduino指示燈:

黃色-設備未連接
配置正確後,可以進行框圖程式設計。
雲端編程,免費的雲端ROS學習體驗環境可以參考如下鏈接:
https://www.shiyanlou.com/courses/854
arduino自然也提供了類似功能,不需要在本地安裝arduino IDE:

create

原理示意圖

連線示意圖

編譯程式並下載

下載成功!
C語言編程官方案例
1.基礎知識 Basics
- Analog Read Serial:讀取電位計,將其狀態輸出到Arduino串列口監視器。
- Bare Minimum:啟動Arduino所需的最少程式碼。
- Blink:打開和關閉LED。
- Digital Read Serial:讀取開關量,將狀態發布到Arduino串列監視器。
- Fade(呼吸燈):演示使用模擬輸出實現漸變亮度的LED。
- Read Analog Voltage:讀取模擬輸入並將電壓發布到串口監視器。
2.數字量 Digital
- Blink Without Delay:不使用延遲 delay() 功能使LED閃爍。
- Button:使用按鈕控制LED。
- Debounce:讀取一個按鈕狀態,過濾噪音。
- Digital Input Pullup:使用pinMode()演示INPUT_PULLUP的使用。
- State Change Detection:計算按鈕按下的次數。
- Tone Keyboard:使用力感測器和壓電揚聲器的三鍵音樂鍵盤。
- Tone Melody:用壓電揚聲器演奏旋律。
- Tone Multiple:使用tone()命令依次在多個揚聲器上播放音調。
- Tone Pitch Follower:根據模擬輸入在壓電揚聲器上演奏音高。
3.模擬量 Analog
- Analog In Out Serial:讀取模擬輸入引腳,輸出結果,然後使用該數據調暗或增亮LED。
- Analog Input:使用電位計控制LED的閃爍。
- Analog Write Mega:使用Arduino Mega板逐個打開和關閉12個LED。
- Calibration:定義預期模擬感測器值的最大值和最小值。
- Fading:使用模擬輸出(PWM引腳)緩慢變化亮度的LED。
- Smoothing:平滑模擬輸入的多個讀數。
4.通訊 Communication
這些示例包括允許Arduino與電腦上運行的Processing進行通訊的程式碼。有關更多資訊或下載Processing,請參閱processing.org。還有Max / MSP修補程式也可以與每個Arduino進行通訊。有關Max / MSP的更多資訊,請參閱Cycling 74。
- ASCIITable:演示Arduino的高級串列輸出功能。
- Dimmer:移動滑鼠以改變LED的亮度。
- Graph:將數據發送到電腦並在Processing中繪製圖表。
- Midi:連續發送MIDI音符資訊。
- Multi Serial Mega:使用Arduino Mega上提供的兩個串列埠。
- Physical Pixel:通過Processing或Max / MSP向Arduino發送數據來打開和關閉LED。
- Read ASCII String:解析以逗號分隔的整數字元串以調節LED亮度。
- Serial Call Response:使用呼叫和響應(握手)方法發送多個變數。
- Serial Call Response ASCII:使用呼叫和響應(握手)方法發送多個變數,並在發送之前對值進行ASCII編碼。
- Serial Event:演示SerialEvent()的使用。
- Serial Passthrough:演示如何虛擬連接Serial和Serial1。
- Virtual Color Mixer:將多個變數從Arduino發送到您的電腦,並在Processing或Max / MSP中讀取它們。
5.控制結構 Control Structures
- Arrays:For循環示例的變體,演示如何使用數組。
- For Loop Iteration:使用for循環和控制多個LED。
- If Statement Conditional:使用'if語句'根據更改輸入條件更改輸出條件。
- Switch Case:如何在離散數量的值之間進行選擇。
- Switch Case 2:第二個switch-case示例,顯示如何根據串列埠中收到的字元執行不同的操作。
- While Statement Conditional:如何在讀取按鈕時使用while循環校準感測器。
6.感測器 Sensors
- ADXL3xx:讀取ADXL3xx加速度計。
- Knock:用壓電元件檢測敲擊。
- Memsic2125:雙軸加速度計。
- Ping:使用超聲波測距儀檢測物體。
7.顯示 Display
- Bar Graph:製作LED條形圖。
- RowColumnScanning:控制8×8 LED矩陣。
8.字元串 Strings
- Character Analysis:使用運算符識別我們正在處理的字元類型。
- String Addition Operator:以各種方式將字元串添加到一起。
- String Append Operator:使用+ =運算符和concat()方法將字元串附加到字元串。
- String Case Changes:更改字元串的大小寫。
- String Characters:獲取/設置字元串中特定字元的值。
- String Comparison Operators:按字母順序比較字元串。
- String Constructors:初始化字元串對象。
- String Index Of:查找字元串中字元的第一個/最後一個實例。
- String Length & String Length Trim:獲取並修剪字元串的長度。
- String Replace:替換字元串中的單個字元。
- String Start With Ends With:檢查給定字元串的開頭或結尾字元/子字元串。
- String Substring:查找給定字元串中的「短語」。
- String To Int:允許您將String轉換為整數。
9. USB (此部分課程中不講解C語言版本,UNO不支援!但是通過ROS可以UNO功能極大擴展)
鍵盤和滑鼠示例是Leonardo,Micro和Due獨有的。演示了如何使用板上獨有的庫。
鍵盤 KEYBOARD
- Keyboard Logout:使用鍵盤命令註銷當前用戶。
- Keyboard Message:按下按鈕時發送文本字元串。
- Keyboard Reprogram:在Arduino IDE中打開一個新窗口,並使用簡單的閃爍程式重新編程Leonardo。
- Keyboard Serial:從串列埠讀取一個位元組,然後發回鍵擊。
- Keyboard Mouse Control:在一個程式中演示滑鼠和鍵盤命令。
滑鼠 MOUSE
- Button Mouse Control:使用5個按鈕控制游標移動。
- Joystick Mouse Contol:按下按鈕時,使用操縱桿控制電腦的游標移動。
10. Starterkit和BasicKit
套件中包含的Project Book中提供 了StarterKit示例的教程,如果您購買了BasicKit,將能夠在Project Ignite上在線訪問項目。
11. Arduino ISP
Arduino ISP將Arduino轉變為在線編程器,重新編程AtMega晶片。如果需要在Arduino上重新載入引導載入程式,如果 從面板上的Arduino轉到AtMega ,或者如果在麵包板上製作自己的Arduino兼容電路,則非常有用。
ROS介面官方案例
- Arduino IDE設置 本教程逐步介紹如何設置Arduino IDE以使用rosserial。
- Hello World(發布器示例) 本教程逐步介紹如何使用rosserial創建發布器。
- 閃爍LED Blink(接收器示例) 本教程逐步介紹如何將rosserial與接收器一起使用。
- 記錄rosserial 本教程逐步介紹了如何使用rosserial的日誌記錄。
- 使用時間和坐標變換TF 本教程介紹如何使用ros :: Time和TF在Arduino上創建tf發布者。
- 溫度感應器 使用TMP102測量溫度
- 按鈕 監視按鈕並在ROS中發布其狀態
- 用rosserial_arduino來製作CMake 本教程介紹如何將CMake構建系統與rosserial_arduino一起使用。
- 伺服控制器示例 使用rosserial和Arduino控制R / C伺服的教程
- IR Ranger教程 使用帶有rosserial和Arduino的IR Ranger
- SRF08超聲波感測器 在本教程中,我們將使用Arduino和SRF08超聲波感測器作為測距儀.SRF08通過SPI / I2C與Arduino通訊。
- BlinkM教程 使用Arduino和rosserial通過ROS控制BlinkM
- Arduino示波器 在本教程中,我們將使用Arduino的ADC(模數轉換器)和rqt_plot製作一個簡易的示波器。
- NodeHandle和ArduinoHardware的高級配置。 本教程逐步介紹如何配置NodeHandle和ArduinoHareware以更好地滿足用戶需求。
- NodeHandles and Initialization
- Messages
- Publishers and Subscribers
- Time
- Logging
- Limitations
- Protocol
- Parameters
配置具體內容參考初識,鏈接如下:
https://blog.csdn.net/ZhangRelay/article/details/100385715
了解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庫 確保Rosserial Arduino Library 0.7.9安裝完成。
這時候,就可以在文件File,示例Examples,自定義示例Costom中找到豐富的示例:
rosserial arduino library 打開一個示例看一看吧,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); }
pubsub
rosgraph ————————————————