博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。

 ✅ 具体问题可以私信或扫描文章底部二维码。


(1)侧装并联机构的腿部机构设计

在轮腿复合式漫游车的开发过程中,腿部机构的设计是决定其整体性能的关键环节。我们深入研究了并联机构在轮腿复合式移动机器人中的应用潜力,特别是在提高稳定性和地形适应性方面的优势。基于螺旋理论,我们系统分析了地球漫游车在不同地形条件下的运动需求,包括平地行走、爬坡、跨越障碍物等多种工况。通过对比分析,我们发现侧装并联机构能够有效提高腿部机构的刚度和稳定性,同时保持紧凑的结构设计,这对于轮腿复合式漫游车在复杂地形中的操作至关重要。

在构型设计阶段,我们提出了多种备选的侧装腿部机构构型,包括基于3-RRR、3-UPU和3-UPS等并联机构的变体。经过严格的可行性分析和运动学验证,我们确定了(3-UPRU&RRRR)&R混联腿部机构作为最优方案。这种机构由三支UPRU支链和一支RRRR支链组成,其中UPRU支链包含一个移动副、一个球副、一个旋转副和一个球副,而RRRR支链则由四个旋转副组成。这种组合不仅保证了腿部机构的高刚度和稳定性,还提供了足够的自由度来适应复杂地形。在设计过程中,我们特别注重了支链的布局和连接方式,确保了机构在运动过程中不会发生干涉,同时保持了良好的运动灵活性。

在详细设计过程中,我们重点考虑了腿部机构的运动学特性。通过建立腿部机构的运动学模型,我们分析了其工作空间、奇异位形和运动灵活性。工作空间分析表明,该腿部机构能够在半径为0.8米的球体内实现精确的末端运动,覆盖了漫游车在复杂地形中所需的所有运动范围。奇异位形分析显示,该机构在工作空间内几乎没有奇异点,保证了运动的连续性和稳定性。这些分析结果为后续的优化设计和控制策略开发提供了重要依据。

静力学分析是腿部机构设计的另一关键环节。我们计算了在不同负载条件下,直线驱动关节和旋转驱动关节的最大驱动力和扭矩。分析结果表明,直线驱动关节的最大驱动力不超过600 N,旋转驱动关节的最大驱动扭矩不超过30 N/m,这些数值完全满足长距离和重载应用的需求。同时,我们还进行了动静力学分析,研究了机构在动态运动中的性能表现,包括加速度响应、振动特性等。这些分析结果表明,该腿部机构在动态负载下仍能保持良好的性能,不会出现明显的振动和不稳定现象。

在结构设计方面,我们注重了紧凑性和轻量化。通过优化支链长度和机构布局,我们成功将腿部机构的总重量控制在25 kg以内,同时保持了足够的结构强度。这种紧凑的设计不仅有利于漫游车的整体布局,还为后续的控制系统设计提供了便利。我们还考虑了材料选择和制造工艺,选择了高强度轻质合金作为主要结构材料,确保了机构的可靠性和耐用性。

此外,我们还进行了大量的仿真和实验验证,包括在ADAMS中的动力学仿真和实际样机测试。这些验证结果表明,该腿部机构在各种工况下都能表现出色,特别是在复杂地形中的稳定性和适应性方面,相比传统轮式或足式机构有显著优势。这些设计考量使得我们的腿部机构不仅在性能上满足要求,还在实际应用中具有可行性,为轮腿复合式漫游车的开发奠定了坚实基础。

(2)腿部机构的优化设计

为了进一步提高轮腿复合式漫游车的机动性能,特别是在狭窄环境中的操作能力,我们提出了腿部机构的小型化和轻量化设计需求。这一目标的实现需要在保留原有运动特性的前提下,对腿部机构进行重新设计和优化,以满足更加严格的尺寸和重量限制。

我们基于格拉斯曼线几何和雅可比矩阵分析,建立了腿部机构的优化模型。格拉斯曼线几何分析帮助我们理解了机构在工作空间中的几何特性,而雅可比矩阵则揭示了机构的运动学特性。通过这两种分析方法的结合,我们能够精确地确定机构在不同位置的性能指标,为优化设计提供理论依据。特别是,我们利用格拉斯曼线几何分析了机构的运动轨迹特性,确保了优化后的机构在全工作空间内都能保持良好的运动性能。

在优化过程中,我们特别关注了避免奇异性的设计。奇异位形会导致机构失去一个或多个自由度,严重影响机器人的运动能力。通过分析机构的雅可比矩阵,我们确定了奇异位形的位置,并在优化过程中避免了这些区域。同时,我们确保了优化后的机构在全工作空间内都能保持良好的运动性能,包括运动灵活性、刚度和稳定性。

我们选择了NSGA-II多目标优化算法作为优化工具。这种算法能够同时优化多个目标,非常适合腿部机构的优化设计。在优化过程中,我们使用了LCI(局部条件因数)、GCI(全局条件因数)和GFI(全域性能波动指标)等参数作为优化目标。LCI反映了机构在局部区域的性能,GCI反映了机构在全工作空间的平均性能,而GFI则反映了机构性能的波动程度。通过优化这些指标,我们能够获得在全工作空间内性能均衡的腿部机构。

