python -- 机器人行走

30 篇文章 0 订阅
22 篇文章 1 订阅
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# fileName : robot_path.py
# author : zoujiameng@aliyun.com.cn

# 地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 
# 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
class Robot:
# 共用接口,判断是否超过K
    def getDigitSum(self, num):
        sumD = 0
        while(num>0):
            sumD+=num%10
            num/=10
        return int(sumD)

    def PD_K(self, rows, cols, K):
        sumK = self.getDigitSum(rows) + self.getDigitSum(cols)
        if sumK > K:
            return False
        else:
            return True

    def PD_K1(self, i, j, k):
        "确定该位置是否可以走,将复杂约束条件设定"
        index = map(str,[i,j])
        sum_ij = 0
        for x in index:
            for y in x:
                sum_ij += int(y)
        if sum_ij <= k:
            return True
        else:
            return False

# 共用接口,打印遍历的visited二维list
    def printMatrix(self, matrix, r, c):
        print("cur location(", r, ",", c, ")")
        for x in matrix:
            for y in x: 
                print(y, end=' ')
            print()

 #回溯法
    def hasPath(self, threshold, rows, cols):
        visited = [ [0 for j in range(cols)] for i in range(rows) ]
        count = 0
        startx = 0
        starty = 0
        #print(threshold, rows, cols, visited)
        visited = self.findPath(threshold, rows, cols, visited, startx, starty, -1, -1)
        for x in visited:
            for y in x:
                if( y == 1):
                    count+=1
        print(visited)
        return count

    def findPath(self, threshold, rows, cols, visited, curx, cury, prex, prey):
        if 0 <= curx < rows and 0 <= cury < cols and self.PD_K1(curx, cury, threshold) and visited[curx][cury] != 1: # 判断当前点是否满足条件
            visited[curx][cury] = 1
        self.printMatrix(visited, curx, cury)
        prex = curx
        prey = cury
        if cury+1 < cols and self.PD_K1(curx, cury+1, threshold) and visited[curx][cury+1] != 1: # east
            visited[curx][cury+1] = 1
            return self.findPath(threshold, rows, cols, visited, curx, cury+1, prex, prey)
        elif cury-1 >= 0 and self.PD_K1(curx, cury-1, threshold) and visited[curx][cury-1] != 1: # west
            visited[curx][cury-1] = 1
            return self.findPath(threshold, rows, cols, visited, curx, cury-1, prex, prey)
        elif curx+1 < rows and self.PD_K1(curx+1, cury, threshold) and visited[curx+1][cury] != 1: # sourth
            visited[curx+1][cury] = 1
            return self.findPath(threshold, rows, cols, visited, curx+1, cury, prex, prey)
        elif 0 <= curx-1  and self.PD_K1(curx-1, cury, threshold) and visited[curx-1][cury] != 1: # north
            visited[curx-1][cury] = 1
            return self.findPath(threshold, rows, cols, visited, curx-1, cury, prex, prey)
        else: # 返回上一层,此处有问题
            return visited#self.findPath(threshold, rows, cols, visited, curx, cury, prex, prey)
 #回溯法2
    def movingCount(self, threshold, rows, cols):
        visited = [ [0 for j in range(cols)] for i in range(rows) ]
        print(visited)
        count = self.movingCountCore(threshold, rows, cols, 0, 0, visited);
        print(visited)
        return count

    def movingCountCore(self, threshold, rows, cols, row, col, visited):
        cc = 0
        if(self.check(threshold, rows, cols, row, col, visited)):  
            visited[row][col] = 1
            cc = 1 + self.movingCountCore(threshold, rows, cols, row+1, col,visited) + self.movingCountCore(threshold, rows, cols, row, col+1, visited) + self.movingCountCore(threshold, rows, cols, row-1, col, visited) + self.movingCountCore(threshold, rows, cols, row, col-1, visited)
        return cc

    def check(self, threshold, rows, cols, row, col, visited):
        if( 0 <= row < rows and 0 <= col < cols and (self.getDigitSum(row)+self.getDigitSum(col)) <= threshold and visited[row][col] != 1): 
            return True;
        return False 

# 暴力法,直接用当前坐标和K比较
    def force(self, rows, cols, k):
        count = 0
        for i in range(rows):
            for j in range(cols):
                if self.PD_K(i, j, k):
                    count+=1
        return count
# 暴力法2, 用递归法来做
    def block(self, r, c, k): 
        s = sum(map(int, str(r)+str(c)))
        return s>k
    def con_visited(self, rows, cols):
        visited = [ [0 for j in range(cols)] for i in range(rows) ]
        return visited
    def traval(self, r, c, rows, cols, k, visited):
        if not (0<=r<rows and 0<=c<cols):
            return
        if visited[r][c] != 0 or self.block(r, c, k):
            visited[r][c] = -1
            return
        visited[r][c] = 1
        global acc
        acc+=1
        self.traval(r+1, c, rows, cols, k, visited)
        self.traval(r, c+1, rows, cols, k, visited)
        self.traval(r-1, c, rows, cols, k, visited)
        self.traval(r, c-1, rows, cols, k, visited)
        return acc

if __name__ == "__main__":
    # 调用测试
    m = 3
    n = 3
    k = 1
    o = Robot()
    print(o.hasPath(k, m, n))
    print(o.force(m,n,k))
    global acc
    acc = 0
    print(o.traval(0, 0, m, n, k, o.con_visited(m,n)))
    print(o.movingCount(k, m, n))
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
四足机器人是一种模仿真实生物行走机器人,它具有四只脚和多个关节,可以模拟动物的步态和行走方式。在Python语言中,我们可以利用各种编程技巧和库来实现四足机器人行走。 首先,我们需要确定机器人的运动控制方式。一种常见的方式是使用逆运动学算法,通过输入期望的步态和姿态,计算出每个关节的角度,从而控制机器人的运动。在Python中,我们可以编写逆运动学算法的函数,并通过数学库如numpy,来进行相关计算。 其次,我们需要对机器人的腿部进行动力学建模。这涉及到对腿部的质量、长度、关节摩擦等参数进行建模,并采用动力学方程来描述机器人的运动。通过使用Python的物理建模库,如pybullet或ROS等,我们可以方便地进行腿部动力学模拟。 接下来,我们需要将逆运动学和动力学模型结合起来,实现机器人行走控制。我们可以编写一个行走控制器,通过输入当前位置和目标位置,计算出每个关节点的目标角度,并利用控制算法使机器人循序渐进地到达目标位置。Python中的控制库,如PID,可以帮助我们实现这个控制器。 最后,我们需要为机器人提供传感器反馈和环境感知。例如,我们可以使用摄像头来获取机器人周围的图像信息,使用距离传感器来检测距离障碍物的距离,或使用惯性测量单元(IMU)来感知机器人的姿态。Python提供了各种用于处理这些传感器数据的库和算法,例如OpenCV、Pygame等。 综上所述,通过运用Python编程语言,我们可以实现四足机器人行走。这需要对逆运动学、动力学和控制算法进行编程,以及利用传感器数据来感知环境并做出相应的控制。Python提供了丰富的编程库和工具,使得实现机器人行走变得更加简单和便捷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值