ROSArduinoBridge中PID 在 ros端 與arduino端的工作機制
參見博主 diegodiego 的 “
ROS機器人Diego 1#製作(六)base controller---對ros_arduino_bridge的修改,實現兩個馬達獨立PID調速
”PID呼叫流程:
Arduino 端:1, ROSArduinoBridge.ino loop() 方法中的343行 ->updatePID();
需要檢查 ROSArduinoBridge.ino 第233行,參照 base_controller.py 的 def setup_pid(self, pid_params) 方法
ROS端:
1,base_controller.py _init_(self,arduino,base_frame) 第91行 rospy.Subscriber("cmd_vel", Twist, self.cmdVelCallback)
監聽"cmd_vel" topic, 有資訊更新之後啟動回撥函式 cmdVelCallback();
2, cmdVelCallback()去設定目標速度,poll()回重複使用目標速度與arduino端互動,SEE self.arduino.drive(self.v_left, self.v_right)。
poll是在arduino_node.py 的 _init_() 152行被迴圈呼叫的 ,SEE:
if self.use_base_controller:
mutex.acquire()
self.myBaseController.poll()
mutex.release()
為了方便理解update_PID()函式,改寫了個小方法:
#include <iostream>
#include <string>
#include <stdlib.h>
#include<stdio.h>
using namespace std;
int main() {
string source = "u 20:12:0:50:20:12:0:50\r";
int len = source.length();
int i =0;
int arg = 0;
int index =0;
char argv1[32];
char argv2[32];
char cmd;
while (len > 0) {
len--;
char chr = source[i++];
if (chr == 13) {
if (arg == 1)
argv1[index] = NULL;
else if (arg == 2)
argv2[index] = NULL;
}
else if (chr == ' ') {
if (arg == 0)
arg = 1;
else if (arg == 1) {
argv1[index] = NULL;
arg = 2;
index = 0;
}
continue;
} else {
if (arg == 0) {
cmd = chr;
} else if (arg == 1) {
argv1[index] = chr;
index++;
} else if (arg == 2) {
argv2[index] = chr;
index++;
}
}
}
cout << " cmd = "<< cmd << "\n";
cout << " argv1 = "<< argv1 << "\n";
cout << " argv2 = "<< argv2 << "\n";
}
執行結果如下:
cmd = u
argv1 = 20:12:0:50:20:12:0:50
argv2 = ?@
很明顯能夠看出argv1 的值是用來個兩個輪子分別做PID用的。
# 為了直觀的看到 encoder 和 out 之間的關係,修該如下兩處:
arduino_driver.py
def recv_array(self):
''' This command should not be used on its own: it is called by the execute commands
below in a thread safe manner.
'''
try:
temp_str = self.recv(self.timeout * self.N_ANALOG_PORTS)
values = temp_str.split()
if temp_str.find('|'):
i = 0
out = ['','']
list = ['','']
for temp in values:
list = temp.split('|')
values[i] = list[0]
out[i] = list[1]
i +=1
print 'out : ' + str(out)
print 'encoder : '+str(values)
return map(int, values)
except:
return []
ROSArduinoBridge.ino
runCommand(){
.......
case READ_ENCODERS:
Serial.print(readEncoder(LEFT));
Serial.print("|");
Serial.print(leftPID.output);
Serial.print(" ");
Serial.print(readEncoder(RIGHT));
Serial.print("|");
Serial.println(rightPID.output);
break;
........
修改之後就可以直觀的看到 encoder 和out 之間的關係,方便pid的調整。
相關文章
- [譯] 在遠端工作中領悟到的 10 件事
- 淺談雲端計算與安全沙箱機制!
- 遠端除錯在Linux車機中的應用除錯Linux
- COAP協議 - arduino ESP32 M2M(端對端)通訊與程式碼詳解協議UI
- 理解Linux 中sed命令的工作機制Linux
- 在工作過程中,逐步搭建的前後端分離方案和工具後端
- ros的幾種通訊機制及程式碼ROS
- MySQL中的pid與socket是什麼?MySql
- vnc遠端安裝,在Linux中vnc遠端安裝的教程VNCLinux
- React Native原理之跨端通訊機制React Native跨端
- 2018年6月值得買的中端手機推薦 哪款中端手機好?
- 遠端工作的這幾年
- 卡巴斯基:54%的員工在遠端工作時迎來了更高的工作量
- HDFS成員的工作機制
- springMVC 的工作原理和機制SpringMVC
- 遠端工作報告:從遠端到混合
- 在 Linux 終端中閱讀 RedditLinux
- 移動端 web 開發的設計稿與工作流Web
- SSH以及ROS遠端登入設定保姆級教程ROS
- Easyvision中的伺服器與客戶端伺服器客戶端
- 2018年5月值得買的中端手機推薦 五月中端機哪款好?
- 在 ROS 中使用 Protobuf 替代 ros msgROS
- volatile 關鍵字的工作機制
- 詳解Java Socket的工作機制Java
- JS在瀏覽器中的執行機制JS瀏覽器
- Tomcat與Spring中的事件機制詳解TomcatSpring事件
- FlexJobs:遠端工作調查Flex
- 當遠端工作成為未來的工作方式
- 遠端工作|初創企業|兼職/實習|專案制結算
- 如何遠端監控制粒機冷卻烘乾系統的執行狀態與工作引數
- 移動端VIN碼識別在汽車行業中的前景與應用行業
- ROS機器人開發實踐1->SSH遠端登入要點記錄ROS機器人
- 2024年旗艦手機和中端機的區別
- MapReduce之MapTask工作機制APT
- NameNode和SecondaryNameNode工作機制
- Thrift server端的幾種工作模式分析Server模式
- 容器的工作原理和隔離機制
- 3分鐘看懂Python後端必須知道的Django的訊號機制!Python後端Django
- Redis處理客戶端連線的內部實現機制RXRedis客戶端