日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

ROS底盘控制节点 源码分析

發布時間:2025/3/12 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ROS底盘控制节点 源码分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先在機器人端通過launch文件啟動底盤控制。

@robot:~$ roslaunch base_control base_control.launch ... logging to /home/jym/.ros/log/3e52acda-914a-11ec-beaa-ac8247315e93/roslaunch-robot-8759.log Checking log directory for disk usage. This may take a while. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB.started roslaunch server http://192.168.0.110:36751/SUMMARY ========PARAMETERS* /base_control/ackermann_cmd_topic: ackermann_cmd* /base_control/base_id: base_footprint* /base_control/battery_topic: battery* /base_control/baudrate: 115200* /base_control/cmd_vel_topic: cmd_vel* /base_control/imu_id: imu* /base_control/imu_topic: imu* /base_control/odom_id: odom* /base_control/odom_topic: odom* /base_control/port: /dev/move_base* /base_control/pub_imu: False* /base_control/pub_sonar: False* /base_control/sub_ackermann: False* /rosdistro: melodic* /rosversion: 1.14.10NODES/base_control (base_control/base_control.py)auto-starting new master process[master]: started with pid [8769] ROS_MASTER_URI=http://192.168.0.110:11311setting /run_id to 3e52acda-914a-11ec-beaa-ac8247315e93 process[rosout-1]: started with pid [8780] started core service [/rosout] process[base_control-2]: started with pid [8783] [INFO] [1645250866.687446]: NanoCar_Pro base control ... [INFO] [1645250866.713360]: Opening Serial [INFO] [1645250866.716848]: Serial Open Succeed [INFO] [1645250867.309188]: Move Base Hardware Ver 2.1.0,Firmware Ver 2.1.3 [INFO] [1645250867.378238]: SN:002b00413138511532323338 [INFO] [1645250867.385795]: Type:RC_ACKERMAN Motor:RS365 Ratio:11.0 WheelDiameter:72.0

檢查話題列表,看目前ros中有哪些話題。

@robot:~$ rostopic list /battery /cmd_vel /odom /rosout /rosout_agg /tf rostopic is a command-line tool for printing information about ROS Topics.Commands:rostopic bw display bandwidth used by topicrostopic delay display delay of topic from timestamp in headerrostopic echo print messages to screenrostopic find find topics by typerostopic hz display publishing rate of topic rostopic info print information about active topicrostopic list list active topicsrostopic pub publish data to topicrostopic type print topic or field type

battery話題,輸出的內容有電池的電壓和電流,發布者是機器人底盤。

@robot:~$ rostopic info /battery Type: sensor_msgs/BatteryStatePublishers: * /base_control (http://192.168.0.110:38535/)Subscribers: None@robot:~$ rostopic echo /battery header: seq: 1stamp: secs: 1645251153nsecs: 739257097frame_id: "base_footprint" voltage: 12.0539999008 current: 0.670000016689 charge: 0.0 capacity: 0.0 design_capacity: 0.0 percentage: 0.0 power_supply_status: 0 power_supply_health: 0 power_supply_technology: 0 present: False cell_voltage: [] location: '' serial_number: '' ---

cmd_vel話題,訂閱者是底盤

@robot:~$ rostopic info /cmd_vel Type: geometry_msgs/TwistPublishers: NoneSubscribers: * /base_control (http://192.168.0.110:38535/)

odom話題,里程計,發布者是機器人底盤。

@robot:~$ rostopic info /odom Type: nav_msgs/OdometryPublishers: * /base_control (http://192.168.0.110:38535/)Subscribers: None

odom話題,輸出的主要信息是位置坐標,航向、線加速度、角加速度。

@robot:~$ rostopic echo /odom header: seq: 1stamp: secs: 1645251339nsecs: 379389047frame_id: "odom" child_frame_id: "base_footprint" pose: pose: position: x: 0.0y: 0.0z: 0.0orientation: x: 0.0y: 0.0z: 0.0w: 1.0covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] twist: twist: linear: x: 0.0y: 0.0z: 0.0angular: x: 0.0y: 0.0z: -0.006covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] ---

然后在機器人端終止運行。輸出下面這些提示。

^C[base_control-2] killing on exit [rosout-1] killing on exit [master] killing on exit shutting down processing monitor... ... shutting down processing monitor complete done

初始化

下面看一下底盤控制節點的可執行文件base_control.py里面的BaseControl類,類里面有一些初始化。

為什么訂閱器不需要定時器而發布器需要定時器。

因為訂閱器是通過話題來驅動的,收到了訂閱的話題之后,會直接跳轉到回調函數里面,不需要定時器定期來執行。

關于timer_communication:

用于檢查現在nano是否收到stm32的消息。定時器時間到了就去執行timerCommunicationCB回調函數。

def __init__(self):#Get params,獲取各種參數,獲取的參數就是launch文件中param標簽設置的參數。#如果沒有在 launch 文件中獲取到這些參數就會使用類中提前設置的默認值。self.baseId = rospy.get_param('~base_id','base_footprint')self.odomId = rospy.get_param('~odom_id','odom')self.device_port = rospy.get_param('~port','/dev/ttyUSB0')self.baudrate = int(rospy.get_param('~baudrate','115200'))self.odom_freq = int(rospy.get_param('~odom_freq','50'))self.odom_topic = rospy.get_param('~odom_topic','/odom')self.battery_topic = rospy.get_param('~battery_topic','battery')self.battery_freq = float(rospy.get_param('~battery_freq','1'))self.cmd_vel_topic= rospy.get_param('~cmd_vel_topic','/cmd_vel')self.ackermann_cmd_topic = rospy.get_param('~ackermann_cmd_topic','/ackermann_cmd_topic')#如果在啟動時設置底盤節點launch文件pub_imu參數為True,底盤節點接收launch文件中param標簽的參數,然后設置imu變量信息self.pub_imu = bool(rospy.get_param('~pub_imu',False))if(self.pub_imu == True):self.imuId = rospy.get_param('~imu_id','imu')self.imu_topic = rospy.get_param('~imu_topic','imu')self.imu_freq = float(rospy.get_param('~imu_freq','50'))if self.imu_freq > 100:self.imu_freq = 100self.pub_sonar = bool(rospy.get_param('~pub_sonar',False))self.sub_ackermann = bool(rospy.get_param('~sub_ackermann',False))#define param,BaseControl類使用到的變量的定義self.current_time = rospy.Time.now()self.previous_time = self.current_timeself.pose_x = 0.0self.pose_y = 0.0self.pose_yaw = 0.0self.serialIDLE_flag = 0self.trans_x = 0.0self.trans_y = 0.0self.rotat_z = 0.0self.speed = 0.0self.steering_angle = 0.0self.sendcounter = 0self.ImuErrFlag = Falseself.EncoderFlag = Falseself.BatteryFlag = Falseself.OdomTimeCounter = 0self.BatteryTimeCounter = 0self.Circleloop = queue(capacity = 1024*4)#注意這個環形隊列,存放串口中緩存的數據self.Vx = 0self.Vy = 0self.Vyaw = 0self.Yawz = 0self.Vvoltage = 0self.Icurrent = 0self.Gyro = [0,0,0]self.Accel = [0,0,0]self.Quat = [0,0,0,0]self.Sonar = [0,0,0,0]self.movebase_firmware_version = [0,0,0]self.movebase_hardware_version = [0,0,0]self.movebase_type = ["NanoCar","NanoRobot","4WD_OMNI","4WD"]self.motor_type = ["25GA370","37GB520"]self.last_cmd_vel_time = rospy.Time.now()self.last_ackermann_cmd_time = rospy.Time.now()# Serial Communication,串口通信,打開NANO串口并連接到stm32上try:self.serial = serial.Serial(self.device_port,self.baudrate,timeout=10)rospy.loginfo("Opening Serial")try:if self.serial.in_waiting:self.serial.readall()except:rospy.loginfo("Opening Serial Try Faild")passexcept:rospy.logerr("Can not open Serial"+self.device_port)self.serial.closesys.exit(0)rospy.loginfo("Serial Open Succeed")#if move base type is ackermann car like robot and use ackermann msg ,sud ackermann topic,else sub cmd_vel topic#不同機器人結構類型下訂閱器的定義if(('NanoCar' in base_type) & (self.sub_ackermann == True)):#設置為阿克曼結構類型,在launch文件中默認sub_ackermann為Falsefrom ackermann_msgs.msg import AckermannDriveStampedself.sub = rospy.Subscriber(self.ackermann_cmd_topic,AckermannDriveStamped,self.ackermannCmdCB,queue_size=20)else:#否則,訂閱器訂閱消息類型為 Twist,接收話題為 cmd_vel,收到話題就會進入 cmdCB 函數self.sub = rospy.Subscriber(self.cmd_vel_topic,Twist,self.cmdCB,queue_size=20)#queue_size參數是在ROS Hydro及更新版本中新增的,用于在訂閱者接收消息的速度不夠快的情況下,限制排隊的消息數量。self.pub = rospy.Publisher(self.odom_topic,Odometry,queue_size=10)self.battery_pub = rospy.Publisher(self.battery_topic,BatteryState,queue_size=3)if self.pub_sonar:#超聲波消息類型的發布if sonar_num > 0:self.timer_sonar = rospy.Timer(rospy.Duration(100.0/1000),self.timerSonarCB)self.range_pub1 = rospy.Publisher('sonar_1',Range,queue_size=3)if sonar_num > 1: self.range_pub2 = rospy.Publisher('sonar_2',Range,queue_size=3)if sonar_num > 2:self.range_pub3 = rospy.Publisher('sonar_3',Range,queue_size=3)if sonar_num > 3:self.range_pub4 = rospy.Publisher('sonar_4',Range,queue_size=3)self.tf_broadcaster = tf.TransformBroadcaster()#tf坐標發布器,實時發布坐標偏移量#發布器 根據頻率定期執行話題發布任務self.timer_odom = rospy.Timer(rospy.Duration(1.0/self.odom_freq),self.timerOdomCB)#里程計self.timer_battery = rospy.Timer(rospy.Duration(1.0/self.battery_freq),self.timerBatteryCB) self.timer_communication = rospy.Timer(rospy.Duration(1.0/500),self.timerCommunicationCB)#與stm32通訊的定時器#inorder to compatibility old version firmware,imu topic is NOT pud in defaultif(self.pub_imu):#imu 的發布器和定時器self.timer_imu = rospy.Timer(rospy.Duration(1.0/self.imu_freq),self.timerIMUCB) self.imu_pub = rospy.Publisher(self.imu_topic,Imu,queue_size=10)self.getVersion()#獲取底盤軟硬件版本號#move base imu initialization need about 2s,during initialization,move base system is blocked#so need this gap#獲取通訊協議(因為剛才獲取了底盤軟硬件版本號)與底盤建立連接后會初始化imu,在此期間不接收數據所以需要這個延遲#為了保證此時沒有大量數據傳到底盤的通訊隊列里面time.sleep(2.2)self.getSN()#查詢主板 SN 號,這里只是發出去了還沒有收到回復time.sleep(0.01)self.getInfo()#獲取底盤配置信息

注:代碼里的Timer:

rospy.Timer(period,callback,oneshot=False)
period,調用回調函數的時間間隔,如rospy.Duration(0.1)即為10分之1秒
callback,回調函數的定義
oneshot,定時器,是否多次執行。false即一直執行。Timer實例會在每一個時間間隔,調用一次my_callback。

def my_callback(event):print 'Timer called at' + str(event.current_real)rospy.Timer(rospy.Duration(2),my_callback)

自定義通訊協議

通訊協議數據構成:串口波特率:115200,1停止位,8數據位,無校驗。

約定:

0.幀頭:1Byte 0x5a 固定值

1.功能碼:1Byte控制板端(stm32)發送的功能碼為偶數,控制板端(stm32)接收的功能碼為奇數

2.幀長度:整個數據包長度,包括從幀頭到校驗碼全部數據。

幀頭(1 Byte)+幀長度(1 Byte)+ID(1 Byte)+功能碼(1 Byte)+數據(0~250Byte))+預留位(1 Byte)+CRC校驗(1 Byte)

