精华内容
下载资源
问答
  • 移动机器人导航避障ICRA论文 进化过程!! ICRA2016:A Deep-Network Solution Towards Model-less Obstacle Avoidance 人工操控机器人,记录深度图与对应的离散的5个速度信息,使用简单的CNN网络+FC,将深度图...

    移动机器人导航避障ICRA论文

    进化过程!!

    ICRA2016: A Deep-Network Solution Towards Model-less Obstacle Avoidance

    人工操控机器人,记录深度图与对应的离散的5个速度信息,使用简单的CNN网络+FC,将深度图直接映射到5个动作的可能概率,选取最佳动作,实现深度图的视觉导航。与传统的方法相比,不需要地图信息,是首个使用视觉导航的论文。

     

    ICRA2017: From Perception to Decision: A Data-driven Approach to End-to-end Motion Planning for Autonomous Ground Robots

    使用ROS navigation包操控机器人,记录激光与速度对应的数据,制作大量数据集,来训练CNN网络实现端到端的映射,与ROS的导航相比不需要建立地图信息,与去年的对比,动作的可能性多,网络的输出为线速度与角速度;视野范围大,对于动态的障碍适应效果好。

     

    ICRA2018: Towards Optimally Decentralized Multi-Robot Collision Avoidance via Deep Reinforcement Learning

    去除了人工操控阶段,也不使用ROS的导航,采用强化学习PPO算法,自动收集数据,设计奖励函数,实现激光到连续速度的端到端的映射,迁移到多机器人的导航当中。

     

    ICRA2019: Deep Reinforcement Learning of Navigation in a Complex and Crowded Environment with a Limited Field of View

    使用单个深度相机代替激光雷达,从180°数据减小到90°信息,采用LSTM增加记忆信息,使用Actor-Critic算法训练,实现深度图到激光到速度的映射,并在迁移到真实机器人时采用随机参数,使迁移的效果更好。

     

     

    展开全文
  • 客服+机器人客服 架构思想

    千次阅读 2019-09-10 14:44:07
    分享一次自实现IM的经验。...请大家帮忙看看我的“客服+机器人客服+IM”架构思想 即时通讯网 调用环信工具类 /** * 环信常量类 * * @Date 2019/1/8-15:24 * @Author Amarone * @Description...

    注:如果您发现任何不正确的内容,或者您想要分享有关本文主题的更多信息,请撰写评论或联系我 15340938921@163.com。
    如有侵权请联系我删除。环信的API是公开的,应该没啥事吧~~~


    分享一次自实现IM的经验。自己实现了一个简略版本的IM。勉强可以用,就是页面需要自己实现。虽然最终还是使用了环信的产品。因为自己架构的不太成熟。没有考虑到很多因素。果然啊自己造的就是没有别人已经成熟的产品,使用的更坚挺、持久,圆润~!

    调用环信工具类

    /**
     * 环信常量类
     *
     * @Date 2019/1/8-15:24
     * @Author Amarone
     * @Description you should see
     * <pre>
     * 1. http://api-docs.easemob.com/#/%E8%8E%B7%E5%8F%96token
     * 2. http://docs-im.easemob.com/im/100serverintegration/10intro
     * </pre>
     **/
    public class EasemobConst {
        public static String SEGMENTATION = "/";
    
        //***************************************************     基础属性配置    *******************************************
    
        /**
         * IM 登录统一默认密码
         */
        public static String IM_DEFAULT_PASSWORD = "";
    
        /**
         * 企业的唯一标识 开发者在环信开发者管理后台注册账号时填写的企业 ID 此处从配置文件获取
         */
        public static String BASE_ORG_NAME = ****;
    
        /**
         * 同一“企业”下“APP”唯一标识,开发者在环信开发者管理后台创建应用时填写的“应用名称”
         */
        public static String BASE_APP_NAME = *****;
    
        /**
         * 请求环信接口TOKEN
         */
        public static String BASE_TOKEN = "";
    
        /**
         * 基础属性 - 环信后台配置
         */
        public static String BASE_CLIENT_ID = ****;
    
        /**
         * 基础属性 - 环信后台配置
         */
        public static String BASE_CLIENT_SECRET = ****;
    
        //***************************************************  API 接口URL 配置    ******************************************************
    
        /**
         * 环信公共请求URL、请求链接参考 http://api-docs.easemob.com/#!/%E7%94%A8%E6%88%B7%E4%BD%93%E7%B3%BB%E9%9B%86%E6%88%90/post_org_name_app_name_users
         * 格式为: ${COMMON_PATH}/{org_name}/{app_name}/users
         */
        public static String API_BASE_PATH = "http://a1.easemob.com/" + BASE_ORG_NAME + SEGMENTATION + BASE_APP_NAME;
    
        /**
         * 获取token
         * POST /{org_name}/{app_name}/token
         */
        public static String API_URL_GETTOKEN = "/token";
    
        /**
         * /{org_name}/{app_name}/users/{owner_username}/contacts/users/{friend_username}
         *
         * 向IM 用户添加好友
         */
        public static String API_URL_ADD_FRIEND = "/users/{owner_username}/contacts/users/{friend_username}";
    
        /**
         * API 接口  用户体系集成
         */
        public static String API_URL_USER_SYSTEM = "/users";
    
        /**
         * API 接口  查看一个用户的在线状态。 GET /{org_name}/{app_name}/users/{username}/status
         */
        public static String API_URL_ONLINE_STATUS = "/users/{username}/status";
    
        /**
         * 离线消息数量 GET /{org_name}/{app_name}/users/{owner_username}/offline_msg_count
         */
        public static String API_URL_OFFLINE_MSG = "/users/{owner_username}/offline_msg_count";
    
    
        /**
         * 解除好友关系 DELETE /{org_name}/{app_name}/users/{owner_username}/contacts/users/{friend_username}
         */
        public static String API_URL_RELIEVE_FRIEND = "/users/{owner_username}/contacts/users/{friend_username}";
    
    }
    
    /**
     * 获取token
     *
     * @Date 2019/1/11-14:45
     * @Author Amarone
     * @Description
     **/
    public class GetToken {
    
        private String grant_type = "client_credentials";
        
        // 从配置文件获取
        private String client_id = ***;
         // 从配置文件获取
        private String client_secret = ****;
    
        // 省略get set
    }
    
    
    /**
     * 注册账户
     *
     * @Date 2019/1/15-10:57
     * @Author Amarone
     * @Description
     **/
    public class RegisterAcc {
    
        /**
         * 用户名
         */
        private String username;
        /**
         * 密码
         */
        private String password;
        /**
         * 昵称
         */
        private String nickname;
    
       // 省略get set 有参 无参 构造
    }
    
    /**
     * @Date 2019/1/12-18:04
     * @Author Amarone
     * @Description
     **/
    public class RspToken {
    
        /**
         * token 值
         */
        private String access_token;
        /**
         * token 有效时间,以秒为单位,在有效期内不需要重复获取
         */
        private String expires_in;
        /**
         * 当前 APP 的 UUID 值
         */
        private String application;
    
       // 省略get set 有参 无参 构造
    }
    
    import org.apache.commons.codec.Charsets;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpMethod;
    import org.springframework.http.MediaType;
    import org.springframework.stereotype.Service;
    import org.springframework.util.StringUtils;
    import org.springframework.web.reactive.function.client.WebClient;
    
    import java.util.LinkedHashMap;
    import reactor.core.publisher.Mono;
    
    /**
     * 环信工具类
     *
     * @Date 2019/1/8-15:23
     * @Author Amarone
     * @Description
     **/
    @Service
    public class EasemobUtil extends BaseLogger {
    
        /**
         * 发送post 请求
         *
         * @param method    请求的方法
         * @param url       请求的路径
         * @param para      发送请求的参数
         * @param parameter 请求路径中的参数
         * @return rsp
         */
        public LinkedHashMap prefixRequest(HttpMethod method, String url, Object para, Object... parameter) throws Exception {
            if (method == null) {
                throw new BizException("请求方法未识别!");
            }
            LinkedHashMap rsp = null;
            try {
                if (HttpMethod.POST.compareTo(method) == 0) {
                    rsp = postRequest(url, para, parameter);
                } else if (HttpMethod.GET.compareTo(method) == 0) {
                    rsp = getRequest(url, parameter);
                } else if (HttpMethod.DELETE.compareTo(method) == 0) {
                    rsp = deleteRequest(url, parameter);
                } else {
                    throw new BizException("请求方法未识别!");
                }
            } catch (Exception e) {
                if (e.getCause() instanceof EasemobException) {
                    EasemobException ex = (EasemobException) e.getCause();
                    if (String.valueOf(EasemobEnum.ANEW_TOKEN.getValue()).equals(ex.messageCode)) {
                        logger.warn("调用环信 401 异常,重新请求TOKEN");
                        // 401 错误为 token过期
                        getEasemobToken();
                        // 重新发送请求
                        prefixRequest(method, url, para, parameter);
                    } else if (String.valueOf(EasemobEnum.BAD_REQ.getValue()).equals(ex.messageCode)) {
                        logger.warn("调用环信 400 异常," + e.getMessage());
                    } else {
                        e.printStackTrace();
                        throw ex;
                    }
                } else {
                    e.printStackTrace();
                    throw e;
                }
            }
            return rsp;
        }
    
    
        /**
         * 删除方法
         *
         * @param url       请求的路径
         * @param parameter 请求路径中的参数
         */
        public LinkedHashMap deleteRequest(String url, Object... parameter) throws Exception {
            if (StringUtils.isEmpty(EasemobConst.BASE_TOKEN)) {
                getEasemobToken();
            }
            WebClient webClient = buildBase();
            Mono<LinkedHashMap> result = webClient
                    .delete()
                    .uri(url, parameter)
                    .header(HttpHeaders.AUTHORIZATION, EasemobConst.BASE_TOKEN)
                    .acceptCharset(Charsets.UTF_8)
                    .retrieve()
                    .onStatus(e -> e.is4xxClientError(), resp -> {
                        return Mono.error(new EasemobException(String.valueOf(resp.statusCode().value()), resp.statusCode().getReasonPhrase()));
                    })
                    .onStatus(e -> e.is5xxServerError(), resp -> {
                        return Mono.error(new RuntimeException(resp.statusCode().value() + " : " + resp.statusCode().getReasonPhrase()));
                    })
                    .bodyToMono(LinkedHashMap.class)
                    .doOnError(onerror -> {
                        logger.error("请求IM服务失败,请稍后重试!");
                        onerror.printStackTrace();
                    });
            return result.block();
        }
    
        /**
         * 发送post请求(本方法未处理异常)
         *
         * @param url       请求的路径
         * @param para      发送请求的参数
         * @param parameter 请求路径中的参数
         * @return rsp
         */
        public LinkedHashMap postRequest(String url, Object para, Object... parameter) throws Exception {
            if (StringUtils.isEmpty(EasemobConst.BASE_TOKEN)) {
                getEasemobToken();
            }
            WebClient webClient = buildBase();
    
            Mono<LinkedHashMap> result = null;
            if (parameter != null) {
                result = webClient
                        .post()
                        .uri(url, parameter)
                        .header(HttpHeaders.AUTHORIZATION, EasemobConst.BASE_TOKEN)
                        .acceptCharset(Charsets.UTF_8)
                        .syncBody(para)
                        .retrieve()
                        .onStatus(e -> e.is4xxClientError(), resp -> {
                            return Mono.error(new EasemobException(String.valueOf(resp.statusCode().value()), resp.statusCode().getReasonPhrase()));
                        })
                        .onStatus(e -> e.is5xxServerError(), resp -> {
                            return Mono.error(new RuntimeException(resp.statusCode().value() + " : " + resp.statusCode().getReasonPhrase()));
                        })
                        .bodyToMono(LinkedHashMap.class)
                        .doOnError(onerror -> {
                            logger.error("请求IM服务失败,请稍后重试!");
                            onerror.printStackTrace();
                        });
            } else {
                result = webClient
                        .post()
                        .uri(url)
                        .header(HttpHeaders.AUTHORIZATION, EasemobConst.BASE_TOKEN)
                        .acceptCharset(Charsets.UTF_8)
                        .syncBody(para)
                        .retrieve()
                        .onStatus(e -> e.is4xxClientError(), resp -> {
                            return Mono.error(new EasemobException(String.valueOf(resp.statusCode().value()), resp.statusCode().getReasonPhrase()));
                        })
                        .onStatus(e -> e.is5xxServerError(), resp -> {
                            return Mono.error(new RuntimeException(resp.statusCode().value() + " : " + resp.statusCode().getReasonPhrase()));
                        })
                        .bodyToMono(LinkedHashMap.class);
            }
    
            if (result != null) {
                return result.block();
            } else {
                return null;
            }
        }
    
        /**
         * get 类型请求,应调用{prefixGetRequest()} 方法 (本方法未处理异常)
         *
         * @param url       请求url
         * @param parameter url中参数 使用 {}
         * @return result
         */
        public LinkedHashMap getRequest(String url, Object... parameter) throws Exception {
            if (StringUtils.isEmpty(EasemobConst.BASE_TOKEN)) {
                getEasemobToken();
            }
            WebClient webClient = buildBase();
            Mono<LinkedHashMap> result = webClient
                    .get()
                    .uri(url, parameter)
                    .header(HttpHeaders.AUTHORIZATION, EasemobConst.BASE_TOKEN)
                    .acceptCharset(Charsets.UTF_8)
                    .retrieve()
                    .onStatus(e -> e.is4xxClientError(), resp -> {
                        return Mono.error(new EasemobException(String.valueOf(resp.statusCode().value()), resp.statusCode().getReasonPhrase()));
                    })
                    .onStatus(e -> e.is5xxServerError(), resp -> {
                        return Mono.error(new RuntimeException(resp.statusCode().value() + " : " + resp.statusCode().getReasonPhrase()));
                    })
                    .bodyToMono(LinkedHashMap.class)
                    .doOnError(onerror -> {
                        logger.error("请求IM服务失败,请稍后重试!");
                        onerror.printStackTrace();
                    });
            return result.block();
        }
    
        /**
         * 获取环信token
         */
        void getEasemobToken() {
            WebClient webClient = buildBase();
            Mono<RspToken> rspMono = webClient
                    .post()
                    .uri(EasemobConst.API_URL_GETTOKEN)
                    .syncBody(new GetToken())
                    .retrieve()
                    .onStatus(e -> e.is4xxClientError(), resp -> {
                        return Mono.error(new RuntimeException(resp.statusCode().value() + " : " + resp.statusCode().getReasonPhrase()));
                    })
                    .bodyToMono(RspToken.class);
    
            rspMono.doOnError(onerror -> {
                logger.error("请求IM服务失败,请稍后重试!");
                onerror.printStackTrace();
            });
    
            RspToken rspToken = rspMono.block();
            // There are fucking Spaces
            EasemobConst.BASE_TOKEN = "Bearer " + rspToken.getAccess_token();
        }
    
        /**
         * 构建基础请求
         */
        WebClient buildBase() {
            return WebClient
                    .builder()
                    .baseUrl(EasemobConst.API_BASE_PATH)
                    .defaultHeaders(header -> {
                        header.setContentType(MediaType.APPLICATION_JSON);
                    })
                    .build();
        }
    }
    

    自实现IM

    使用技术如下

    • - JAVA 1.8
    • - SpringBoot
    • - Websocket
    • - Netty
    • - RabbitMQ
    • - Redis

    实现想法

    总体流程:

    • - 客户端指用户使用的客户端。客户端统一使用Websocket发起连接请求到后台的Netty服务器
    • - 客户端连接成功之后,紧接着想服务器发起一段报文。报文内含 客户端的用户id等信息
    • - Netty接收到请求之后将Channel与客户id绑定,存储到java.util.map 里面
    • - 每次接收到请求判断map里面是否存在消息接受者的id。如果没有存到消息同步库。待接收者上线后拉取信息

    客服机器人:

    • - 客服机器人由后台写netty客户端连接到服务器,机器人与普通客户之间以客户id开头字母匹配。

    以上写的信息有点不详细。想请教一下各位大神指出不足之处。

    • 暂不考虑传输 音频、视频等。目前只传送纯文本
    • 暂不考虑报文安全性
    • 暂不考虑报文大小、浪费的流量以及电量等
    • 暂不考虑大量并发
    • 暂不考虑分布式部署

    目前只是实现业务目标。

    2018年12月20日

    • 现在又多了一个问题。怎么把这玩意弄成高可用的、、

    2018年12月21日

    • 如果管理channel等信息存储在map里面。这样对于高可用的行不通的,一旦单点故障。整个IM就完蛋了。
    展开全文
  •  了解擂台赛的同学都知道,非标机器人对于结构的设计和选材方面是没有太多要求的,只对机器人的向下投影面积和机器人的重量做了限制,这就参与者脑洞大开了,各种奇思妙想的机械结构应运而生,机器人的机械结构...

    机械结构的设计思想


    文章架构上准备分机械设计、灰度传感器的使用、策略设计几方面讲解。


    写在前面

        了解擂台赛的同学都知道,非标机器人对于结构的设计和选材方面是没有太多要求的,只对机器人的向下投影面积和机器人的重量做了限制,这就让参与者脑洞大开了,各种奇思妙想的机械结构应运而生,机器人的机械结构确实需要下一番功夫去研究,一个好的机械结构不仅能让机器人更灵敏,而且可以增加攻击威力,甚至是取胜的关键所在。

        当前各个学校非标机器人的机械结构的设计似乎都是对外保密,不愿意和大家分享交流,导致比赛的时候大部分选手设计的机器人都是模仿上届机器人的机械结构,有的甚至连程序都没有改进,最终整场比赛的主角还是少数有想法的选手。今天在这里与大家分享下我们当年设计时考虑到的一些细节,希望可以帮到大家,同时也希望做过非标比赛的朋友也来分享下你的想法,在下方直接评论即可,让更多的人记住你的设计。

        我们在设计机械结构的时候是本着防守为基础,在这之上添加攻击元素,我有一个很给力的队友,平时我们都挺忙的,但是每当有比赛合作,都会抛开所有的事情全身心投入筹备中,每次做比赛前一个月我们会一起讨论机械结构的设计方案,从生活中借鉴创意设计,完善图纸,等到还有半个月的时候开始制作,最后一周,开启高能模式,一起去吃饭,一起通宵调试程序,困了直接在实验室睡觉,擂台比赛每局总共就2分钟,只要尽量保持自己本身不掉下擂台其实就是一种成功了。


    下面是关于设计时应注意的一些总结,欢迎在下方评论。



    1、机器人重心尽可能的低,机器人的重量侧重放在铲子和底盘上


    2、连线四个轮子的着地点尽可能的是一个正方形,这样可以精确的实现原地转弯(当在擂台的四个角落里采用原地转弯调头)。


    3、底盘上要尽可能不要有凸出的螺丝钉,如果有凸出的螺丝钉,在机器人上擂台的时候,容易卡在斜坡和擂台表面连接的棱角上。


    4、底盘距离轮子着地点的高度要适宜,过高的话机器人中心偏高,不稳定;过低的话在前轮走过斜坡与擂台表明连接的棱角后底盘会擦到棱角,造成前轮悬空的现象,有可能会因为驱动力不足导致上台失败。


    5、如果可以的话,把机器人设计成前后对称,也就是前后都有铲子,这样的话前后方都可以作为攻击的方向,当机器人遇到敌方的时候最大转角为90°,大大的提高了对战的灵敏度。当机器人遇到擂台边缘时,不需要调头,在根本上简化了机器人巡台的过程,杜绝了因为转弯不当机器人自己掉下擂台的情况(前后对称的设计一般都是活动铲,因为铲子放下去前后会超尺寸)。


    6、有些队伍很聪明把车身设计成黑色的,因为黑色有吸收光的效果,但是这种能力是有限的,最好让机器人表面尽可能的光滑,能够把敌方照射出的红外线反射出去,那么敌方的传感器就接收不到信号也就检测不到我们的机器人了,经过大量的实验得出,机器人侧壁与水平面的夹角小于等于60°时反射效果比较好。可以利用这个方法对付用光电管检测擂台边缘的机器人,可以发现敌方的机器人只要靠近我们的机器人就会误以为检测到擂台边缘,自动后退,从而不攻自破。


    7、机器人内部空间有限,在各个模块的安装和走线上一定要精简有条理,传感器的走线要集中、统一,杜绝走线杂乱的情况;确保各个接口的稳定性,杜绝出现接触不良等情况,确保在比赛的时候不用打开机器人的上盖,就可以调试程序和调节传感器。


    8、机器人的铲子一定要和擂台表明贴合的够紧。活动的铲子在机器人登上擂台变形结束后一定要固定死,绝不允许任何机器人随便掀自己的裙底。可以利用机械结构锁死,或者电磁铁之类的方法。


    9、机器人的向下投影面积不宜过大,四个轮子的着地点前后和左右最好不要超过20cm,但是也不能过小,过小会造成机器人受力不稳,过大转弯时不够灵敏,整体设计时把握好各个参数之间的关系。


    10、机械采用的材料可以是不锈钢等比较坚硬的材料,可以根据材质的国标进行估算机械部分的重量,对每部分的设计做到心中有数。

    暂时只想到这么多,后期想到其他的再来完善。

    最后请允许我插入一则广告,本人开的网店:KXCT雷電科技  主要经营机器人和智能车相关的灰度传感器和直流电机以及直流电机驱动等相关配件,欢迎大家前来选购和交流。


    淘宝店铺链接:https://shop128260623.taobao.com/?spm=2013.1.1000126.d21.tDinKz

    展开全文
  • 在大学里做过几次非标组别的机器人,看着机器人依照自己的思想在擂台上运动,非常成就感。出于对机器人的热爱,后来在淘宝上开了一家网店。专卖自己设计的机器人配件,于是认识非常多全国各地高校机器人领域的朋友...

    灰度传感器的使用


    上篇给大家介绍了非标机器人设计思想的机械设计部分,没有看的同学能够点击 机械设计思想 前去查看。


    在大学里做过几次非标组别的机器人,看着机器人依照自己的思想在擂台上运动,非常有成就感。出于对机器人的热爱,后来在淘宝上开了一家网店。专卖自己设计的机器人配件,于是认识非常多全国各地高校机器人领域的朋友,有非常多同学聊天第一句话就是要我比赛时的程序,个人认为我的程序写的非常水,也往群文件中上传了。我对这些同学都说了相同话,非标机器人之间差异非常大,机械上设计的不一样。传感器布局上的不一样,都会导致程序的不同。个人认为盲目的看别人的程序会扰乱自己的思维,依照自己的想法去做,才干锻炼自己的思维。有非常多同学购买了我们的产品,在这里对支持KXCT的同学说一声谢谢。

    在交流的过程中我发现各个高校实验室上届对下届知识的传承做的不是太好。好多新手来找我讨论该怎么做,说自己学长考研去了或者找工作去了,那实验室每一年都是反复而不能有太大的进步。希望大家做完比赛了写一个说明文档。把自己的研究成果留给后来人做參考。鉴于广大同学的情况。我在这里分享下我做非标时简单的设计思想,以抛砖引玉。

    今天主要讲讲灰度传感器的使用。


    一、传感器的了解

    非标经常使用检測擂台边缘的传感器常见有两种,例如以下:

    1、漫反射红外接近开关

    2、灰度传感器

    两者有什么优缺点呢?

      ①漫反射红外接近开关

        长处:有效检測距离长,通过调节固定的角度能够在机器人没有达到擂台边缘前。提前检測到擂台边缘。

        缺点:体积大,怕反光,怕黑色,假设对手是黑色或者反光,非常easy误推断擂台边缘,造成不攻自破的结果。

      ②灰度传感器

        长处:体积小,能够通过推断擂台的颜色得出机器人距离擂台边缘的距离,固定在机器人底部。碰到反光对手不会误判擂台边缘

        缺点:有效检測距离比較短

    无论用哪个类型的传感器控制思想是几乎相同的。以灰度传感器为例

    灰度传感器又分数字灰度和模拟灰度两种,差别例如以下

    ①模拟灰度传感器能够实时的检測机器人下方擂台的颜色,单片机依据读取的AD值进行分段处理。从而能够推断出机器人在什么位置。

    单片机必须有相关的程序配置和处理。

    ②数字灰度传感器仅仅能返回两个状态,到达或者没到达,判定标准通过电位器调节。

    单片机仅仅需读取IO状态就可以,程序编写简单。

    能够看出,用1个模拟传感器就能够推断机器人在擂台上的位置,可是无法推断机器人走向与擂台边缘的角度。这个角度会影响到机器人遇到擂台边缘返回擂台中心的路径。假设用数字传感器就能够解决问题,可是必须得用多个才干推断出来。

    二、传感器的固定

      使用数字灰度的同学非常多这样固定的传感器


    这样的固定方式能够推断出机器人的走向与擂台边缘的角度关系,可是假设想再细化点控制都不太好做到,比方以下这样的场景

     上图是擂台的图纸,我把它简单的划分成AB两个区域,在A区域里机器人能够可劲的造。想怎么折腾就怎么折腾。我们叫做安全区。在B区域里就要悠着点啦,要分碰到对手的时候和没有检測到对手的时候两种情况。无论是哪一种都不能掉以轻心,我们叫做雷区。那四角的传感器固定法就不太好识别这样的情况了,建议在机器人最中间加一个灰度传感器。

    三、机器人与擂台边缘的几种关系

    我画了几幅图作为演示样例,先给大家说下图例,以下这个是我画的机器人的模型,设计上前后是对称的也就是不分前后,白色①②③④代表的是灰度传感器固定的位置,为了描写叙述理解,我们约定当中①②的一側为机器人的前部,那么③④也就是机器人的后部了

    机器人模型


    机器人的走向与擂台边缘的夹角能够说是随机的。不太easy控制,当中几个比較有代表性的可能性例如以下



    上图总共画出了ABCD四种机器人与擂台边缘的情况,当中A和D不是同一种哦。由于机器人是前后对称的,所以A情况又能够分为前部(①②面)靠近擂台边缘和后部(③④面)靠近擂台边缘两种情况。可是程序的处理方法却能够一样。B情况能够分为①②、③④、①④、②③靠近擂台角落的情况。

    C情况能够分为①、②、③、④先检測到擂台边缘。D情况能够分为①④、②③两种情况。我们能够发现,机器人和擂台边缘的情况有非常多种。略微考虑少一种都会出现漏洞,这个时候就凸显前后对称和左右对称设计的优势了,情况处理上的工作直接降低一半。在实际调试中发现。出现以上几种情况的概率确实不是太高,所以我们还须要设计机器人在擂台上的路径(在没有遇到敌方的时候),路径有非常多种控制方法,在这里举两个样例简单说明下原理。

    请看下图



    上面两幅图上的红色细线代表机器人的行走路线(没有遇到敌方的时候)。能够选择让机器人顺时针或者逆时针依次行走四条红线,行走路径的半径能够通过控制两側轮子的差速进行调整,保证一圈下来机器人能够把擂台表明检測一遍,这样就能够大大的添加我之前说的那几种机器人与擂台边缘的情况的可能性。当遇到地方的时候中断这样的巡台路线,进行攻击,攻击策略之后会专门解说,消灭敌方后,机器人会逐渐恢复之前的巡台路线。大家能够尝试下其它的巡台路径。能够把实验结果在下方评论分享给大家。


    至此传感器篇解说的几乎相同了,可能描写叙述的不是太具体。当然我讲的仅仅是演示样例原理,还须要大家进行实际调试,欢迎大家评论。


    最后请同意我插入一则广告。本人开的网店:KXCT雷電科技  主要经营机器人和智能车相关的灰度传感器和直流电机以及直流电机驱动等相关配件。欢迎大家前来选购和交流。


    淘宝店铺链接:https://shop128260623.taobao.com/?

    spm=2013.1.1000126.d21.tDinKz


    转载于:https://www.cnblogs.com/zhchoutai/p/7305607.html

    展开全文
  • 深远意义的多机器人( 或多智能体) 在复杂动态环境和多重制约下, 完成多任务和多目标所需的实时推理和规划技术。 本文 主要叙述了足球机器人小车系统的模块设计思想, 简述了各模块的功能与特点, 此外还重点讨论了...
  • 他用自己的思想打造机器人 我在前面说过,这本书的结尾是吉米站在后台,准备闪亮登场,这是他的首次亮相。当我把吉米的这张照片发给我太太时,她很快回复:“这真的是用你的思想打造出的机器人!!!” 十年前,我...
  • 第1章 他用自己的思想打造机器人 我在前面说过,这本书的结尾是吉米站在后台,准备闪亮登场,这是他的首次亮相。当我把吉米的这张照片发给我太太时,她很快回复:“这真的是用你的思想打造出的机器人!!!” ...
  • 前几天实现一个服务器调度机器人的需求,也就是服务器调机器人上的接口,在实际实现中,机器人会将自身的状态信息跟任务执行信息再发送给服务器。 问题来了,代码写好了,但是机器人在北京,无法测试。 于是模拟了一...
  • java实现机器人行走,数据结构思想

    千次阅读 2014-04-06 22:17:39
     某少年宫引进了一批机器人小车。可以接受预先输入的指令,按指令行动。小车的基本动作很简单,只有3种:左转(记为L),右转(记为R),向前走若干厘米(直接记数字)。 例如,我们可以对小车输入如下的指令: ...
  • 42个AI与机器人大问题之——「身体的AI是否应该被区别对待?」9月2日在深圳举办的首届「Nature Conference - AI与机器人大会」上,Angelo C...
  • 机器人也需要碰撞标准? 当我们评价一款车的安全性时,经常会以碰撞测试成绩作为一个主要的参考项。始于1997年的NCAP为提升汽车的被动安全性做出了巨大贡献,在此之前,由于没有明确的汽车安全设计和测试...
  • 机器人

    2019-11-15 08:54:15
    今晚,脑子里又全是关于自己的两轮自主机器人loui的调研报告,索性完成博客的第一篇,聊聊自己的机器人之路。loui是自己为自己做的机器人的命名,因为自己名字是yilu,倒过来正好与loui谐音。曾经很多个夜晚,因为满...
  • 国外经典。卡雷尔机器人学java
  • 机器人维护

    2020-07-13 15:25:34
    加强工业机器人润滑工程管理,勿制造业皇冠上的明珠过早褪色 工业机器人被誉为“制造业皇冠顶端的明珠”,其研发、制造、应用是衡量一个国家科技创新和高端制造业水平的重要标志。2014年后,随着中国制造强力转型...
  • 避障是指移动机器人在行走过程中,通过传感器感知到在其规划路线上存在静态或动态障碍物时,按照 一定的算法实时更新路径,绕过障碍物,最后达到目标点。 避障常用哪些传感器 不管是要进行导航规划还是避障,感知...
  • C++语言的一个重要特征是可以...机器人轨迹规划算法中,一个很重要的问题是路径的计算,但是机器人的路径多种,包含直线路径,圆弧路径,复合路径等等。所以在KDL中就定义了一个基类:路径(class path),和其它6个
  • 在某种程度上,道德是一种认知的追求(cognitive pursuit),机器人也可以很容易地在其道德思想的认知上超越人类。未来技术的发展会带来一些更深层次的伦理问题:人类在什么动机下能够创造超级机器人,是否考虑延缓...
  • 科学性定义 机器人广义上包括一切模拟人类行为或思想,以及模拟其他生物的机械(如机器狗、机器猫等)。狭义上对机器人还有很多分类法及争议,有些电脑程序甚至也被称为机器人,如爬虫机器人[33]。 早期学者对机器人...
  • 在工业机器人领域,聚焦智能生产、智能物流,攻克工业机器人关键技术,提升可操作性和可维护性,重点发展弧焊机器人、真空(洁净)机器人、全自主编程智能工业机器人、人机协作机器人、双臂机器人、重载AGV 6种标志...
  • 机器人将应用在银行、商场、酒店、家庭等各类服务场所,未来必然与绝大多数民众进行接触和交互,因此从更广泛的层面对机器人进行宣传和解读,公众深层次了解机器人及其伦理问题很必要。 在机器人普及的过程中,...
  • 机器人技术

    2021-03-22 17:29:19
    机器人技术 撰写者 汉斯·彼得·莫拉维克(Hans Peter Moravec) 卡内基梅隆大学机器人技术研究所首席研究科学家,宾夕法尼亚州匹兹堡。机器人的作者:从机器到超越的心灵。 最近更新时间:2021年2月4日...
  • 机器人设想

    2019-10-30 10:25:35
    如果把自己当作一个[机器人]会怎样,没有多余的思想,只接收预设的指令行动。 这和量化交易的思想很相似,排除自我感情因素的干扰,对行动进行精准化设定,事后也很方便评估效果和优化。 回想下,为啥我们的计划和...
  • 随着科技教育的发展,更多的父母意识到孩子应该从小学习编程、科学、机器人等知识对将来时代的发展大有用处。这不仅是一种与时俱进的思想,更是一种展望未来的远见。确实,随着时代与科技的进步,整...
  • 机器人扫雷

    2019-01-12 23:54:32
    在区域的左上方一个机器人扫雷车。该扫雷车需要开通一条从左上角S到向右下角T的路线,然后开辟另外一条路从T返回到左上角起点S。 规定:(1)扫雷车从起点S出发后,每一步只能向右或向下; (2)扫雷车返回过程中...
  • 孩子学习机器人编程究竟没有用?时代的需求给了我们最好的答案。 很多家长孩子学习机器人编程,并不是抱着一种把孩子培养成程序员的心理,而是想孩子换一种思考方式解决问题、认知世界。机器人编程可以培养一...
  • 草莓采摘机器人——ROS导航(二)蒙特卡罗算法 思想整理 算法简介 蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于科学技术的发展和电子计算机的发明,而被提出的一种以概率...
  • 机器人发言

    千次阅读 2016-07-03 21:10:08
    聊天机器人(也可以称为语音助手、聊天助手、对话机器人等)是目前非常热的一个人工智能研发与产品方向。很多大型互联网公司投入重金研发相关技术,并陆续推出了相关产品,比如苹果Siri、微软Cortana与小冰、Google ...
  • SLAM机器人

    2020-07-09 11:21:04
    作者:小虎哥哥爱学习 ...来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。...2.ROS移动机器人的整体构造 2.1.硬件构造解析 2.2.电机解析 2.3.电机驱动板解析 2.4.底.

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,456
精华内容 12,182
关键字:

如何让机器人有思想