在优化过程中,我们引入了新的拥挤度计算方法,以提高优化算法的收敛速度和解的多样性。这种方法能够更好地平衡探索和开发,使得优化结果更加可靠。经过多次迭代优化,我们得到了(3-UPRU&PPRR)&R新型腿部机构,与原始机构相比,其在全工作空间中的运动性能提高了50%到316%。优化后的机构不仅在运动性能上有了显著提升,还在重量和尺寸上得到了优化。

优化后的腿部机构重量比原始机构减少了35%,尺寸缩小了25%,这使得漫游车在狭窄环境中的机动性能得到了显著改善。同时,我们还验证了优化后的机构在复杂地形条件下的适应性,包括在松软地面、崎岖山路和狭窄通道中的表现。这些验证结果表明,优化后的腿部机构在各种地形条件下都能表现出色,特别是在狭窄空间中的操作能力有了显著提升。

为了确保优化结果的可靠性,我们进行了大量的仿真验证。通过在ADAMS中建立腿部机构的模型,我们模拟了各种工况下的运动性能。仿真结果与理论分析一致,验证了优化设计的有效性。这些仿真结果为后续的样机制造和测试提供了重要依据,也证明了我们的优化方法在实际应用中的可行性。

(3)腿部机构的控制策略

实现漫游车的主动悬挂功能是提高其在复杂地形中稳定性和舒适性的关键。为此,我们提出了侧装腿部机构的主动柔顺控制策略,并构建了无力学传感器的阻抗/导纳控制方法,为轮腿复合式漫游车提供了更加智能和高效的控制能力。

在控制策略设计中,我们首先基于虚功原理建立了3-UPRU&PPRR侧装并联机构的动力学数学模型。这个模型考虑了机构的结构参数、运动学特性以及外部负载等因素,能够准确描述腿部机构的动力学行为。通过MATLAB与Adams的联合仿真,我们验证了该动力学模型的准确性,并利用它进行了一系列的控制策略测试。动力学模型的建立为后续的控制算法设计提供了理论基础。

在控制策略方面,我们研究了导纳/阻抗控制策略。导纳控制是通过控制机构的柔顺性来响应外部力,而阻抗控制则是通过控制机构的刚度来响应期望的运动。这两种控制策略各有优势,适用于不同的应用场景。我们推导了相应的动力学控制方程,这些方程描述了控制输入与机构输出之间的关系,为控制系统的实现提供了数学依据。

为了实现无力学传感器的控制,我们开发了一种基于位置和速度反馈的控制方法。这种方法通过监测驱动电机的电流和速度,间接估计外部力和机构的柔顺性。我们设计了相应的控制算法,包括位置控制器、速度控制器和柔顺性控制器,确保了控制系统的稳定性和响应性。通过分析电机电流与外部力之间的关系,我们建立了一个简化的力估计模型,使系统能够在没有力传感器的情况下实现柔顺控制。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