3.ID:下位機編號,為級聯設計預留。

4.預留位,設置為0x00,為后續協議擴展預留。

5.CRC校驗:1Byte,校驗方式為CRC-8/MAXIM,設置為0xFF,則強制不進行CRC校驗。

6.數據:長度和內容具體參照各功能碼定義。

7.線速度單位為m/s,角速度單位為rad/s(弧度制),角度單位為度(角度制)。

nano-stm32建立連接定義:

在未建立連接的狀態下,stm32收到協議內數據,則判定為建立連接,建立連接時,stm32IMU會執行初始化,耗時2S左右。

nano-stm32斷開連接定義:

在建立連接狀態后,超過1000ms沒有收到新的協議內數據,stm32判定斷開連接,主動停止電機運動。

其中一部分功能碼如下,根據不同的功能碼,讀取不同的值。

0x01 上位機向下位機發送速度控制指令,數據長度為6Byte,數據為X軸方向速度*1000(int16_t) + Y軸方向速度*1000(int16_t) + Z軸角速度*1000(int16_t) 數據格式為: Byte1 Byte2 Byte3 Byte4 Byte5 Byte6 X MSB X LSB Y MSB Y LSB Z MSB Z LSB 例:5A 0C 01 01 01 F4 00 00 00 00 00 56 (底盤以0.5m/s的速度向前運動) 注:500=0x01F412=0x0c(databuf[3] == 0x14):#下位機上報IMU數據GyroX*100000(int32_t)、GyroY*100000(int32_t)、GyroZ*100000(int32_t)、 AccelX*100000(int32_t)、AccelY*100000(int32_t)、AccelZ*100000(int32_t)、QuatW×10000、QuatX×10000、QuatY×10000、QuatZ×100000x22 下位機回復配置信息 BASE_TYPE(底盤類型uint8_t) + MOTOR_TYPE(電機型號uint8_t) + ratio*10(電機減速比int16_t) + diameter*10(輪胎直徑int16_t) #class queue is design for uart receive data cache #環形隊列的讀出和存儲,做通訊協議解析時候,防止未及時讀信息導致信息丟失。 class queue:def __init__(self, capacity = 1024*4):self.capacity = capacityself.size = 0self.front = 0self.rear = 0self.array = [0]*capacitydef is_empty(self):return 0 == self.sizedef is_full(self):return self.size == self.capacitydef enqueue(self, element):if self.is_full():raise Exception('queue is full')self.array[self.rear] = elementself.size += 1self.rear = (self.rear + 1) % self.capacitydef dequeue(self):if self.is_empty():raise Exception('queue is empty')self.size -= 1self.front = (self.front + 1) % self.capacitydef get_front(self):return self.array[self.front]def get_front_second(self):return self.array[((self.front + 1) % self.capacity)]def get_queue_length(self):return (self.rear - self.front + self.capacity) % self.capacitydef show_queue(self):for i in range(self.capacity):print self.array[i],print(' ') #CRC-8 Calculate crc計算函數用來做通訊校驗def crc_1byte(self,data):crc_1byte = 0for i in range(0,8):if((crc_1byte^data)&0x01):crc_1byte^=0x18crc_1byte>>=1crc_1byte|=0x80else:crc_1byte>>=1data>>=1return crc_1bytedef crc_byte(self,data,length):ret = 0for i in range(length):ret = self.crc_1byte(ret^data[i])return ret

base_control節點將訂閱的cmd_vel信息通過串口或其它通信接口發送給下位機(嵌入式控制板)。

