基于C#的机器人仿真平台和机器人运动学算法实现

这篇具有很好参考价值的文章主要介绍了基于C#的机器人仿真平台和机器人运动学算法实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、平台搭建

1.利用wpf自带的库进行机器人各关节导入

c# 实现 机器人 dh,机器人运动学,机器人模拟仿真,机器人

c# 实现 机器人 dh,机器人运动学,机器人模拟仿真,机器人

相关代码段:

<Grid.ColumnDefinitions>
            <ColumnDefinition Width="0*"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="32*"/>
            <RowDefinition Height="43*"/>
        </Grid.RowDefinitions>
        <helix:HelixViewport3D x:Name="viewPort3d" ZoomExtentsWhenLoaded="True" BorderBrush="Gray" BorderThickness="3" ShowCoordinateSystem="True" Grid.ColumnSpan="2" Margin="0,10,0,0" Grid.RowSpan="2" >
            <helix:GridLinesVisual3D Width="150" Length="150" Thickness="0.5" MinorDistance="6" MajorDistance="7" Fill="#FF34998F"/>
            <helix:DefaultLights/>
        </helix:HelixViewport3D>
private const string MODEL_PATH1 = "Base.stl";
private const string MODEL_PATH2 = "Asse1.stl";
private const string MODEL_PATH3 = "Asse2.stl";
private const string MODEL_PATH4 = "Asse3.stl";
private const string MODEL_PATH5 = "Asse4.stl";
private const string MODEL_PATH6 = "Asse5.stl";
private const string MODEL_PATH7 = "Asse6.stl";
private const string MODEL_PATH8 = "Leva.stl";
private const string MODEL_PATH9 = "Asta.stl";

导入效果如图:

c# 实现 机器人 dh,机器人运动学,机器人模拟仿真,机器人

效果视频:

c# 实现 机器人 dh,机器人运动学,机器人模拟仿真,机器人

2.通过正运动学显示机器人当前位置信息

c# 实现 机器人 dh,机器人运动学,机器人模拟仿真,机器人

拖动机器人并且实时改变其位置信息:

c# 实现 机器人 dh,机器人运动学,机器人模拟仿真,机器人

xaml代码部分:

<Slider x:Name="joint1" Grid.ColumnSpan="2" HorizontalAlignment="Left" Margin="1034,61,-607,0" VerticalAlignment="Top" Width="373" Grid.Row="1" ValueChanged="Joint1_ValueChanged" Maximum="180" Minimum="-180" Height="18"/>
        <Slider x:Name="joint3" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="23" Margin="1034,121,-607,0" VerticalAlignment="Top" Width="373" Grid.Row="1" Maximum="180" Minimum="-180" ValueChanged="Joint3_ValueChanged"/>
        <Slider x:Name="joint5" Grid.ColumnSpan="2" HorizontalAlignment="Left" Margin="1034,183,-607,-25" VerticalAlignment="Top" Width="373" Grid.Row="1" Maximum="180" Minimum="-180" ValueChanged="Joint5_ValueChanged" Height="14"/>
        <Slider x:Name="joint6" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="25" Margin="1034,217,-607,-70" Grid.Row="1" VerticalAlignment="Top" Width="373" Maximum="180" Minimum="-180" ValueChanged="Joint6_ValueChanged"/>

