Winform模拟机器人运动轨迹

前言:感觉上是有点标题党了,但事确实是这么个事,代码也确实一开始是计划这么用的——只不过后来在实现的过程中,发现情况要比现在还要简单一些(虽然现在也挺简单)。

背景情况是这样的,我们有一个机器人会按照特定轨道进行自动取货送货,所以就需要在机器人开始任务的时候进行一个位置的实时监控。在一开始设想的时候(主要是模拟环境),我是用代码控制他的坐标的,也就是现在的代码。但实际上,我只要能够从PLC实时获取到坐标并显示出来即可。所以软件上基本就画个路径并且设置好轨道坐标即可。

但是写都写出来了,记录下吧;以下代码可能没什么实用价值,我也不废话了- -,可以直接翻到最后看下效果。

5401011a2e8be6461b1334bf385540fc.png

  1. 以下主要是通过GDI+绘制的,所以理论上是没什么比较复杂的东西

  2. 首先分别创建横竖轨道的实体类,用来绘制线路

private class HRoad
        {
            public int ID { get; set; }
            public int X { get; set; }
            public int Y { get; set; }
            public int Length { get; set; }


        }


        private class VRoad
        {
            public int ParentID { get; set; }
            public int X { get; set; }
            public int Y { get; set; }
            public int Length { get; set; }


        }
  1. 一些必要的基础变量

    Pen penR = new Pen(Color.LightGray, 2);
            Pen penB = new Pen(Color.Red, 1);
    
    
            List<HRoad> hRoads = new List<HRoad>();
            List<VRoad> vRoads = new List<VRoad>();
    
    
            int x = 20, y = 100;
    
    
            bool isRun = false;
            int hIndex = 0;
    
    
            int speed = 200;
            int stopX = 200;
  2. 对数据进行初始化

    private void Init()
            {
                int hx = 20, hy = 20;
                int hlength = 500, vlength = 80;
                for (int i = 1; i <= 3; i++)
                {
                    HRoad road = new HRoad { ID = i, X = hx, Y = i * vlength + hy, Length = hlength };
                    hRoads.Add(road);
    
    
                    if (i < 3)
                    {
                        vRoads.Add(new VRoad { ParentID = road.ID, X = 80 * i, Y = road.Y, Length = vlength });
                    }
                }
    
    
            }
  3. 绘制线路以及机器人坐标

    private void panel2_Paint(object sender, PaintEventArgs e)
            {
                Graphics graphics = e.Graphics;
                graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                foreach (var hRoad in hRoads)
                {
                    graphics.DrawLine(penR, hRoad.X, hRoad.Y, hRoad.X + hRoad.Length, hRoad.Y);
                }
    
    
                foreach (var vRoad in vRoads)
                {
                    graphics.DrawLine(penR, vRoad.X, vRoad.Y, vRoad.X, vRoad.Y + vRoad.Length);
                }
                Rectangle rect = new Rectangle(x, y - 10, 20, 20);
                graphics.DrawRectangle(penB, rect);
    
    
                graphics.FillEllipse(new SolidBrush(Color.LightBlue), stopX + 5, hRoads.Last().Y - 5, 10, 10);
            }
  4. 开始模拟

    private async void Start()
            {
                while (isRun && hIndex < hRoads.Count)
                {
                    var move = vRoads.Find(s => s.ParentID == hRoads[hIndex].ID);
                    if (move != null)
                    {
                        while (isRun)
                        {
                            if (move.X - 10 > x)
                            {
                                x += 10;
                                panel2.Invalidate(new Rectangle(hRoads[hIndex].X, hRoads[hIndex].Y - 10, hRoads[hIndex].Length, 22));
                            }
                            else if (move.X - 10 == x)
                            {
                                if (y < move.Length + move.Y)
                                {
                                    y += 10;
                                    panel2.Invalidate(new Rectangle(move.X-10, move.Y-10 , 22, move.Length+22));
                                }
                                else
                                {
                                    hIndex++;
                                    break;
                                }
                            }
                            else
                            {
                                x -= 10;
                                panel2.Invalidate(new Rectangle(hRoads[hIndex].X, hRoads[hIndex].Y-10, hRoads[hIndex].Length, 22));
                            }
                            await Task.Delay(speed);
                        }
                    }
                    else
                    {
                        while (x != stopX && isRun)
                        {
                            if (stopX > x)
                            {
                                x += 10;
                            }
                            else
                            {
                                x -= 10;
                            }
                            panel2.Invalidate(new Rectangle(hRoads[hIndex].X, hRoads[hIndex].Y - 10, hRoads[hIndex].Length, 22));
                            await Task.Delay(speed);
                        }
                        btn_start_Click(null, null);
                        break;
                    }
    
    
                }
    
    
            }
  5. 运行以及暂停继续

    private void btn_start_Click(object sender, EventArgs e)
            {
                if (btn_start.Text == "开始")
                {
                    btn_start.Text = "停止";
                    btn_pause.Enabled = true;
                    isRun = true;
                    x = 20; y = 100; hIndex = 0;
                    panel2.Invalidate();
    
    
                    speed = (int)num_speed.Value;
                    stopX = (int)num_stop.Value;
                    Start();
                }
                else
                {
                    btn_start.Text = "开始";
                    btn_pause.Text = "暂停";
                    btn_pause.Enabled = false;
                    isRun = false;
                }
            }
    
    
            private void btn_pause_Click(object sender, EventArgs e)
            {
                if (btn_pause.Text == "暂停")
                {
                    btn_pause.Text = "继续";
                    isRun = false;
                }
                else
                {
                    btn_pause.Text = "暂停";
                    isRun = true;
                    Start();
                }
            }
  6. 结束,看效果