#Subscribe vel_cmd call this to send vel cmd to move base #cmdCB 會把接收到的話題的關鍵信息取出來,根據通信協議做一個轉換。再通過串口發送到底盤上,實現對底盤的控制def cmdCB(self,data):self.trans_x = data.linear.xself.trans_y = data.linear.yself.rotat_z = data.angular.zself.last_cmd_vel_time = rospy.Time.now()output = chr(0x5a) + chr(12) + chr(0x01) + chr(0x01) + \chr((int(self.trans_x*1000.0)>>8)&0xff) + chr(int(self.trans_x*1000.0)&0xff) + \chr((int(self.trans_y*1000.0)>>8)&0xff) + chr(int(self.trans_y*1000.0)&0xff) + \chr((int(self.rotat_z*1000.0)>>8)&0xff) + chr(int(self.rotat_z*1000.0)&0xff) + \chr(0x00)outputdata = [0x5a,0x0c,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]outputdata[4] = (int(self.trans_x*1000.0)>>8)&0xffoutputdata[5] = int(self.trans_x*1000.0)&0xffoutputdata[6] = (int(self.trans_y*1000.0)>>8)&0xffoutputdata[7] = int(self.trans_y*1000.0)&0xffoutputdata[8] = (int(self.rotat_z*1000.0)>>8)&0xffoutputdata[9] = int(self.rotat_z*1000.0)&0xffcrc_8 = self.crc_byte(outputdata,len(outputdata)-1)output += chr(crc_8)while self.serialIDLE_flag:time.sleep(0.01)self.serialIDLE_flag = 4try:while self.serial.out_waiting:passself.serial.write(output)except:rospy.logerr("Vel Command Send Faild")self.serialIDLE_flag = 0 #Communication Timer callback to handle receive data,通訊定時器回調函數#depend on communication protocoldef timerCommunicationCB(self,event):length = self.serial.in_waitingif length:#當定時時間到,檢查串口中是否有緩存的數據。有則讀取,存放到環形消息隊列中reading = self.serial.read_all()if len(reading)!=0:for i in range(0,len(reading)):data = (int(reading[i].encode('hex'),16)) try:self.Circleloop.enqueue(data)#把收到的消息讀出來,防止緩存滿,消息丟失except:passelse:pass#將環形隊列中的內容重新讀出來,所有stm32從串口發送到nano的數據都是在這個回調函數里做的處理if self.Circleloop.is_empty()==False:data = self.Circleloop.get_front()if data == 0x5a:#如果讀出來的數據是數據幀的幀頭就獲取數據長度length = self.Circleloop.get_front_second()#幀長度if length > 1 :if self.Circleloop.get_front_second() <= self.Circleloop.get_queue_length():databuf = []for i in range(length):databuf.append(self.Circleloop.get_front())self.Circleloop.dequeue()if (databuf[length-1]) == self.crc_byte(databuf,length-1):passelse:pass#parse receive data,根據功能碼設置讀取不同的值,下面功能碼都是偶數。意味著stm32向nano發送數據if(databuf[3] == 0x04):#下位機上報當前速度,數據長度為6Byteself.Vx = databuf[4]*256self.Vx += databuf[5]self.Vy = databuf[6]*256self.Vy += databuf[7]self.Vyaw = databuf[8]*256self.Vyaw += databuf[9]elif(databuf[3] == 0x06):#下位機上報當IMU數據self.Yawz = databuf[8]*256self.Yawz += databuf[9]elif (databuf[3] == 0x08):#下位機上報電池信息,電壓Voltage*1000(uint16_t) + 電流Current*1000(uint16_t)self.Vvoltage = databuf[4]*256self.Vvoltage += databuf[5]self.Icurrent = databuf[6]*256self.Icurrent += databuf[7]elif (databuf[3] == 0x0a):#下位機上報速度航向信息,線速度*1000、角度*100、角速度*1000self.Vx = databuf[4]*256self.Vx += databuf[5]self.Yawz = databuf[6]*256self.Yawz += databuf[7]self.Vyaw = databuf[8]*256self.Vyaw += databuf[9]elif (databuf[3] == 0x12):#下位機上報速度航向信息,X軸線速度*1000、Y軸線速度*1000、角度*100、角速度*1000self.Vx = databuf[4]*256self.Vx += databuf[5]self.Vy = databuf[6]*256self.Vy += databuf[7]self.Yawz = databuf[8]*256self.Yawz += databuf[9] self.Vyaw = databuf[10]*256self.Vyaw += databuf[11] elif (databuf[3] == 0x14):#下位機上報IMU數據self.Gyro[0] = int(((databuf[4]&0xff)<<24)|((databuf[5]&0xff)<<16)|((databuf[6]&0xff)<<8)|(databuf[7]&0xff))self.Gyro[1] = int(((databuf[8]&0xff)<<24)|((databuf[9]&0xff)<<16)|((databuf[10]&0xff)<<8)|(databuf[11]&0xff))self.Gyro[2] = int(((databuf[12]&0xff)<<24)|((databuf[13]&0xff)<<16)|((databuf[14]&0xff)<<8)|(databuf[15]&0xff))self.Accel[0] = int(((databuf[16]&0xff)<<24)|((databuf[17]&0xff)<<16)|((databuf[18]&0xff)<<8)|(databuf[19]&0xff))self.Accel[1] = int(((databuf[20]&0xff)<<24)|((databuf[21]&0xff)<<16)|((databuf[22]&0xff)<<8)|(databuf[23]&0xff))self.Accel[2] = int(((databuf[24]&0xff)<<24)|((databuf[25]&0xff)<<16)|((databuf[26]&0xff)<<8)|(databuf[27]&0xff))self.Quat[0] = int((databuf[28]&0xff)<<8|databuf[29])self.Quat[1] = int((databuf[30]&0xff)<<8|databuf[31])self.Quat[2] = int((databuf[32]&0xff)<<8|databuf[33])self.Quat[3] = int((databuf[34]&0xff)<<8|databuf[35])elif (databuf[3] == 0x1a):self.Sonar[0] = databuf[4]self.Sonar[1] = databuf[5]self.Sonar[2] = databuf[6]self.Sonar[3] = databuf[7] elif(databuf[3] == 0xf2):#下位機回復版本號,硬件版本號xx.yy.zz,軟件版本號aa.bb.ccself.movebase_hardware_version[0] = databuf[4]self.movebase_hardware_version[1] = databuf[5]self.movebase_hardware_version[2] = databuf[6]self.movebase_firmware_version[0] = databuf[7]self.movebase_firmware_version[1] = databuf[8]self.movebase_firmware_version[2] = databuf[9]version_string = "Move Base Hardware Ver %d.%d.%d,Firmware Ver %d.%d.%d"\%(self.movebase_hardware_version[0],self.movebase_hardware_version[1],self.movebase_hardware_version[2],\self.movebase_firmware_version[0],self.movebase_firmware_version[1],self.movebase_firmware_version[2])rospy.loginfo(version_string)elif(databuf[3] == 0xf4):#下位機回復SN號sn_string = "SN:"for i in range(4,16):#數據長度為12Byte,高位在前,低位在后sn_string = "%s%02x"%(sn_string,databuf[i])rospy.loginfo(sn_string) elif(databuf[3] == 0x22):#下位機回復配置信息fRatio = float(databuf[6]<<8|databuf[7])/10fDiameter = float(databuf[8]<<8|databuf[9])/10info_string = "Type:%s Motor:%s Ratio:%.01f WheelDiameter:%.01f"\%(self.movebase_type[databuf[4]-1],self.motor_type[databuf[5]-1],fRatio,fDiameter)rospy.loginfo(info_string)else:passelse:passelse:self.Circleloop.dequeue()else:# rospy.loginfo("Circle is Empty")pass

通信協議和話題的轉換