算法部分:

 //第一种DH建模的方式
        public static void Q2T(double ai,double di,double θi, double αi, ref double[,] T)
        //正运动学方程模型矩阵
        public static void Q2T2(double ai, double di, double θi, double αi, ref double[,] T)
        public void diretta(double q1, double q2, double q3,
           double q4, double q5, double q6, ref double[] C,ref double[,] resR)
        {
            Q2T2(a0, d1, q1, 0,ref T01);
            Q2T2(a1, d2, q2, -90, ref T12);
            Q2T2(a2, d3, q3, 0, ref T23);
            Q2T2(a3, d4, q4, -90, ref T34);
            Q2T2(a4, d5, q5, 90, ref T45);
            Q2T2(a5, d6, q6, -90, ref T56);

            T02 = math_matrix.MatrixMult(T01,T12);
            T03 = math_matrix.MatrixMult(T02, T23);
            T04 = math_matrix.MatrixMult(T03, T34);
            T05 = math_matrix.MatrixMult(T04, T45);
            T06 = math_matrix.MatrixMult(T05, T56);
            T35 = math_matrix.MatrixMult(T34, T45);
            T36 = math_matrix.MatrixMult(T35, T56);//T36 = t36
            double[,] inv03 = math_matrix.MatInverse(T03);
            double[,] t36 = math_matrix.MatrixMult(inv03,T06);//T36 = t36

            //求得机器人末端相对于机器人基坐标系的位置关系(x,y,z)
            C[0] = T06[0, 3];
            C[1] = T06[1, 3];
            C[2] = T06[2, 3];
            initC[0] = T06[0, 3];
            initC[1] = T06[1, 3];
            initC[2] = T06[2, 3];

            R36[0, 0] = T36[0, 0];
            R36[0, 1] = T36[0, 1];
            R36[0, 2] = T36[0, 2];

            R36[1, 0] = T36[1, 0];
            R36[1, 1] = T36[1, 1];
            R36[1, 2] = T36[1, 2];

            R36[2, 0] = T36[2, 0];
            R36[2, 1] = T36[2, 1];
            R36[2, 2] = T36[2, 2];
            
        }

 3.功能实现(在X/Y/Z轴上设置一个移动距离,然后机器人自动移动该距离)

c# 实现 机器人 dh,机器人运动学,机器人模拟仿真,机器人

 效果如图:

c# 实现 机器人 dh,机器人运动学,机器人模拟仿真,机器人

附上运动学算法代码:

 public void Rob_Ik(double[] qc, double[] q)
        {         
        }
        //我们以RPY作为机器人的旋转方式
        public void RPY2R(double[] rpy,ref double[,] R)
        {
            double cos_roll = Math.Cos(rpy[0]);
            double cos_pitch = Math.Cos(rpy[1]);
            double cos_yaw = Math.Cos(rpy[2]);

            double sin_roll = Math.Sin(rpy[0]);
            double sin_pitch = Math.Sin(rpy[1]);
            double sin_yaw = Math.Sin(rpy[2]);

            R[0, 0] = cos_roll * cos_pitch;
            R[0, 1] = (cos_roll * sin_pitch * sin_pitch) - (sin_roll*cos_yaw);
            R[0, 2] = (cos_roll * sin_pitch * cos_yaw) - (sin_roll * sin_yaw);
            R[1, 0] = sin_roll * cos_pitch;
            R[1, 1] = (sin_roll * sin_pitch * sin_yaw) - (cos_roll * cos_yaw);
            R[1, 2] = (sin_roll * sin_pitch * cos_yaw) - (cos_roll * sin_yaw);
            R[2, 0] = -sin_pitch;
            R[2, 1] = cos_pitch * sin_yaw;
            R[2, 2] = cos_pitch * cos_yaw;
        }
        public void R2PRY(double[,] R,ref double[] rpy)
        {
            rpy[0] = Math.Atan2(R[1,0],R[0,0]);
            rpy[1] = Math.Atan2(-R[2, 1], (R[0, 0] * Math.Cos(rpy[0]) + R[1, 0] * Math.Sin(rpy[0])));
            rpy[2] = Math.Atan2((-R[1,2]*Math.Cos(rpy[0])+R[0,2]*Math.Sin(rpy[0])),(R[1,1]*Math.Cos(rpy[0])-R[0,1]*Math.Sin(rpy[0])));
        }
        public void T2E(double[,] R,ref double[] Euler)
        {
            Euler[0] = Math.Atan2(Math.Sqrt(Math.Pow(R[2,0], 2) +Math. Pow(R[2,1], 2)), R[2,2]);
            Euler[1] = Math.Atan2(R[1,2] /Math.Sin(Euler[0]), R[0,2] / Math.Sin(Euler[0]));
            Euler[2] = Math.Atan2(R[2,1] /Math.Sin(Euler[0]), -R[2,0] /Math.Sin(Euler[0]));
        }