152da0172118e3f7aac19c8d99a23137.gif

63d425022348e4d933e911c655b9daf3.png

-

技术群:添加小编微信并备注进群

小编微信:mm1552923   

公众号:dotNet编程大全    

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
想要在 WinForms 中创建一个机器人,可以使用 C# 编程语言和 Microsoft Bot Framework。 步骤如下: 1. 安装 Bot Framework SDK,并在 Visual Studio 中创建一个新的 C# 控制台应用程序。 2. 在控制台应用程序中添加 Microsoft.Bot.Builder 和 Microsoft.Bot.Builder.Integration.AspNet.Core NuGet 包。 3. 创建一个新的 Bot 类并实现 IBot 接口。 4. 在 Main 函数中配置 Web 应用程序并启动。 以下是一个简单的示例: ```csharp using Microsoft.Bot.Builder; using Microsoft.Bot.Builder.Integration.AspNet.Core; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; namespace MyBot { public class Bot : IBot { private readonly ILogger _logger; public Bot(ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger<Bot>(); } public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken)) { if (turnContext.Activity.Type == ActivityTypes.Message) { var message = turnContext.Activity.Text; // TODO: Add your bot's logic here. await turnContext.SendActivityAsync($"You said: {message}"); } } } public static class Program { public static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true); var configuration = builder.Build(); var loggerFactory = LoggerFactory.Create(builder => { builder.AddConfiguration(configuration.GetSection("Logging")); builder.AddConsole(); }); var botFrameworkAdapter = new BotFrameworkAdapter(configuration.GetSection("MicrosoftAppId").Value, configuration.GetSection("MicrosoftAppPassword").Value); var bot = new Bot(loggerFactory); var httpAdapter = new BotHttpAdapter(); httpAdapter.Use(botFrameworkAdapter) .Use(new ShowTypingMiddleware()) .Use(new SetLocaleMiddleware(configuration["DefaultLocale"])); var server = new WebHostBuilder() .UseKestrel() .UseStartup<Startup>() .UseUrls("http://localhost:3978") .Build(); server.Run(); } } } ``` 这里创建了一个名为 Bot 的类,实现了 IBot 接口。在 OnTurnAsync 方法中处理机器人接收到的消息,并可以添加自定义逻辑。在 Main 函数中创建了一个 Web 应用程序,并将其绑定到 3978 端口。 最后,在 Visual Studio 中运行该应用程序并使用 Bot Framework Emulator 进行测试。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值