#Odom Timer call this to get velocity and imu info and convert to odom topicdef timerOdomCB(self,event):#使用串口給stm32發送一條消息來獲取里程計信息#Get move base velocity dataif self.movebase_firmware_version[1] == 0: #old version firmware have no version info and not support new command belowoutput = chr(0x5a) + chr(0x06) + chr(0x01) + chr(0x09) + chr(0x00) + chr(0x38) #0x38 is CRC-8 valueelse:#nano向stm32獲取里程計信息#in firmware version new than v1.1.0,support this command output = chr(0x5a) + chr(0x06) + chr(0x01) + chr(0x11) + chr(0x00) + chr(0xa2) while(self.serialIDLE_flag):time.sleep(0.01)self.serialIDLE_flag = 1try:while self.serial.out_waiting:passself.serial.write(output)except:rospy.logerr("Odom Command Send Faild")self.serialIDLE_flag = 0 #calculate odom data,#stm32返回的里程計信息在 timerCommunicationCB 函數中做解析后取得速度self.Vx賦值給局部變量Vx = float(ctypes.c_int16(self.Vx).value/1000.0)Vy = float(ctypes.c_int16(self.Vy).value/1000.0)Vyaw = float(ctypes.c_int16(self.Vyaw).value/1000.0)self.pose_yaw = float(ctypes.c_int16(self.Yawz).value/100.0)self.pose_yaw = self.pose_yaw*math.pi/180.0self.current_time = rospy.Time.now()dt = (self.current_time - self.previous_time).to_sec()self.previous_time = self.current_timeself.pose_x = self.pose_x + Vx * (math.cos(self.pose_yaw))*dt - Vy * (math.sin(self.pose_yaw))*dt#速度對時間做積分得出相對位移self.pose_y = self.pose_y + Vx * (math.sin(self.pose_yaw))*dt + Vy * (math.cos(self.pose_yaw))*dtpose_quat = tf.transformations.quaternion_from_euler(0,0,self.pose_yaw) #通信協議和話題的一個轉換msg = Odometry()#定義了一個里程計的消息類型msg.header.stamp = self.current_timemsg.header.frame_id = self.odomIdmsg.child_frame_id =self.baseIdmsg.pose.pose.position.x = self.pose_x#將前面計算出來的值給到消息中msg.pose.pose.position.y = self.pose_ymsg.pose.pose.position.z = 0msg.pose.pose.orientation.x = pose_quat[0]msg.pose.pose.orientation.y = pose_quat[1]msg.pose.pose.orientation.z = pose_quat[2]msg.pose.pose.orientation.w = pose_quat[3]msg.twist.twist.linear.x = Vxmsg.twist.twist.linear.y = Vymsg.twist.twist.angular.z = Vyawself.pub.publish(msg)#通過里程計發布器發布出去,之前定義過pubself.tf_broadcaster.sendTransform((self.pose_x,self.pose_y,0.0),pose_quat,self.current_time,self.baseId,self.odomId) #Battery Timer callback function to get battery infodef timerBatteryCB(self,event):#給stm32發送查詢電池信息的指令output = chr(0x5a) + chr(0x06) + chr(0x01) + chr(0x07) + chr(0x00) + chr(0xe4) #0xe4 is CRC-8 valuewhile(self.serialIDLE_flag):time.sleep(0.01)self.serialIDLE_flag = 3try:while self.serial.out_waiting:passself.serial.write(output)except:rospy.logerr("Battery Command Send Faild")self.serialIDLE_flag = 0msg = BatteryState()#之所以沒有對獲取的數據做解析,是因為解析已經在timerCommunicationCB函數里面進行了msg.header.stamp = self.current_time#獲取到的數值傳輸到電池類型的消息中msg.header.frame_id = self.baseIdmsg.voltage = float(self.Vvoltage/1000.0)msg.current = float(self.Icurrent/1000.0)self.battery_pub.publish(msg)#通過發布器發布

nano向stm32要東西的回調函數運行流程:nano先給stm32發送指令,給stm32說,我要你的東西。stm32傳回的數據由timerCommunicationCB函數解析處理,回調函數將獲取的處理后的值傳到消息中,然后通過發布器發出去。

#main function if __name__=="__main__":try:rospy.init_node('base_control',anonymous=True)if base_type != None:rospy.loginfo('%s base control ...'%base_type)else:rospy.loginfo('base control ...')rospy.logerr('PLEASE SET BASE_TYPE ENV FIRST')bc = BaseControl()#執行這個類rospy.spin()#循環執行except KeyboardInterrupt:bc.serial.closeprint("Shutting down")

坐標變換

tf_broadcaster.sendTransform是一個靜態變換,因為機器人imu和底盤固定,轉換關系就固定。

#IMU Timer callback function to get raw imu infodef timerIMUCB(self,event):output = chr(0x5a) + chr(0x06) + chr(0x01) + chr(0x13) + chr(0x00) + chr(0x33) #0x33 is CRC-8 valuewhile(self.serialIDLE_flag):time.sleep(0.01)self.serialIDLE_flag = 3try:while self.serial.out_waiting:passself.serial.write(output)except:rospy.logerr("Imu Command Send Faild")self.serialIDLE_flag = 0msg = Imu()msg.header.stamp = self.current_timemsg.header.frame_id = self.imuIdmsg.angular_velocity.x = float(ctypes.c_int32(self.Gyro[0]).value/100000.0)msg.angular_velocity.y = float(ctypes.c_int32(self.Gyro[1]).value/100000.0)msg.angular_velocity.z = float(ctypes.c_int32(self.Gyro[2]).value/100000.0)msg.linear_acceleration.x = float(ctypes.c_int32(self.Accel[0]).value/100000.0)msg.linear_acceleration.y = float(ctypes.c_int32(self.Accel[1]).value/100000.0)msg.linear_acceleration.z = float(ctypes.c_int32(self.Accel[2]).value/100000.0)msg.orientation.w = float(ctypes.c_int16(self.Quat[0]).value/10000.0)msg.orientation.x = float(ctypes.c_int16(self.Quat[1]).value/10000.0)msg.orientation.y = float(ctypes.c_int16(self.Quat[2]).value/10000.0)msg.orientation.z = float(ctypes.c_int16(self.Quat[3]).value/10000.0)self.imu_pub.publish(msg) # TF value calculate from mechanical structure#讀取車型,執行坐標變換。坐標作為話題發補出去,需要時間戳current_timeif('NanoRobot' in base_type):#第一個三個參數是距離變換,第二個是四元數的xyzw,角度變換self.tf_broadcaster.sendTransform((-0.062,-0.007,0.08),(0.0,0.0,0.0,1.0),self.current_time,self.imuId,self.baseId) elif('NanoCar' in base_type):#imuId子坐標,baseId父坐標,從子坐標到父坐標的轉換self.tf_broadcaster.sendTransform((0.0,0.0,0.09),(0.0,0.0,0.0,1.0),self.current_time,self.imuId,self.baseId) elif('4WD' in base_type):self.tf_broadcaster.sendTransform((-0.065,0.0167,0.02),(0.0,0.0,0.0,1.0),self.current_time,self.imuId,self.baseId) else:pass def timerOdomCB(self,event):#這個是個動態轉換,傳入的值是一個變量self.tf_broadcaster.sendTransform((self.pose_x,self.pose_y,0.0),pose_quat,self.current_time,self.baseId,self.odomId)

setbase.sh

定義機器人底盤類型,寫到命令行里面,后面是帶了個參數,參數就作為環境變量寫入~/.bashrc 文件。

~代表用戶主目錄。

#!/bin/bashBASE_TYPE=$1 echo "export BASE_TYPE=$BASE_TYPE" >> ~/.bashrc source ~/.bashrc $ ./setbase.sh abc bashrc 文件里面:出現同名的環境變量時只生效文件最末尾的 export BASE_TYPE=abc

udev 規則

進行端口 udev 規則轉換(重命名)。

樹莓派與機器人連接使用硬件串口,端口名無法修改。腳本會將 ttyS0 創建一個符號鏈接,move_base 鏈接到 ttyS0 ,賦予它所有用戶可讀可寫權限。(重命名為move_base 并修改權限為可讀寫,MODE=0666表示可讀寫)

第一句話是指明腳本的解釋器。

第二句話是輸入到/etc/udev/rules.d/move_base_pi4.rules這個文件里面