4.通过选定运动方式和步进参数,单步移动各轴(各轴联合运动)

c# 实现 机器人 dh,机器人运动学,机器人模拟仿真,机器人

移动后效果图:

c# 实现 机器人 dh,机器人运动学,机器人模拟仿真,机器人

效果视频:

c# 实现 机器人 dh,机器人运动学,机器人模拟仿真,机器人

代码:

 private void Button_Click_4(object sender, RoutedEventArgs e)
        {
            if (Continuity_Motion.IsChecked == true)
            {
                minus_x.Clear();
                for (int i = 0; i < Convert.ToInt32(text_x.Text); i = i + 1)
                {
                    minus_x.Add(i);
                }
                for (int j = 0; j < minus_x.Count; j++)
                {
                    double[] qcii = new double[6];
                    qcii[0] = inverse.initC[0];//移动z
                    qcii[1] = inverse.initC[1];//移动y          
                    qcii[2] = inverse.initC[2] - minus_x[j];//移动x            
                    qcii[3] = inverse.euler[0];
                    qcii[4] = inverse.euler[1];
                    qcii[5] = inverse.euler[2];
                    double[] q = new double[6];
                    m_inverse.Rob_Ik(qcii, q);
                    refresh(inverse.g1, inverse.g2, inverse.g3, inverse.g4 - 90, inverse.g5 - 90, inverse.g6 + 90);
                    Delay(5);
                }
            }
            else if(Once_Motion.IsChecked == true)
            {
                qci[0] = inverse.initC[0] + record_z_increase - record_z_reduce;//移动z
                qci[1] = inverse.initC[1] + record_y_increase - record_y_reduce;//移动y   
                oadd_x = oadd_x + Convert.ToDouble(text_step.Text);
                qci[2] = inverse.initC[2]+oadd_x-record_x_reduce;//移动x            
                qci[3] = inverse.euler[0];
                qci[4] = inverse.euler[1];
                qci[5] = inverse.euler[2];
                double[] q = new double[6];
                m_inverse.Rob_Ik(qci, q);
                refresh(inverse.g1, inverse.g2, inverse.g3, inverse.g4 - 90, inverse.g5 - 90, inverse.g6 + 90);
                
                Delay(5);
            }
            else
            {
                MessageBox.Show("请选择移动模式!");
            }
        }

 5.基于直线轨迹规划的机器人移动(规划算法加逆解算法)

c# 实现 机器人 dh,机器人运动学,机器人模拟仿真,机器人

 效果视频:

c# 实现 机器人 dh,机器人运动学,机器人模拟仿真,机器人

 代码部分:


        public void Plan_path(double xs, double ys, double zs, double xe, double ye, double ze, double speed)
        private void Button_Click_9(object sender, RoutedEventArgs e)
        {
             pos[0] = qci[0];
             pos[1] = qci[1];
             pos[2] = qci[2];
             pos[3] = inverse.g4;
             pos[4] = inverse.g5;
             pos[5] = inverse.g6;
            plp1[0] = pos[0];
            plp1[1] = pos[1];
            plp1[2] = pos[2];
            MessageBox.Show("位置一已记录!");
        }

        private void Button_Click_10(object sender, RoutedEventArgs e)
        {
            pos_1[0] = qci[0];
            pos_1[1] = qci[1];
            pos_1[2] = qci[2];
            pos_1[3] = inverse.g4;
            pos_1[4] = inverse.g5;
            pos_1[5] = inverse.g6;
            plp2[0] = pos_1[0];
            plp2[1] = pos_1[1];
            plp2[2] = pos_1[2];
            MessageBox.Show("位置二已记录!");
        }