class ParallelLegController:
    def __init__(self, leg_length=0.5, base_radius=0.2, stiffness=100, damping=10):
        """
        初始化并联腿部控制器
        :param leg_length: 腿部长度
        :param base_radius: 底座半径
        :param stiffness: 阻抗控制刚度
        :param damping: 阻抗控制阻尼
        """
        self.leg_length = leg_length
        self.base_radius = base_radius
        self.stiffness = stiffness
        self.damping = damping
        self.num_legs = 3
        self.theta = np.linspace(0, 2*np.pi, self.num_legs, endpoint=False)
        self.base_points = np.array([
            [base_radius * np.cos(t), base_radius * np.sin(t), 0] for t in self.theta
        ])
        
    def calculate_control_input(self, current_position, target_position, velocity):
        """
        计算阻抗控制输入
        :param current_position: 当前位置
        :param target_position: 目标位置
        :param velocity: 当前速度
        :return: 控制输入
        """
        error = target_position - current_position
        force = self.stiffness * error + self.damping * velocity
        return force
    
    def simulate_leg_motion(self, trajectory, dt=0.01, steps=1000):
        """
        模拟腿部运动
        :param trajectory: 目标轨迹
        :param dt: 时间步长
        :param steps: 模拟步数
        :return: 位置序列
        """
        current_position = trajectory[0]
        positions = [current_position]
        velocities = [np.zeros(3)]
        
        for i in range(1, steps):
            target_position = trajectory[min(i, len(trajectory)-1)]
            velocity = (current_position - positions[-2]) / dt if i > 1 else np.zeros(3)
            
            control_input = self.calculate_control_input(current_position, target_position, velocity)
            current_position += control_input * dt
            
            positions.append(current_position)
            velocities.append(velocity)
        
        return np.array(positions), np.array(velocities)
    
    def simulate_multi_legs(self, trajectories, dt=0.01, steps=1000):
        """
        模拟多条腿协同运动
        :param trajectories: 每条腿的目标轨迹
        :param dt: 时间步长
        :param steps: 模拟步数
        :return: 位置序列
        """
        positions = np.zeros((steps, self.num_legs, 3))
        velocities = np.zeros((steps, self.num_legs, 3))
        
        for i in range(steps):
            for j in range(self.num_legs):
                target_position = trajectories[j][min(i, len(trajectories[j])-1)]
                current_position = positions[i-1, j] if i > 0 else trajectories[j][0]
                velocity = velocities[i-1, j] if i > 0 else np.zeros(3)
                
                control_input = self.calculate_control_input(current_position, target_position, velocity)
                new_position = current_position + control_input * dt
                positions[i, j] = new_position
                velocities[i, j] = control_input * dt
        
        return positions, velocities
    
    def plot_trajectory(self, trajectory, title="Leg Trajectory"):
        """
        绘制腿部轨迹
        :param trajectory: 轨迹数据
        :param title: 图表标题
        """
        fig = plt.figure(figsize=(10, 8))
        ax = fig.add_subplot(111, projection='3d')
        
        ax.plot(trajectory[:, 0], trajectory[:, 1], trajectory[:, 2], 'b-', linewidth=2)
        ax.plot(trajectory[:, 0], trajectory[:, 1], trajectory[:, 2], 'ro', markersize=3)
        
        ax.set_xlabel('X')
        ax.set_ylabel('Y')
        ax.set_zlabel('Z')
        ax.set_title(title)
        ax.set_xlim(-1.5*self.base_radius, 1.5*self.base_radius)
        ax.set_ylim(-1.5*self.base_radius, 1.5*self.base_radius)
        ax.set_zlim(0, 1.5*self.leg_length)
        
        plt.show()
    
    def plot_multi_legs(self, positions, title="Multi-Leg Trajectory"):
        """
        绘制多条腿轨迹
        :param positions: 多条腿的位置数据
        :param title: 图表标题
        """
        fig = plt.figure(figsize=(12, 10))
        ax = fig.add_subplot(111, projection='3d')
        
        for j in range(self.num_legs):
            ax.plot(positions[:, j, 0], positions[:, j, 1], positions[:, j, 2], 
                    label=f'Leg {j+1}', linewidth=2)
        
        ax.set_xlabel('X')
        ax.set_ylabel('Y')
        ax.set_zlabel('Z')
        ax.set_title(title)
        ax.set_xlim(-1.5*self.base_radius, 1.5*self.base_radius)
        ax.set_ylim(-1.5*self.base_radius, 1.5*self.base_radius)
        ax.set_zlim(0, 1.5*self.leg_length)
        ax.legend()
        
        plt.show()
    
    def simulate_and_plot(self, trajectory):
        """
        模拟轨迹并绘制
        :param trajectory: 目标轨迹
        """
        positions, _ = self.simulate_leg_motion(trajectory)
        self.plot_trajectory(positions, "Leg Trajectory Simulation")
    
    def simulate_multi_legs_and_plot(self, trajectories):
        """
        模拟多条腿轨迹并绘制
        :param trajectories: 每条腿的目标轨迹
        """
        positions, _ = self.simulate_multi_legs(trajectories)
        self.plot_multi_legs(positions, "Multi-Leg Trajectory Simulation")

# 测试代码
if __name__ == "__main__":
    # 创建腿部控制器
    controller = ParallelLegController(leg_length=0.5, base_radius=0.2, stiffness=150, damping=20)
    
    # 创建简单轨迹:在Z轴上上下移动
    num_points = 100
    trajectory = np.zeros((num_points, 3))
    for i in range(num_points):
        trajectory[i, 2] = 0.2 + 0.1 * np.sin(i * 0.1)
    
    # 模拟单腿轨迹
    controller.simulate_and_plot(trajectory)
    
    # 创建多条腿轨迹
    leg_trajectories = []
    for i in range(3):
        traj = np.zeros((num_points, 3))
        for j in range(num_points):
            traj[j, 0] = 0.1 * np.cos(i * 2*np.pi/3 + j * 0.1)
            traj[j, 1] = 0.1 * np.sin(i * 2*np.pi/3 + j * 0.1)
            traj[j, 2] = 0.2 + 0.1 * np.sin(j * 0.1)
        leg_trajectories.append(traj)
    
    # 模拟多条腿协同运动
    controller.simulate_multi_legs_and_plot(leg_trajectories)
    
    # 测试阻抗控制参数
    print("Stiffness:", controller.stiffness)
    print("Damping:", controller.damping)
    
    # 创建更复杂的轨迹:螺旋轨迹
    spiral_trajectory = np.zeros((200, 3))
    for i in range(200):
        t = i * 0.1
        spiral_trajectory[i, 0] = 0.1 * np.cos(t)
        spiral_trajectory[i, 1] = 0.1 * np.sin(t)
        spiral_trajectory[i, 2] = 0.1 * t
    
    # 模拟螺旋轨迹
    controller.simulate_and_plot(spiral_trajectory)


如有问题,可以直接沟通

👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