#!/bin/bashecho 'KERNEL=="ttyS0", MODE:="0666", GROUP:="dialout", SYMLINK+="move_base"' >/etc/udev/rules.d/move_base_pi4.rulessystemctl daemon-reload service udev reload sleep 1 service udev restart

統一端口名稱。如果使用的是 USB 轉串口的芯片,連接時端口名不確定。有可能是 ttyUSB0 也有可能是 ttyUSB1,多個設備通過usb連主機,很難分辨各個端口名所對應的設備。可以給USB 轉串口的芯片設定規則,根據芯片的 Vender ID 和 Product ID 進行篩選。

給底盤使用的CH340芯片創建一個規則:端口名稱是ttyUSB開頭。

#!/bin/bashecho 'KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0777", GROUP:="dialout", SYMLINK+="move_base"' >/etc/udev/rules.d/move_base_340.rulessystemctl daemon-reload service udev reload sleep 1 service udev restart ls -l /dev/ move_base設備,會進行鏈接

總結

以上是生活随笔為你收集整理的ROS底盘控制节点 源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

亚洲精品视频在线看 | 中文字幕制服丝袜av久久 | 黄色在线观看污 | 国产精品成人一区二区三区 | 国内精品久久久久影院优 | 一区二区三区电影大全 | 精品久久久久久亚洲综合网站 | 在线天堂中文在线资源网 | 久久精品一区二区国产 | 国产一区二区久久久久 | 九九九热精品免费视频观看网站 | 久久伦理网 | 国产精品一区二区三区在线播放 | 欧美日韩午夜 | 日日爱网站| 国产资源在线免费观看 | 五月天免费网站 | 国产精品欧美久久久久无广告 | 日韩视频 一区 | 欧美日韩一区二区免费在线观看 | 久久国产欧美日韩精品 | 超碰97国产精品人人cao | 日韩在线一区二区免费 | 天天操天天操天天操 | 亚洲午夜久久久久久久久电影网 | av超碰免费在线 | 91精品在线视频观看 | 免费高清在线观看电视网站 | av中文字幕第一页 | 欧美日韩伦理一区 | 天天天干天天天操 | 久久国际影院 | 欧美精品国产综合久久 | av理论电影| 亚洲精品在线观看中文字幕 | 精品一二 | 在线观看深夜福利 | 欧美另类巨大 | 天堂av观看 | 中文乱码视频在线观看 | a级片在线播放 | 看国产黄色片 | 免费在线观看不卡av | 免费97视频 | 国产精品一区二区62 | 亚洲精品国产视频 | 欧美日本中文字幕 | 一级免费av | 西西4444www大胆视频 | 特级黄色视频毛片 | 久久99久久99精品免观看软件 | 久久久久国产a免费观看rela | 国产免费又爽又刺激在线观看 | 白丝av免费观看 | 色大片免费看 | 久久99国产精品免费 | 亚洲视频在线播放 | 色在线免费 | 国产精品久久久久久婷婷天堂 | 日韩性xxxx | 成人在线免费观看网站 | 久久久久久久久久毛片 | 色偷偷男人的天堂av | 精品国产一区二区三区久久久蜜月 | 国产专区在线视频 | 国产福利91精品一区 | 超碰免费97 | 日韩一区二区三区在线观看 | 又色又爽又黄高潮的免费视频 | 国产精品手机在线 | 欧美伊人网 | 欧美在线不卡一区 | 国产做aⅴ在线视频播放 | 99久久精品国产欧美主题曲 | 在线а√天堂中文官网 | 亚洲精品在线观看网站 | 国产另类xxxxhd高清 | 97免费公开视频 | 五月婷婷网站 | 色吊丝av中文字幕 | 天天插天天干天天操 | 久久夜色电影 | 亚洲五月 | 5月丁香婷婷综合 | 久久毛片高清国产 | 精品国产人成亚洲区 | 99精品在线免费在线观看 | 亚洲国产一区二区精品专区 | 国产精品久久久久久久久久东京 | 国产视频资源 | 国产精品扒开做爽爽的视频 | 日韩 精品 一区 国产 麻豆 | 亚洲精品高清视频 | 91综合久久一区二区 | 欧美了一区在线观看 | 97超碰人| 亚洲小视频在线观看 | 免费看一级黄色大全 | 五月婷婷一区二区三区 | 国产在线精品区 | 91在线91拍拍在线91 | 亚洲综合视频在线观看 | 国产成人精品久久久 | 亚洲人视频在线 | 久久在线免费观看视频 | 亚洲国产精品电影 | 久久国产视频网站 | 中文一区在线观看 | 亚洲砖区区免费 | 国产成人一区二区三区 | 91精品国产欧美一区二区 | 欧美日韩在线精品 | 91女神的呻吟细腰翘臀美女 | 免费看毛片在线 | 国产精品系列在线观看 | 黄色录像av | 麻豆视频成人 | 日韩久久精品一区二区 | 成人一区二区三区在线 | 欧美色久 | 国产短视频在线播放 | 性日韩欧美在线视频 | 日韩黄在线观看 | 亚洲影视九九影院在线观看 | 久久理论视频 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 欧美在线观看视频一区二区三区 | 婷婷丁香花 | 国产一级在线观看 | av888av.com| 欧美午夜性 | 久久久久久久久网站 | 黄色一级大片在线免费看国产一 | 在线天堂中文www视软件 | 91麻豆精品国产91久久久无限制版 | 色婷婷在线视频 | 国产精品久久久久久久久免费看 | 免费av网址在线观看 | 久久免费成人网 | 久草在线视频在线 | 中文字幕在线播出 | 欧美在线视频一区二区 | 中文字幕 影院 | 色婷婷综合在线 | 成人久久网 | 欧美巨乳波霸 | 亚洲天堂网在线播放 | 麻花豆传媒mv在线观看 | a√天堂资源 | 最新av观看 | 国产一区二区中文字幕 | 亚洲国产精品传媒在线观看 | 美女免费av | 国产五月色婷婷六月丁香视频 | 日韩欧美视频免费观看 | 在线免费观看视频a | 久久精品视频国产 | 色噜噜日韩精品欧美一区二区 | 久久黄色小说视频 | 成 人 黄 色 片 在线播放 | 九九影视理伦片 | 久久激情综合网 | 国产精品久久久久久久久久东京 | 欧美精品一区二区免费 | 日韩午夜精品福利 | 夜夜操夜夜干 | 亚洲天天摸日日摸天天欢 | 国产综合在线视频 | 亚洲观看黄色网 | 天天操天天能 | 在线观看深夜福利 | 中文在线免费看视频 | 国产福利91精品 | 欧美a级在线免费观看 | 91大片网站 | 男女免费av| 色亚洲网 | 国产99久久 | 伊人五月天综合 | 日日弄天天弄美女bbbb | 久久久久国产免费免费 | 久草在线观看视频免费 | 欧美日韩亚洲在线 | 在线观看精品一区 | 国产精品精品国产色婷婷 | 91在线观 | 337p日本欧洲亚洲大胆裸体艺术 | 超碰99人人| 五月婷婷视频在线观看 | 国产麻豆电影在线观看 | 香蕉蜜桃视频 | 久草视频免费播放 | 免费黄av| 五月激情姐姐 | 国产免费视频一区二区裸体 | 免费97视频 | 日韩网站在线免费观看 | 精品国内自产拍在线观看视频 | 西西444www高清大胆 | 亚洲精品免费在线观看 | 欧美精品日韩 | 欧美日韩精品二区第二页 | 在线观看的a站 | 亚洲一区二区观看 | 久久这里只有精品9 | 丁香六月综合网 | 国产91精品一区二区麻豆网站 | 国产中文伊人 | 亚洲一区美女视频在线观看免费 | 一区二区av | 成人黄色毛片视频 | 亚洲精品国产精品乱码在线观看 | 五月婷婷视频在线观看 | 91视频亚洲| 在线观看视频你懂得 | 日韩成人黄色av | 国产主播大尺度精品福利免费 | 国产中文字幕视频在线 | 日韩欧美精品一区二区三区经典 | 亚洲综合国产精品 | 亚洲伊人成综合网 | av大片免费在线观看 | 91九色视频在线播放 | 中文字幕在线字幕中文 | 99麻豆久久久国产精品免费 | 中文字幕在线观看一区 | 樱空桃av | 久二影院 | 日本视频精品 | 日韩一区二区三区免费电影 | 国产v在线 | 久保带人| 99re6热在线精品视频 | 超碰免费在线公开 | 国产伦精品一区二区三区免费 | 欧美视频www | 精品国偷自产在线 | 日韩在线免费高清视频 | 久久久99精品免费观看 | 91在线看免费 | 免费久久久 | 精品一区二区在线播放 | 97超级碰碰碰碰久久久久 | 一区二区三区四区不卡 | 密桃av在线 | 伊人天天狠天天添日日拍 | 亚洲欧美怡红院 | 天天摸天天舔天天操 | 狠狠干电影 | 韩国精品视频在线观看 | 狠狠狠狠狠狠操 | 国产精品嫩草影院123 | 天天插天天狠 | 91免费看黄色 | 国产精品3 | a级一a一级在线观看 | www.黄色| 六月丁香六月婷婷 | av中文电影 | 五月婷婷欧美视频 | 夜夜爽夜夜操 | 婷婷伊人综合亚洲综合网 | 日本高清免费中文字幕 | 成人蜜桃网 | 伊人婷婷 | 97超碰在线免费 | 午夜12点| 亚洲狠狠婷婷 | 色网站在线看 | 成人免费在线看片 | 成人毛片久久 | 国产精品福利在线 | 欧美乱淫视频 | 久久久久久久久久久影院 | av久久在线 | 一级特黄aaa大片在线观看 | 国产精品久久久精品 | 婷婷色 亚洲 | 综合色亚洲 | 五月婷婷一级片 | 一级片免费观看 | 99久久精品久久亚洲精品 | 国产麻豆精品95视频 | 一级片视频在线 | 精品久久久久久综合日本 | 久久国产精品99久久久久久老狼 | 亚洲 欧美 精品 | 久久久国产精品成人免费 | 自拍超碰在线 | 亚洲欧美日韩精品久久久 | 亚洲高清不卡av | 91最新在线 | www五月| 美女网站在线观看 | www.日日日.com | 国产成人一区二区三区在线观看 | 免费看的黄色的网站 | 伊人干综合 | 久久精品女人毛片国产 | 91九色视频在线 | 黄色小网站在线观看 | 日韩精品中文字幕在线 | 91久久久国产精品 | 久久99精品久久久久久久久久久久 | 久久韩国免费视频 | 日韩精品免费一区二区三区 | 国产精品久久久久久久久久久久午夜 | 夜夜操网 | 久草视频在线新免费 | 99免费在线观看 | 九九色综合 | 免费在线视频一区二区 | 丁香亚洲 | 欧美国产日韩在线观看 | 国产资源免费 | 精品免费99久久 | 91麻豆精品国产91久久久使用方法 | 亚洲天堂网视频 | 草免费视频 | 国产精品资源网 | .国产精品成人自产拍在线观看6 | 一区二区三区在线视频111 | 五月亚洲 | 国产高清日韩欧美 | 日韩视频在线一区 | 青青视频一区 | 久久激五月天综合精品 | 国产精品亚洲片夜色在线 | 免费观看的av | 9999毛片| 99久久99视频只有精品 | 久久亚洲欧美日韩精品专区 | 亚洲精品tv久久久久久久久久 | 91久久精品一区二区三区 | 国产小视频免费在线观看 | 99视频免费在线观看 | 国产99一区 | www狠狠操 | 五月天丁香亚洲 | 色视频网站在线观看一=区 a视频免费在线观看 | 国产精品 欧美 日韩 | 在线观看91网站 | a级片久久久 | 亚洲,国产成人av | 日本精品视频免费 | 中文字幕在线影视资源 | 91精品欧美一区二区三区 | 黄色特一级 | 国产免费专区 | 99热只有精品在线观看 | 国产精品涩涩屋www在线观看 | 国产精品高清免费在线观看 | 中文字幕免费一区二区 | 国产不卡片| 中文字幕中文字幕在线中文字幕三区 | 天天摸天天操天天爽 | 久久久这里有精品 | 日韩精品中文字幕久久臀 | 亚洲资源片 | 日韩精品在线视频免费观看 | 91av蜜桃| 91人人揉日日捏人人看 | 九九热在线观看 | 国产一区av在线 | 欧美性一级观看 | 97超碰影视 | 黄色一级在线视频 | 在线播放日韩 | 在线欧美中文字幕 | 久久99久久99精品免费看小说 | 一级成人免费视频 | 91夫妻自拍 | 黄色片视频在线观看 | 国产成人在线观看 | 亚洲国产日韩在线 | 日本一区二区免费在线观看 | 亚洲永久精品在线观看 | www.久艹| 精品一二三四五区 | 粉嫩av一区二区三区四区在线观看 | 久久97精品| 久久免费观看少妇a级毛片 久久久久成人免费 | 五月天精品视频 | 亚洲精品影院在线观看 | 欧美日韩视频免费 | 超碰在线色| 探花视频在线观看免费版 | 99热在线网站 | 美女黄色网在线播放 | www国产亚洲精品久久麻豆 | 成人av在线观 | 91亚洲精品在线 | 日本中文字幕电影在线免费观看 | 一级黄色视屏 | 成人av电影免费在线播放 | 欧美精品九九99久久 | 精品国产1区2区 | 91一区啪爱嗯打偷拍欧美 | 999久久久欧美日韩黑人 | 欧美另类一二三四区 | 国产精品黄色 | 在线一区二区三区 | 黄色影院在线观看 | 久久电影国产免费久久电影 | 精品黄色片 | 免费看高清毛片 | 国产97碰免费视频 | 久久er99热精品一区二区三区 | 欧美一区二区免费在线观看 | 亚洲尺码电影av久久 | 欧美久久久久久久久久久久 | 综合色在线观看 | 天天综合视频在线观看 | 天天天色| av黄色在线 | 久草免费福利在线观看 | 亚洲视频免费 | 久久国产一二区 | 日韩精品一区二区三区丰满 | 亚洲激情p | 在线视频手机国产 | 婷婷久久久久 | 国产91在线免费视频 | 97理论电影| 爱色av.com| 欧美日韩免费一区 | 精品久久电影 | 亚洲v欧美v国产v在线观看 | 日躁夜躁狠狠躁2001 | 日韩免费中文字幕 | 天天色天天爱天天射综合 | 久久国产综合视频 | 国产xxxx性hd极品 | 精品国模一区二区三区 | 亚洲精品久久久久久久不卡四虎 | 天天干 夜夜操 | 免费国产黄线在线观看视频 | 久久久久亚洲精品男人的天堂 | 日韩三级视频在线观看 | 亚洲视频免费在线观看 | 久久亚洲专区 | 欧美在线视频一区二区 | ,午夜性刺激免费看视频 | 国产精品毛片一区二区在线 | 在线观看中文字幕网站 | 亚洲综合色站 | 久草在线视频首页 | 日韩欧美国产激情在线播放 | 在线观看韩日电影免费 | 日韩欧美电影网 | 日韩乱色精品一区二区 | 五月激情六月丁香 | 天堂va在线观看 | 一区二区三区免费在线观看视频 | 麻豆视频国产精品 | 国产精品一区二区久久精品 | 五月天色丁香 | www.888av| 午夜在线国产 | 一级片视频免费观看 | 三日本三级少妇三级99 | 九九综合在线 | 色多多污污在线观看 | 国产在线高清视频 | 日日夜夜操av | 久久久久北条麻妃免费看 | 国产精品原创视频 | 九九亚洲视频 | www亚洲一区 | 四虎在线观看视频 | 麻豆传媒视频在线播放 | 免费av网址在线观看 | 一区二区三区国产欧美 | 色九九影院| 国产免费片 | 草久久精品 | 久久精品站 | 91视频免费 | 伊甸园永久入口www 99热 精品在线 | 在线视频手机国产 | 婷婷久久丁香 | 看av免费网站| 国产伦精品一区二区三区四区视频 | 国产精品美女久久久久久久久久久 | 久久情侣偷拍 | 国产 日韩 欧美 中文 在线播放 | 999抗病毒口服液 | 免费视频 你懂的 | 国产 日韩 中文字幕 | 高清精品久久 | 探花视频在线观看免费 | 深夜免费小视频 | 黄色在线观看免费网站 | 天天操天天操天天操天天 | 久草精品视频在线看网站免费 | 久久久成人精品 | 亚洲视频大全 | 国产资源免费在线观看 | 五月天激情视频在线观看 | 国产一区av在线 | 麻豆精品在线 | 92国产精品久久久久首页 | 麻豆高清免费国产一区 | 亚洲一区日韩 | 韩国av在线播放 | 国产免费国产 | 色999在线| 日韩最新av| 91在线免费观看国产 | 日韩在线观看a | 精品福利在线视频 | 97爱| 国产精品久久久网站 | 国产色就色 | 国产精品一区二区在线观看免费 | 超碰久热| 韩国在线一区二区 | 色午夜影院 | 久久人人爽人人片av | 日韩动态视频 | 一区二区三区日韩精品 | 精品国产伦一区二区三区观看说明 | 国产视频1| 又黄又刺激又爽的视频 | 色五月成人| 午夜视频导航 | 碰超人人| 久久免费99| 日韩毛片在线免费观看 | 亚洲国产三级在线观看 | 最近更新好看的中文字幕 | 免费视频一区 | 麻豆91精品91久久久 | 九九免费精品视频在线观看 | 亚洲韩国一区二区三区 | 黄色免费大全 | 亚洲欧洲精品在线 | 一区二区三区四区五区在线 | 免费看污片 | 美女福利视频在线 | 伊人久久精品久久亚洲一区 | 亚洲综合干 | av黄网站 | 久久视频国产精品免费视频在线 | 狠狠色噜噜狠狠狠狠2022 | 二区三区毛片 | 欧美日韩免费观看一区=区三区 | 成人免费在线观看入口 | 国产精品亚洲成人 | 人人射人人插 | 日韩在线观看视频在线 | 亚洲国产午夜视频 | 精品国内 | 中文字幕欲求不满 | 天天干,天天干 | 四虎5151久久欧美毛片 | 色五丁香 | 69精品视频 | 国产精品美女网站 | 2018好看的中文在线观看 | 狠狠干综合网 | 综合网久久 | 国产成人精品电影久久久 | 日韩美在线观看 | 成年人电影毛片 | 日韩三级免费观看 | av色一区| 性色在线视频 | 亚洲人毛片| 91视频com| 99精品免费久久久久久久久日本 | 亚洲视频在线观看网站 | 九九九九色 | 91探花在线 | 亚洲美女视频网 | 亚洲五月婷婷 | 精品在线观看视频 | 国产精品入口麻豆www | 粉嫩aⅴ一区二区三区 | av不卡在线看 | 91精品免费| 蜜臀一区二区三区精品免费视频 | 久久精品一区二区三区视频 | 最近最新mv字幕免费观看 | 亚洲免费视频观看 | 丝袜+亚洲+另类+欧美+变态 | 麻豆成人网| 在线观看视频一区二区 | 国产视频 亚洲视频 | 国产亚洲成av片在线观看 | 黄色一级片视频 | 国产精品久久久久久久久大全 | 亚洲精品在线国产 | 黄色成人av网址 | 综合激情伊人 | 96超碰在线| 日韩三级免费观看 | 日韩成人免费电影 | 免费日韩 精品中文字幕视频在线 | 91重口视频 | 亚洲电影黄色 | 精品国产欧美一区二区三区不卡 | 人人草在线视频 | 国产精品手机在线观看 | 九九视频精品在线 | av在线中文 | 中文字幕日韩伦理 | 天天干天天怕 | 久久成人国产精品免费软件 | 亚洲精品福利视频 | 天天综合亚洲 | 最新成人在线 | 色综合久久综合中文综合网 | 中文在线a∨在线 | 三级视频日韩 | 日韩中文字幕免费在线观看 | 日韩精品在线免费播放 | 五月婷婷色播 | 日韩一区二区三区免费视频 | 国产精品欧美久久久久天天影视 | 一级免费黄视频 | 久久九九影视网 | 国产一级免费播放 | 亚洲va男人天堂 | 波多野结衣久久资源 | 在线国产视频一区 | 亚洲专区欧美专区 | 日本精品视频在线播放 | 欧美成人高清 | 国产青青青 | 欧美一区二区视频97 | 久草在线官网 | 久久不卡免费视频 | 91理论片午午伦夜理片久久 | 国产中文字幕三区 | 国产爽视频 | 亚洲污视频 | 成 人 黄 色 视频免费播放 | 国产精品美女久久久久久2018 | 国产另类xxxxhd高清 | 亚洲国产中文字幕在线观看 | 欧美国产视频在线 | 久久久午夜精品理论片中文字幕 | 欧美日韩视频在线观看一区二区 | 97av影院| 国产精品久久久久久久av大片 | 在线中文字幕观看 | 欧美va天堂在线电影 | 中文字幕在线观看日本 | 在线免费观看视频一区二区三区 | 久久久免费国产 | 免费v片 | 国产精品久久久久久久久久 | 久久人人精品 | 色a资源在线 | 人人玩人人添人人澡超碰 | 亚洲精品系列 | 国产综合视频在线观看 | 黄网站色| 夜色.com| 久久五月婷婷丁香社区 | 久久精品高清视频 | 国产成人精品一区二区三区免费 | 国产成人精品综合久久久久99 | 亚洲理论电影网 | 一区二区三区在线免费观看 | 亚洲成年人av | 日韩精品一区二区三区免费观看视频 | 99精品久久久久久久久久综合 | 国际精品久久久 | 激情综合网五月激情 | 最新一区二区三区 | www.com.黄 | 国产成人777777 | 国产精品爽爽爽 | 国产视频久久久久 | 人人天天夜夜 | 少妇bbbb揉bbbb日本 | 黄色av电影免费观看 | 成人一区不卡 | 国产视频中文字幕 | 久草在线免费看视频 | 在线观看黄网 | 韩日电影在线观看 | 黄色大片免费播放 | 99精品久久精品一区二区 | 狠狠躁夜夜躁人人爽超碰91 | 激情欧美一区二区三区免费看 | 激情五月婷婷激情 | 久久社区视频 | 国产在线观看网站 | 亚洲精品国偷拍自产在线观看 | 人人澡人人模 | 国产精品久久综合 | 亚洲精品在线视频观看 | 国产夫妻av在线 | 亚洲免费成人 | 丰满少妇在线观看资源站 | 精品福利网站 | 日日干 天天干 | 丝袜足交在线 | 久久精品国产亚洲精品 | 最新日韩视频 | 精品久久久免费视频 | 激情综合网五月激情 | 丁香六月中文字幕 | 亚洲综合色网站 | 天天在线免费视频 | 亚洲更新最快 | 99久久精品国产观看 | 成人免费在线观看电影 | 成人av一二三区 | 一级成人在线 | 亚洲天天做 | 国产精品视频在线观看 | av免费高清观看 | 久久艹国产视频 | 亚洲mv大片欧洲mv大片免费 | 成人中文字幕在线 | 久草在线中文视频 | www夜夜操 | 成人aⅴ视频 | 麻豆成人精品视频 | 五月婷婷色 | 亚洲精品高清在线 | 91色在线观看| 中文字幕免费不卡视频 | 国产在线一区二区 | 激情久久久 | 国产精品999久久久 久产久精国产品 | 欧美日韩国产一区二区三区在线观看 | 亚洲欧洲日韩 | 97精品超碰一区二区三区 | 国产精品成人a免费观看 | 在线观看免费成人 | 中文字幕免费高清 | 日韩视频中文字幕在线观看 | 国产又粗又猛又爽 | 国产精品理论视频 | 91丨porny丨九色| 麻豆视频一区 | 日韩成片 | 一级片视频在线 | 亚洲精品福利在线观看 | 国产成人精品午夜在线播放 | 国产xxxx | 日韩性片 | 国内少妇自拍视频一区 | 国产视频精品免费播放 | 91丨九色丨蝌蚪丨对白 | 九九热只有精品 | 日韩在线免费看 | 97热在线观看 | 超碰免费97| av天天澡天天爽天天av | 成人在线小视频 | 成人免费观看a | 在线免费观看成人 | 伊人久久影视 | 国产日本在线 | 国产免费不卡 | 亚洲高清在线观看视频 | 久久精品网址 | 日韩 国产| 精品国产一区二区三区av性色 | 久久久免费观看 | 国产a免费| 日韩精品亚洲专区在线观看 | 国产精品高潮呻吟久久久久 | 国产黄色av影视 | 欧美一二区在线 | 精品欧美小视频在线观看 | 色五月情| 成人av免费在线 | 亚洲影视资源 | 久久国产精品久久精品国产演员表 | 国产精品入口传媒 | 久久夜夜爽 | 国产又黄又爽无遮挡 | 免费欧美精品 | 中文字幕在线免费观看 | 国产精品久久9 | 视频一区二区国产 | 一区二区三区四区在线 | 永久免费的啪啪网站免费观看浪潮 | 天天操天天操天天操天天 | www.com久久久 | 国产精品专区一 | 日韩成人中文字幕 | 日韩视频三区 | 91网页版免费观看 | 四虎国产精| 久久精品婷婷 | 友田真希x88av| 99久久国产免费,99久久国产免费大片 | 激情综合网在线观看 | ww视频在线观看 | 色综合天天色综合 | 天天躁天天躁天天躁婷 | 日本中文字幕在线视频 | 青青视频一区 | 久久精品亚洲国产 | 精品免费视频123区 午夜久久成人 | 99久高清在线观看视频99精品热在线观看视频 | 日本特黄一级片 | 黄色一级大片在线观看 | 1024手机看片国产 | 久久久久高清毛片一级 | 国产尤物视频在线 | 亚洲在线黄色 | 欧美日韩国产精品一区二区 | 国产精品自拍在线 | 在线影视 一区 二区 三区 | 久久久久国产免费免费 | 免费在线色 | 久久大片| 99精品在线观看 | 日韩一级片大全 | 狠狠操电影网 | 成人网中文字幕 | 97福利视频| 成人在线视频观看 | 国产女做a爱免费视频 | 国产成人精品久久亚洲高清不卡 | 在线看片成人 | 4438全国亚洲精品观看视频 | 国产精品一区二区免费 | bayu135国产精品视频 | 天天插天天射 | 99久久er热在这里只有精品15 | 久久艹欧美 | 九九久久久 | 女人18精品一区二区三区 | 成人在线视频网 | 黄色一级动作片 | 日本精品视频在线观看 | 性日韩欧美在线视频 | 亚洲精品福利在线观看 | 天天操天天色综合 | 欧美亚洲专区 | 久久久精品国产免费观看一区二区 | 日本中文字幕在线看 | 激情久久伊人 | 欧美日韩一级久久久久久免费看 | 在线观看亚洲a | 国产高清在线免费观看 | 五月天狠狠操 | 在线国产视频观看 | 国产精品黑丝在线观看 | 成片免费观看视频大全 | 日本爽妇网 | 天天爱天天操天天射 | 国产美女久久 | 91最新视频| 色 中文字幕 | 成人午夜电影在线播放 | 久久色视频 | 在线观看精品黄av片免费 | 国产精品久久久影视 | 99久久国产免费看 | 亚洲无毛专区 | 99精品视频免费在线观看 | 亚洲少妇天堂 | 男女男视频 | 久久久午夜精品理论片中文字幕 | 欧美大码xxxx | 精品美女在线视频 | 亚州欧美视频 | 人人要人人澡人人爽人人dvd | 成人h视频在线播放 | 久久久久伊人 | 99精品久久只有精品 | 永久免费精品视频 | 日韩av三区 | 国产裸体bbb视频 | 一级成人在线 | 国产精品18久久久久久久久久久久 | 五月婷婷黄色网 | 欧美一级免费 | 极品中文字幕 | 曰韩在线 | www.久久免费 | 一本一本久久a久久精品综合妖精 | 国精产品999国精产品视频 | 久久久久久久久久久久久久av | 黄www在线观看 | 成人三级网站在线观看 | 99热精品久久 | 中文字幕一区二区三区在线视频 | 久久在草 | 国产黄a三级三级三级三级三级 | 午夜视频在线观看一区 | 欧美亚洲一区二区在线 | 狠狠操夜夜 | wwwww.国产 | 九九九热精品免费视频观看 | 天天爽天天爽夜夜爽 | 97在线影院| 亚洲人成在线电影 | 天天色天天干天天色 | 国产精品久久电影网 | se视频网址| 日韩欧美国产视频 | 久久久久女人精品毛片 | 久久成人黄色 | 日韩免费在线看 | 婷婷成人亚洲综合国产xv88 | 久久福利精品 | 97视频在线| 国产中文字幕免费 | 夜夜狠狠 | 99热精品国产一区二区在线观看 | 伊人网综合在线观看 | av一级免费 | 亚洲精品一区二区三区新线路 | 99九九热只有国产精品 | 亚洲精品黄色 | 免费在线91| 友田真希av| 黄色精品免费 | 亚洲国产日韩一区 | 五月婷婷丁香 | 国产精品久久毛片 | 欧美日韩免费在线视频 | www.大网伊人| 日韩激情视频在线观看 | 亚洲在线视频观看 | 免费人成网 | 在线视频一二区 | 美国三级黄色大片 | 亚洲精品456在线播放第一页 | 日日夜夜精品免费观看 | 草久久久 | 久久国产精品久久久 | 色先锋资源网 | 欧洲精品久久久久毛片完整版 | 亚洲一区二区91 | 国产99久久久精品视频 | 视频一区二区三区视频 | 久久久免费高清视频 | 亚洲无吗视频在线 | 国产一二三区在线观看 | 亚洲精品资源在线 | www.com在线观看 | 中文字幕二区 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 天天操天天摸天天爽 | 亚洲人久久| 午夜美女福利直播 | 91精品国产麻豆国产自产影视 | 国产日韩精品在线观看 | 亚洲国产欧美在线人成大黄瓜 | 免费视频在线观看网站 | 成人九九视频 | 91九色在线视频观看 | 日本精品二区 | 美女av在线免费 | 精品国产一二三 | 久久免费资源 | 在线视频a | 国产亚洲综合在线 | 亚洲欧美国产精品久久久久 | 天天操天天摸天天射 | 中文字幕在线观看三区 | 丁香婷婷射 | 久久久999 | 伊人天天狠天天添日日拍 | 欧美另类高清 videos | av电影免费看 | 波多野结衣最新 | 国产69久久精品成人看 | 毛片在线网| 日韩在线观看第一页 | 高潮久久久久久 | 99在线精品视频在线观看 | 久久久999免费视频 日韩网站在线 | 欧美va在线观看 | 五月开心网| 亚洲久在线 | 色视频在线观看 | 婷婷资源站 | av在线影片| 国产成人精品一区二区三区免费 | 96在线| 99精品国产免费久久久久久下载 | 免费日韩 精品中文字幕视频在线 | a色视频 | 91丨九色丨蝌蚪丨对白 | 美女黄频在线观看 | 国产又粗又猛又色又黄视频 | 在线亚洲播放 | 操操操夜夜操 | 99视频精品视频高清免费 | 91手机电影 | 国产精品一区二区免费 | 欧美日韩不卡在线观看 | 天天艹天天 | 国产精品亚洲精品 |