public void LinePath()
{
linerPath.Plan_path(pos[2],pos[1],pos[0],pos_1[2],pos_1[1],pos_1[0],5);
            if (loop_sport.IsChecked == true)
            {
                loop = true;
                while (loop)
                {
                    for (int i = 0; i < linerPath.x_start.Count; i++)
                    {
                        double[] linepos = new double[6];
                        linepos[2] = linerPath.x_start[i];
                        linepos[1] = linerPath.y_start[i];
                        linepos[0] = linerPath.z_start[i];
                        linepos[3] = inverse.euler[0];
                        linepos[4] = inverse.euler[1];
                        linepos[5] = inverse.euler[2];
                        double[] q = new double[6];
                        m_inverse.Rob_Ik(linepos, q);
                        refresh(inverse.g1, inverse.g2, inverse.g3, inverse.g4 - 90, inverse.g5 - 90, inverse.g6 + 90);
                        Delay(20);

                    }
                }
}

Xaml代码:

<UserControl x:Class="WpfApp3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp3"
        xmlns:helix ="http://helix-toolkit.org/wpf"
        mc:Ignorable="d"
        d:DesignHeight="300" d:DesignWidth="800" Background="#FF383333">
    <Grid>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="0*"/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="32*"/>
            <RowDefinition Height="43*"/>
        </Grid.RowDefinitions>
        <helix:HelixViewport3D x:Name="viewPort3d" ZoomExtentsWhenLoaded="True" BorderBrush="Gray" BorderThickness="3" ShowCoordinateSystem="True" Grid.ColumnSpan="2" Margin="0,10,0,0" Grid.RowSpan="2" >
            <helix:GridLinesVisual3D Width="150" Length="150" Thickness="0.5" MinorDistance="6" MajorDistance="7" Fill="#FF34998F"/>
            <helix:DefaultLights/>
        </helix:HelixViewport3D>
        <Button Content="移动" HorizontalAlignment="Left" Margin="114,26,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click" Grid.ColumnSpan="2" Height="19"/>
        <Button Content="复位" HorizontalAlignment="Left" Margin="207,26,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1" Grid.ColumnSpan="2" Height="19"/>
        <Button Content="测试" HorizontalAlignment="Left" Margin="24,26,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_2" Grid.ColumnSpan="2" Height="19"/>
        <GroupBox Grid.ColumnSpan="2" Header="机器人当前位置:" HorizontalAlignment="Left" Height="136" Margin="1195,10,-607,0" VerticalAlignment="Top" Width="212" Foreground="#FFDCA7A7" Grid.RowSpan="2"/>
        <Label Grid.ColumnSpan="2" Content="Z:" HorizontalAlignment="Left" Margin="1209,100,-509,0" VerticalAlignment="Top" Width="100" Background="{x:Null}" Foreground="#FFECDFDF" Height="25"/>
        <Label Grid.ColumnSpan="2" Content="X:" HorizontalAlignment="Left" Margin="1209,40,-509,0" VerticalAlignment="Top" Width="100" Foreground="#FFF5E4E4" Height="25"/>
        <Label Grid.ColumnSpan="2" Content="Y:" HorizontalAlignment="Left" Margin="1209,70,-509,0" VerticalAlignment="Top" Width="100" Foreground="#FFEEDFDF" Height="25"/>
        <Label x:Name="lable_x" Grid.ColumnSpan="2" Content="  " HorizontalAlignment="Left" Margin="1279,40,-579,0" VerticalAlignment="Top" Width="100" Foreground="#FFEEDEDE" Height="25"/>
        <Label x:Name="lable_y" Grid.ColumnSpan="2" Content="  " HorizontalAlignment="Left" Margin="1279,70,-579,0" VerticalAlignment="Top" Width="100" Foreground="#FFE2CCCC" Height="25"/>
        <Label x:Name="lable_z" Grid.ColumnSpan="2" Content="  " HorizontalAlignment="Left" Margin="1279,100,-579,0" VerticalAlignment="Top" Width="100" Foreground="#FFE8D6D6" Height="25"/>
        <Label Grid.ColumnSpan="2" Content="Z:" HorizontalAlignment="Left" Margin="1209,100,-509,0" VerticalAlignment="Top" Width="100" Background="{x:Null}" Foreground="#FFECDFDF" Height="25"/>
        <Label Grid.ColumnSpan="2" Content="Y:" HorizontalAlignment="Left" Margin="1209,70,-509,0" VerticalAlignment="Top" Width="100" Foreground="#FFEEDFDF" Height="25"/>
        <Label Grid.ColumnSpan="2" Content="X:" HorizontalAlignment="Left" Margin="1209,40,-509,0" VerticalAlignment="Top" Width="100" Foreground="#FFF5E4E4" Height="25"/>
        <GroupBox Grid.ColumnSpan="2" Header="机器人当前姿态:" HorizontalAlignment="Left" Height="136" Margin="978,10,-390,0" VerticalAlignment="Top" Width="212" Foreground="#FFE8AEAE" Grid.RowSpan="2"/>
        <Label Grid.ColumnSpan="2" Content="Roll:" HorizontalAlignment="Left" Margin="993,40,-293,0" VerticalAlignment="Top" Width="100" Foreground="#FFE6D8D8" Height="25"/>
        <Label Grid.ColumnSpan="2" Content="Pitch:" HorizontalAlignment="Left" Margin="993,70,-293,0" VerticalAlignment="Top" Width="100" Foreground="#FFE2D2D2" Height="25"/>
        <Label Grid.ColumnSpan="2" Content="Yaw:" HorizontalAlignment="Left" Margin="993,100,-293,0" VerticalAlignment="Top" Width="100" Foreground="#FFE4D3D3" Height="25"/>
        <Label x:Name="lable_R" Grid.ColumnSpan="2" Content="  " HorizontalAlignment="Left" Margin="1068,40,-368,0" VerticalAlignment="Top" Width="100" Foreground="#FFF0DDDD" Height="25"/>
        <Label x:Name="lable_P" Grid.ColumnSpan="2" Content="  " HorizontalAlignment="Left" Margin="1068,70,-368,0" VerticalAlignment="Top" Width="100" Foreground="#FFEEE2E2" Height="25"/>
        <Label x:Name="lable_Y" Grid.ColumnSpan="2" Content="  " HorizontalAlignment="Left" Margin="1068,100,-368,0" VerticalAlignment="Top" Width="100" Foreground="#FFF3EFEF" Height="25"/>
        <Slider HorizontalAlignment="Left" Height="0" Margin="-290,88,0,0" VerticalAlignment="Top" Width="48"/>
        <Label Grid.ColumnSpan="2" Content="位置移动" HorizontalAlignment="Left" Margin="978,23,-236,0" VerticalAlignment="Top" Foreground="#FFE0CBCB" Grid.Row="1" Height="25" Width="58"/>
        <Slider x:Name="joint1" Grid.ColumnSpan="2" HorizontalAlignment="Left" Margin="1034,61,-607,0" VerticalAlignment="Top" Width="373" Grid.Row="1" ValueChanged="Joint1_ValueChanged" Maximum="180" Minimum="-180" Height="18"/>
        <Slider x:Name="joint3" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="23" Margin="1034,121,-607,0" VerticalAlignment="Top" Width="373" Grid.Row="1" Maximum="180" Minimum="-180" ValueChanged="Joint3_ValueChanged"/>
        <Slider x:Name="joint5" Grid.ColumnSpan="2" HorizontalAlignment="Left" Margin="1034,183,-607,-25" VerticalAlignment="Top" Width="373" Grid.Row="1" Maximum="180" Minimum="-180" ValueChanged="Joint5_ValueChanged" Height="14"/>
        <Slider x:Name="joint6" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="25" Margin="1034,217,-607,-70" Grid.Row="1" VerticalAlignment="Top" Width="373" Maximum="180" Minimum="-180" ValueChanged="Joint6_ValueChanged"/>
        <Label Grid.ColumnSpan="2" Content="J1" HorizontalAlignment="Left" Margin="978,61,-213,0" Grid.Row="1" VerticalAlignment="Top" Width="35" Foreground="#FFE8E0E0" Height="25"/>
        <Label Grid.ColumnSpan="2" Content="J2" HorizontalAlignment="Left" Margin="978,91,-213,0" Grid.Row="1" VerticalAlignment="Top" Width="35" Foreground="#FFE8E0E0" Height="25"/>
        <Label Grid.ColumnSpan="2" Content="J3" HorizontalAlignment="Left" Height="25" Margin="978,119,-213,0" Grid.Row="1" VerticalAlignment="Top" Width="35" Background="{x:Null}" Foreground="#FFF0DCDC"/>
        <Label Grid.ColumnSpan="2" Content="J4" HorizontalAlignment="Left" Height="25" Margin="978,149,-213,-2" Grid.Row="1" VerticalAlignment="Top" Width="35" Background="{x:Null}" Foreground="#FFF0DCDC"/>
        <Label Grid.ColumnSpan="2" Content="J5" HorizontalAlignment="Left" Height="25" Margin="978,183,-213,-36" Grid.Row="1" VerticalAlignment="Top" Width="35" Background="{x:Null}" Foreground="#FFF0DCDC"/>
        <Label Grid.ColumnSpan="2" Content="J6" HorizontalAlignment="Left" Height="25" Margin="978,213,-213,-66" Grid.Row="1" VerticalAlignment="Top" Width="35" Background="{x:Null}" Foreground="#FFF0DCDC"/>
        <Slider x:Name="joint2" Grid.ColumnSpan="2" HorizontalAlignment="Left" Margin="1034,91,-607,0" Grid.Row="1" VerticalAlignment="Top" Width="373" Maximum="180" Minimum="-180" ValueChanged="Joint2_ValueChanged" Height="18"/>
        <Slider x:Name="joint4" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="21" Margin="1036,153,-607,-2" Grid.Row="1" VerticalAlignment="Top" Width="371" Maximum="180" Minimum="-180" ValueChanged="Joint4_ValueChanged"/>
        <Button Grid.ColumnSpan="2" Content="X+" HorizontalAlignment="Left" Height="19" Margin="24,64,0,0" Grid.Row="1" VerticalAlignment="Top" Width="79" Click="Button_Click_3"/>
        <Button Grid.ColumnSpan="2" Content="X-" HorizontalAlignment="Left" Height="19" Margin="24,97,0,0" Grid.Row="1" VerticalAlignment="Top" Width="79" Click="Button_Click_4"/>
        <Button Grid.ColumnSpan="2" Content="Y+" HorizontalAlignment="Left" Height="19" Margin="124,64,0,0" Grid.Row="1" VerticalAlignment="Top" Width="75" Click="Button_Click_5" RenderTransformOrigin="0.049,0.469"/>
        <Button Grid.ColumnSpan="2" Content="Y-" HorizontalAlignment="Left" Height="19" Margin="124,97,0,0" Grid.Row="1" VerticalAlignment="Top" Width="75" Click="Button_Click_6"/>
        <Button Grid.ColumnSpan="2" Content="Z+" HorizontalAlignment="Left" Height="19" Margin="221,64,0,0" Grid.Row="1" VerticalAlignment="Top" Width="75" Click="Button_Click_7"/>
        <Button Grid.ColumnSpan="2" Content="Z-" HorizontalAlignment="Left" Height="18" Margin="221,97,0,0" Grid.Row="1" VerticalAlignment="Top" Width="75" Click="Button_Click_8"/>
        <TextBox x:Name="text_y" HorizontalAlignment="Left" Height="23" Margin="160,25,0,0" Grid.Row="1" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Width="61" Grid.ColumnSpan="2"/>
        <TextBox x:Name="text_z" HorizontalAlignment="Left" Height="23" Margin="262,25,0,0" Grid.Row="1" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Width="61" Grid.ColumnSpan="2"/>
        <Label Content="X步进" HorizontalAlignment="Left" Height="27" Margin="6,23,0,0" VerticalAlignment="Top" Background="{x:Null}" Foreground="#FFEEDADA" Width="51" Grid.Row="1" Grid.ColumnSpan="2"/>
        <Label Content="Y步进" HorizontalAlignment="Left" Height="27" Margin="114,23,0,0" Grid.Row="1" VerticalAlignment="Top" Background="{x:Null}" Foreground="#FFEEDADA" Width="51" Grid.ColumnSpan="2"/>
        <Label Content="Z步进" HorizontalAlignment="Left" Height="27" Margin="221,23,0,0" Grid.Row="1" VerticalAlignment="Top" Background="{x:Null}" Foreground="#FFEEDADA" Width="51" Grid.ColumnSpan="2"/>
        <TextBox x:Name="text_x" HorizontalAlignment="Left" Height="23" Margin="48,25,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Width="61" Grid.Row="1" RenderTransformOrigin="2.574,1.522" Grid.ColumnSpan="2"/>
        <GroupBox Grid.ColumnSpan="2" Header="操作模块" HorizontalAlignment="Left" Height="395" VerticalAlignment="Top" Width="337" Margin="0,0,0,-199" Foreground="#FFBD9292" Grid.Row="1"/>
        <CheckBox x:Name="Continuity_Motion" Content="连续运动" HorizontalAlignment="Left" Margin="24,59,0,0" VerticalAlignment="Top" Foreground="#FFE6D4D4" Grid.ColumnSpan="2"/>
        <CheckBox x:Name="Once_Motion" Grid.ColumnSpan="2" Content="轴单次运动" HorizontalAlignment="Left" Margin="114,59,0,0" VerticalAlignment="Top" Foreground="#FFDACCCC" IsChecked="True"/>
        <TextBox x:Name="text_step" Grid.ColumnSpan="2" HorizontalAlignment="Left" Height="18" Margin="57,139,0,0" TextWrapping="Wrap" Text="0" VerticalAlignment="Top" Width="72" Background="#FFD6CCCC" BorderBrush="#FFE6EAF3" Foreground="#FF111010" Grid.Row="1"/>
        <Label Grid.ColumnSpan="2" Content="Step:" HorizontalAlignment="Left" Margin="10,135,0,0" VerticalAlignment="Top" Height="24" Grid.Row="1" Width="57" Foreground="#FFF3EAEA"/>
        <Button Grid.ColumnSpan="2" Content="Re_Pos_1" HorizontalAlignment="Left" Margin="300,26,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_9"/>
        <Button Grid.ColumnSpan="2" Content="Re_Pos_2" HorizontalAlignment="Left" Margin="394,26,0,0" VerticalAlignment="Top" Width="73" Click="Button_Click_10"/>
        <Button Grid.ColumnSpan="2" Content="MoveL" HorizontalAlignment="Left" Margin="585,26,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_11"/>
        <CheckBox x:Name="Once_sport" Grid.ColumnSpan="2" Content="规划单次运动" HorizontalAlignment="Left" Margin="24,84,0,0" VerticalAlignment="Top" Foreground="#FFD6C0C0"/>
        <CheckBox x:Name="loop_sport" Grid.ColumnSpan="2" Content="规划循环运动" HorizontalAlignment="Left" Margin="124,84,0,0" VerticalAlignment="Top" RenderTransformOrigin="0.434,0.4" Foreground="#FFE0D0D0"/>
        <Button Grid.ColumnSpan="2" Content="Re_Pos_3" HorizontalAlignment="Left" Margin="487,26,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="0.613,0.368" Click="Button_Click_12"/>
        <Button Grid.ColumnSpan="2" Content="MoveC" HorizontalAlignment="Left" Margin="677,26,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_13"/>

    </Grid>

</UserControl>
欢迎添加qq:675260963进行技术交流! 文章来源地址https://www.toymoban.com/news/detail-572175.html

到了这里,关于基于C#的机器人仿真平台和机器人运动学算法实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真)

    🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。 🚀详情:图解自动驾驶中的运动规划(Motion Planning),附几十种规

    2024年02月05日
    浏览(52)
  • Matlab/Simulink六自由度机器人运动学与控制系统仿真(一)【附源文件】

    Matlab/Simulink六自由度机器人运动学与控制系统仿真(一)【附源文件】

    本文章为系列文章,以IRB1600机器人为例,建立机器人正运动、逆运动学、控制系统模型,并在simulink中进行仿真,与理论计算结果进行对比验证 (一) irb1600机器人坐标系建立、正运动学计算与simulink验证 (二) 机器人逆运动学计算 (三) 机器人运动学控制系统仿真 本文以

    2024年01月16日
    浏览(169)
  • 机器人运动学标定:基于DH建模方法

    机器人运动学标定:基于DH建模方法

    作者:桂凯 链接:https://www.zhihu.com/question/401957723/answer/1298513878 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 当然,运动学标定这种很基础的问题,理论已非常成熟了,基于激光或拉线编码器的标定系统也已经商业化了。我们在接

    2024年02月12日
    浏览(9)
  • MATLAB仿真UR5机器人simulink simscape 自制建模 正向运动学,逆向运动学关节空间轨迹规划 五次多项式轨迹规划

    MATLAB仿真UR5机器人simulink simscape 自制建模 正向运动学,逆向运动学关节空间轨迹规划 五次多项式轨迹规划

    MATLAB仿真UR5机器人simulink simscape 自制建模  正向运动学,逆向运动学 关节空间轨迹规划 五次多项式轨迹规划 笛卡尔空间轨迹规划 直线插补    还包含机器人工具箱建立的模型对比 MATLAB仿真UR5机器人simulink simscape 自制建模及运动学规划 摘要:本文介绍了利用MATLAB仿真UR5机器

    2024年02月04日
    浏览(17)
  • 机器人位置运动学

    机器人位置运动学

    正运动学 :已知机器人各关节的变量,计算出末端执行器的位置和姿态。 逆运动学 :求解一组关节变量,使机器人末端放置在特定位置并且具有期望的姿态。 运动学方法 利用矩阵建立刚体的位置和姿态,并利用矩阵建立物体的平移和旋转运动表示,研究不同构性机器人(

    2024年02月15日
    浏览(17)
  • 机器人学:(3)机器人运动学

    机器人学:(3)机器人运动学

    机器人运动学(Kinematics)是从几何角度描述和研究机器人的位置、速度和加速度随时间的变化规律的科学,它不涉及机器人本体的物理性质和加在其上的力。这里主要介绍机器人运动学的建模方法及逆运动学的求解方法。 机器人运动学问题主要在机器人的工作空间与关节空

    2024年02月07日
    浏览(14)
  • 机器人学基础(三):机器人运动学

    机器人学基础(三):机器人运动学

    运动学问题是在不考虑引起运动的力和力矩的情况下,描述机械臂的运动。上一篇我们已经讨论了机器人运动方程的表示方法,这一篇将会讨论机器人的DH建模方法。 Denavit-Hartenberg(D-H)模型于1955年首次提出,用于描述机器人连杆和节点之间相互关系。后来逐步完善推导出了

    2024年02月09日
    浏览(9)
  • 工业机器人(六)——运动学分析

    工业机器人(六)——运动学分析

      Delta 并联机构具有工作空间大、运动耦合弱、力控制容易和工作速度快等优点,能够实现货物抓取、分拣以及搬运等,在食品、医疗和电子等行业中具有广泛的应用。在结构设计的基础上,本部分通过运动学和动力学分析,为并联机构优化设计提供前期基础,具体内容如

    2024年02月09日
    浏览(17)
  • 机器人——正向运动学(Forward Kinematics)与逆向运动学(Inverse Kinematics)

    正向运动学和反向运动学分别是什么意思 正向运动学是指从机器人的关节运动推导出末端执行器的运动的过程,也就是从机器人的关节坐标计算出末端执行器的位置和姿态信息的过程。反向运动学则是指从末端执行器的位置和姿态信息推导出机器人的关节坐标的过程。简单来

    2024年02月16日
    浏览(12)
  • 六自由度机器人(机械臂)运动学建模及运动规划系列(一)——简介

    六自由度机器人(机械臂)运动学建模及运动规划系列(一)——简介

    毕业设计做了六轴机器人相关的课题,做完之后学到很多,在这里分享一下。本篇首先对六轴机器人及其研究内容进行简单的介绍。 六轴机器人中的六轴指个六自由度,由关节和连杆组成。常见的六轴机器人为 串联型旋转关节机器人 。这里以一款川崎机器人为例,展示一下

    2024年02月02日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包