精华内容
下载资源
问答
  • 影诗人Bot Lou Discord机器人,可获取有关数字纸牌游戏Shadowverse的信息。 执照 麻省理工学院
  • 一个简单Discord机器人,用于获取Rocket League Stats 如何设定 npm install 怎么跑 node bot.js 帮助 看看,让初学者接触不和谐的机器人获取不和谐的机器人令牌,请遵循本 有关mongo db详细信息,请转到 ...
  • 室内移动机器人导航中信息获取方法pdf,提供“室内移动机器人导航中信息获取方法”免费资料下载,主要包括导航采取的信息获取方法、多传感器信息融合研究现状、发展和展望内容,可供学习使用。
  • 这个Discord机器人为您提供了所有神奇宝贝详细信息。 它还包含一个IV检查器,用于那些希望通过Discord快速获得IV详细信息的人。 设置 前提条件 Node.js MySQl 数据库设置 创建要用于表数据库(MySQL) 在SQL...
  • 一个电报机器人,可获取动漫,角色和漫画信息。 学分 我(哈哈) 用于动画查询和格式设置。 数据库部分的 。 用于嵌入式anilist和tracemoe插件。 为nhentai模块。 用于改善整个机器人的内联部分。 如何运行...
  • 这是一个简单的电报机器人,用于获取有关Metaverse区块链的信息。 设置 首先,您需要创建一个Telegram机器人。 为此,您必须连接到BotFather并使用/newbot命令。 然后只需按照说明进行操作即可。 您将获得配置...
  • tmdb_bot 克隆使用来获取有关电影和电视节目的信息。 只需在任何Telegram聊天中编写@themdb_bot并开始使用它! Yoy也可以单击与之对话。
  • 机器人技术视频讲座(64讲)-机器人技术28-触觉信息的获取zip,机器人技术视频讲座(64讲)-机器人技术28-触觉信息的获取
  • 机器人技术视频讲座(64讲)-机器人技术30-视觉信息的获取zip,机器人技术视频讲座(64讲)-机器人技术30-视觉信息的获取
  • 发布有关命令统计信息 参数 command_name 字符串运行命令名称 author_id 字符串运行命令用户ID registerCustomFieldHandler 注册函数以获取要发布值 参数 customFieldNumber ( 1 | 2 )处理程序是...
  • OmNomNom是一种Telegram机器人,可以告诉您在柏林(德国)一些食堂可以吃什么。 我希望将来能支持其他城镇或国家更多食堂。 如果您有任何建议,请让我现在。 您可以邀请漫游器加入群组或直接提问。 如何使用它 ...
  • 使用此类通过 Research SDK 中 ROS 接口与 Baxter Robot 进行通信。 您可以移动机器人获取传感器信息。 该类创建必要发布者、订阅者和服务来控制机器人
  • 这是一个简单的机器人,可获取RSS提要并将其发布到IRC频道。 要求 python3 点3 virtualenv( pip3 install virtualenv ) 特征 将提要和新闻项保存在sqlite数据库中 在单独线程中获取每个提要 将新新闻发布到IRC...
  • 想建一个微信群平时发发淘宝优惠券商品,当个副业,但是发现经常要自己查看商品,发送链接,实在是太费时间精力(主要就是比较懒),于是萌生了做个脚本,实现自动获取网址商品信息,定时自动发送到群里。...

    前言

    想建一个微信群平时发发淘宝优惠券的商品,当个副业,但是发现经常要自己查看商品,发送链接,实在是太费时间精力(主要就是比较懒),于是萌生了做个脚本,实现自动获取网址商品信息,定时自动发送到群里。

    浏览网页信息

    首先浏览器打开网页:http://soa.s8bqi.cn/Newcms/html/realtime.html?mi=%E5%B0%8F%E7%BE%8E%E5%A5%BD
    按F12查看,因为最终都是在手机端打开的,所以先点击F12出现界面左上角的这个键在这里插入图片描述然后选择network, XHR
    在这里插入图片描述
    运气比较好,直接在图中选中的ssbdlist?id=0找到了当前所有的商品list。
    那直接爬取这个网址就可以了,http://mgi.sitezt.cn/api/i/cmsitem/ssbdlist?id=0
    验证下是不是包含了商品信息,用浏览器打开试试,如图商品的信息都用json格式很工整的列出来了。
    在这里插入图片描述

    爬取商品list

    调用requests得到所有信息,当然我们只需要一部分就够了,
    ItemId用来索引商品,ItemTitle商品名称,ItemImage商品图片,
    Recommend商品简介

    url = 'http://mgi.sitezt.cn/api/i/cmsitem/ssbdlist?id=0'
    req=requests.get(url)
    data=json.loads(req.content)
    

    先根据关键字简单过滤部分商品,比如水果,然后通过多个商品链接的点击发现,具体的商品详情链接的组合方式,
    http://soa.s8bqi.cn/Newcms/html/mobile/goodsDetail.html?pre=realtime&id=(商品ItemId)&mi=%E5%B0%8F%E7%BE%8E%E5%A5%BD
    在这里插入图片描述

    找到商品detail信息

    然后发现在这个网页F12–>network–> XHR,还是同样的套路,得到了当前商品的具体信息
    http://mgi.sitezt.cn/api/i/cmsitem/getcmsitemdetail?id=613699257749

    for goods in data:
    	if '水果' in goods['ItemTitle']:
    		source_url = 'http://soa.s8bqi.cn/Newcms/html/mobile/goodsDetail.html?pre=realtime&id='+str(goods['ItemId'])+'&mi=%E5%B0%8F%E7%BE%8E%E5%A5%BD'
    		goods_info = {}
    		uu = 'http://mgi.sitezt.cn/api/i/cmsitem/getcmsitemdetail?id=%s'%str(goods['ItemId'])
    		goods_info['TaoBaoTitle'], goods_info['Recommend'] = get_TaoBaoTitle(uu)
    

    模拟点击得到淘口令

    为了在手机微信端打开商品网页的体验更好,所以选择了复制淘口令的方式,但是这就有个问题,在网页你不点击,是无法出现对应的内容的,所以选择selenium + chromedriver 模拟点击事件,代码如下

    def get_loulin(url):
        mobile_emulation = {"deviceName":"iPhone 6"}
        chrome_option = webdriver.ChromeOptions()
        chrome_option.add_argument('headless')
        chrome_option.add_experimental_option("mobileEmulation", mobile_emulation)
        chrome_path = 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe'
        driver = webdriver.Chrome(executable_path=chrome_path, options=chrome_option)
        driver.get(url)
        driver.find_element_by_css_selector('div.koulin-buy').click()
        time.sleep(3)
        koulin = driver.find_element_by_css_selector('div.m-tkl-c').get_attribute("textContent")
        return "復製这条 %s 进入【Tao宝】即可抢购"%koulin
    

    下载商品图片

    然后就是下载商品的图片,选择一个本地路径保存图片

    def download_pic(img, mkdir_name):
        f = open(mkdir_name, 'wb')
        r = requests.get(img, timeout=(5))
        f.write(r.content)
        print(img)
        f.close()
    

    到此为止,我们已经得到了需要用于微信发送的所有商品信息,商品图片、商品名称、商品简介、商品淘口令,接下来就是如何通过微信实现自动化定时发送了,将在下一篇展开。

    未完待续。。。

    代码如下,稍微有点乱,下次再整理下:

    import requests
    from selenium import webdriver
    import io,sys,json
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
    
    def get_loulin(url):
        mobile_emulation = {"deviceName":"iPhone 6"}
        chrome_option = webdriver.ChromeOptions()
        chrome_option.add_argument('headless')
        chrome_option.add_experimental_option("mobileEmulation", mobile_emulation)
        chrome_path = 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe'
        driver = webdriver.Chrome(executable_path=chrome_path, options=chrome_option)
        driver.get(url)
        driver.find_element_by_css_selector('div.koulin-buy').click()
        time.sleep(3)
        koulin = driver.find_element_by_css_selector('div.m-tkl-c').get_attribute("textContent")
        return "復製这条 %s 进入【Tao宝】即可抢购"%koulin
    
    def get_TaoBaoTitle(url):
        req=requests.get(url)
        data=json.loads(req.content)
        return data['TaoBaoTitle'], data['Recommend']
    
    def download_pic(img, mkdir_name):
        f = open(mkdir_name, 'wb')
        r = requests.get(img, timeout=(5))
        f.write(r.content)
        print(img)
        f.close()
    
    def get_meiguang():
        url_data = []
        url = 'http://mgi.sitezt.cn/api/i/cmsitem/ssbdlist?id=0'
        req=requests.get(url)
        data=json.loads(req.content)
        index = 0
        for goods in data:
            if '水果' in goods['ItemTitle']:
                source_url = 'http://soa.s8bqi.cn/Newcms/html/mobile/goodsDetail.html?pre=realtime&id='+str(goods['ItemId'])+'&mi=%E5%B0%8F%E7%BE%8E%E5%A5%BD'
                goods_info = {}
                uu = 'http://mgi.sitezt.cn/api/i/cmsitem/getcmsitemdetail?id=%s'%str(goods['ItemId'])
                goods_info['TaoBaoTitle'], goods_info['Recommend'] = get_TaoBaoTitle(uu)
                goods_info['koulin'] = get_loulin(source_url)
                url_data.append(goods_info)
                default_dir = '%s.jpg'%str(index)
                index = index + 1
                image = goods['ItemImage']
                if 'https:' not in goods['ItemImage'] and 'http:' not in goods['ItemImage']:
                    image = 'https:' + image
                download_pic(image, default_dir)
        return url_data
    
    
    展开全文
  • OCR部分由,因此该机器人在下载图像后,将数据发送到Azure API,该API用JSON响应,该JSON包含有关图像中文本及其位置的信息。 图像处理是使用完成的。 机器人可以使用OpenCV根据其颜色(灰色,蓝色)找到消息框。 ...
  • 介绍了近年来国内外最新出现矿难机器人搜救系统,分析了这些系统所能完成开发规划、移动方式及机构、导航与通信、人机交互等极为关键技术,同时给出了今后发展和应用一些思路和建议,简单介绍了所开发两代...
  • RoboCup虚拟机器人操纵挑战赛模板 ...模板包括如何使用ROS控制凉亭中模拟机器人以及如何从可用的机器人传感器中获取要在感知算法中使用数据。 欲了解更多信息,请在这里访问RoboCup参与征集详细信息
  • 一个获取交易信息 单击添加该机器人。 Bot托管在heroku免费dyno上,并且在空闲时间过后将停止运行。 安装 创建一个.env文件并添加以下设置。 # Your linebot channel id CHANNEL_ID="" # Your linebot ...
  • 功能丰富漫游器可获取实时Covid-19统计信息。 命令 描述 状态 例 StateName /州代码 状态数据/按地区分类分析 :check_mark: Punjab , pb 所有 所有印度统计数据/大多数情况下前15个州 :check_mark: all...
  • ​ 本文主要采用的方法就是调用Vrep提供的两个API,getObjectPosition,getObjectOrientation,来获取全场坐标及相关角度的信息。 二. 关于位姿信息 ​ 底盘运动需要一定的信息参考,当前全场坐标,当前角度,才能往下...

    CoppeliaSim(Vrep)获取移动机器人底盘的位姿信息

    一. 前言

    ​ 本文主要采用的方法就是调用Vrep提供的两个API,getObjectPosition,getObjectOrientation,来获取全场坐标及相关角度的信息。

    二. 关于位姿信息

    ​ 底盘运动需要一定的信息参考,当前全场坐标,当前角度,才能往下进行路径等任务。所以,在Vrep中仿真底盘运动,也需要这样的信息,而Vrep中并没有实际现实中的陀螺仪和码盘模块,那么如何获取就成了一个必须要解决的问题。

    三. 具体过程

    1. 查找相关资料

    ​ 如果直接百度如何从Vrep获取位姿信息类似问题,是搜索不到有用的信息的。结合之前我在官方论坛提问获得的回答,以及初学Vrep时一个视频给了我启发。想要获取位姿信息,也就是当前全场坐标和陀螺仪提供的方向,Vrep中并没有这两个东西,那肯定需要找方法等效替代。官方当时的答复是获取相对坐标有[sim.getObjectPosition(number objectHandle,number relativeToObjectHandle)](https://www.coppeliarobotics.com/api/sim.getObjectPosition(number objectHandle,number relativeToObjectHandle))API函数可以调用。而视频中也提及了小车中轨迹规划涉及了相对夹角的判断,那也有很大可能存在获取相对角度的API。

    ​ 抱着这样的看法,就去官方文档API列表(按功能排列)中查找。

    在这里插入图片描述

    ​ 果然,就在getObjectPosition下面,有着getObjectOrientation。

    2. API官方介绍

    ​ 官方文档都是英文版的,下面做了简单的翻译。

    2.1 getObjectPosition

    描述 检索对象的位置。另请参见sim.setObjectPositionsim.getObjectOrientationsim.getObjectMatrix和其他矩阵/转换函数
    概要 simInt simGetObjectPosition(simInt objectHandle,simInt relativeToObjectHandle,simFloat *位置)
    C参数 objectHandle:对象的句柄。可以与sim.handleflag_reljointbaseframe组合(请参阅下一个参数)relativeToObjectHandle:指示相对于我们想要位置的参考系。指定-1可以获取绝对位置,指定sim.handle_parent可以获取相对于对象父对象的位置,也可以指定对象句柄相对于我们想要位置的参考框架。如果此手柄是关节的手柄,则将返回相对于关节的移动框架的位置(除非objectHandle与sim.handleflag_reljointbaseframe组合,在这种情况下,将返回相对于关节的基础框架的位置)。 position:指向3个值(x,y和z)的指针
    C返回值 如果操作不成功则为-1
    Lua简介 table_3 position = sim.getObjectPosition(number objectHandle,number relativeToObjectHandle)
    Lua参数 类似于C函数对应项
    Lua返回值 位置:3个值(x,y和z)的表
    等效的远程API 基于B0的远程API:simxGetObjectPositionsimxGetObjectPose旧版远程API:simxGetObjectPosition

    ​ 之前做的获取相对关节坐标系位置点,第二个参数放了关节的句柄,而现在希望获得的是全场坐标,即绝对坐标系,因此填入-1即可。在实际操作中则会发现,官方文档的介绍并不是十分严谨,例如返回参数的单位制都没有表述。此处先提及一下,后面会说到这个。

    2.2 getObjectOrientation

    描述 检索对象的方向(欧拉角)。另请参见sim.getObjectQuaternionsim.setObjectOrientationsim.getObjectPositionsim.getObjectMatrix和其他矩阵/转换函数
    概要 simInt simGetObjectOrientation(simInt objectHandle,simInt relativeToObjectHandle,simFloat * eulerAngles)
    C参数 objectHandle:对象的句柄。可以与sim.handleflag_reljointbaseframe组合(请参阅下一个参数)relativeToObjectHandle:表示相对于我们要定向的参考系。指定-1可以获取绝对方向,指定sim.handle_parent可以获取相对于对象父对象的相对方向,也可以指定相对于要获取其参考框架的对象手柄的方向。如果此手柄是关节的手柄,则将返回相对于关节的移动框架的方向(除非objectHandle与sim.handleflag_reljointbaseframe组合,在这种情况下,将返回相对于关节的基础框架的方向)。 eulerAngles:欧拉角(α,β和gamma)
    C返回值 如果操作不成功则为-1
    Lua简介 table_3 eulerAngles = sim.getObjectOrientation(number objectHandle,number relativeToObjectHandle)
    Lua参数 类似于C函数对应项
    Lua返回值 eulerAngles:3个值的表格(欧拉角)
    等效的远程API 基于B0的远程API:simxGetObjectOrientation旧版远程API:simxGetObjectOrientation

    ​ 这里参数填入及隐含的问题同上一API,还要简单了解一下,需要的是哪一个欧拉角,陀螺仪安置时强调在一个水平面,以及实际串口返回数据处理中,可以明确,需要的是xOy平面上的角度,则对应偏航角Y,对应返回参数中的γ。

    3. 搭建模型

    ​ 舵轮模型之前就搭好了,这次添加了一个Dummy,放置在车体中心位置。现在写文档时感觉如果坐标系和车体坐标系一样的话,像这个模型就是,可以省去添加Dummy这一步骤。
    在这里插入图片描述

    ​ 可以看到目前车体被我偏置了一定角度,在水平面上和右下角绝对坐标系形成了一定夹角,方便测试API的调用调试。

    4. API调用代码调试

    4.1 API代码编写

    ​ 这里只放置了简单框架,后面会有完整的。

    simxFloat PointFloats[3] = { 0 };
    simxFloat AngleFloats[3] = { 0 };
    
    while (clientID != -1)
    {
    	simxGetObjectPosition(clientID, WholePosition, -1, &PointFloats[0], simx_opmode_blocking);
    	cout << "x  " << PointFloats[0] << " y  " << PointFloats[1] << " z  " << PointFloats[2] << endl;	
    	simxGetObjectOrientation(clientID, WholePosition, -1, &AngleFloats[0],simx_opmode_blocking);
    	cout << "alpha  " << AngleFloats[0] << " beta  " << AngleFloats[1] << " gamma  " << AngleFloats[2] << endl;
    	Sleep(10);
    }
    

    4.2 实际效果

    在这里插入图片描述

    ​ 从实际效果可以发现,获得的数值都是精度很高的,不方便后续操作的。因此,需要想办法使数据格式统一,方便后续调用。这里采用的sprintf_s字符串格式化,再调用atof函数,让字符串转为浮点数的操作。

    4.3 API代码调试

    while (clientID != -1)
    {
    	simxGetObjectPosition(clientID, WholePosition, -1, &PointFloats[0], simx_opmode_blocking);
    	sprintf_s(StrTemp, 20, "%.2f", PointFloats[0]);
    	PointFloats[0] = (float)(atof(StrTemp));
    	sprintf_s(StrTemp, 20, "%.2f", PointFloats[1]);
    	PointFloats[1] = (float)(atof(StrTemp));
    	sprintf_s(StrTemp, 20, "%.2f", PointFloats[2]);
    	PointFloats[2] = (float)(atof(StrTemp));
    	cout << "x  " << PointFloats[0] << " y  " << PointFloats[1] << " z  " << PointFloats[2] << endl;	
    	simxGetObjectOrientation(clientID, WholePosition, -1, &AngleFloats[0], simx_opmode_blocking);
    	sprintf_s(StrTemp, 20, "%.2f", AngleFloats[0]);
    	AngleFloats[0] = (float)(atof(StrTemp));
    	sprintf_s(StrTemp, 20, "%.2f", AngleFloats[1]);
    	AngleFloats[1] = (float)(atof(StrTemp));
    	sprintf_s(StrTemp, 20, "%.2f", AngleFloats[2]);
    	AngleFloats[2] = (float)(atof(StrTemp));
    	cout << "alpha  " << AngleFloats[0] << " beta  " << AngleFloats[1] << " gamma  " << AngleFloats[2] << endl;
    	Sleep(10);
    }
    

    在这里插入图片描述

    ​ 现在就满足需求了,开始后续完整代码编写。同时需要注意的是,位置点单位都是m,而反馈的欧拉角则是弧度制,这些官方文档并未有相应的说明,算是官方做的不好的地方。

    5. 底盘位姿代码编写

    ​ 加入了线程操作,使得定位和驱动任务分开运行。

    #include <stdio.h>
    #include <stdlib.h>
    #include <vector>
    #include <iostream>  
    #include <process.h>
    #include <Windows.h>
    #include <time.h>
    #include <math.h>
    using namespace std;
    
    # define M_PI           3.14159265358979323846  /* pi */
    
    extern "C" {
    #include "extApi.h"
    }
    
    char StrTemp[20];
    
    int clientID;
    
    simxFloat PointFloats[3] = { 0 };
    simxFloat AngleFloats[3] = { 0 };
    
    DWORD WINAPI Position(LPVOID lpparm);
    DWORD WINAPI MoveMent(LPVOID lpparm);
    //线程终止https://www.cnblogs.com/keepsimple/p/3415994.html
    simxInt WholePosition;
    
    simxInt LFD;
    simxInt LBD;
    simxInt RFD;
    simxInt RBD;
    
    simxInt LFL;
    simxInt LBL;
    simxInt RFL;
    simxInt RBL;
    
    
    int main()
    {
    	clientID = simxStart("127.0.0.1", 19997, true, true, 5000, 5);
    
    
    	if (clientID != -1)
    	{
    		printf("success\n");
    	}
    	else
    	{
    		printf("error\n");
    	}
    	/*simx_opmode_blocking和simx_opmode_oneshot_wait是一个意思,
    	可以理解为这个操作执行一次,但是没有执行完就要等,所以速度慢,
    	但是会保证通信完成(和通信协议里的握手很像)。simx_opmode_oneshot
    	表示我把数据发出去之后就开始执行后面的语句,不管你发完了没。*/
    
    
    	simxStartSimulation(clientID, simx_opmode_oneshot_wait);
    
    
    
    	simxGetObjectHandle(clientID, "WholePosition", &WholePosition, simx_opmode_blocking);
    
    	simxGetObjectHandle(clientID, "LFMotorD", &LFD, simx_opmode_blocking);
    	simxGetObjectHandle(clientID, "LBMotorD", &LBD, simx_opmode_blocking);
    	simxGetObjectHandle(clientID, "RFMotorD", &RFD, simx_opmode_blocking);
    	simxGetObjectHandle(clientID, "RBMotorD", &RBD, simx_opmode_blocking);
    
    	simxGetObjectHandle(clientID, "LFMotorL", &LFL, simx_opmode_blocking);
    	simxGetObjectHandle(clientID, "LBMotorL", &LBL, simx_opmode_blocking);
    	simxGetObjectHandle(clientID, "RFMotorL", &RFL, simx_opmode_blocking);
    	simxGetObjectHandle(clientID, "RBMotorL", &RBL, simx_opmode_blocking);
    
    
    	HANDLE h1, h2;
    	h1 = CreateThread(NULL, 0, Position, NULL, 0, NULL);
    	cout << "定位开始运行\n" << endl;
    	h2 = CreateThread(NULL, 0, MoveMent, NULL, 0, NULL);
    	cout << "驱动开始运行" << endl;
    	CloseHandle(h1);
    	CloseHandle(h2);
    
    
    	while (clientID != -1)
    	{
    		if (getchar() == 'q')
    		{
    			simxSetJointTargetVelocity(clientID, LFL, 0, simx_opmode_blocking);
    			simxSetJointTargetVelocity(clientID, LBL, 0, simx_opmode_blocking);
    			simxSetJointTargetVelocity(clientID, RFL, 0, simx_opmode_blocking);
    			simxSetJointTargetVelocity(clientID, RBL, 0, simx_opmode_blocking);
    			simxStopSimulation(clientID, simx_opmode_oneshot);
    			simxFinish(clientID);
    			return 0;
    		}
    		else
    		{
    			Sleep(100);
    		}
    	}
    
    }
    
    DWORD WINAPI Position(LPVOID lpparm)
    {
    	while (clientID != -1)
    	{
    		simxGetObjectPosition(clientID, WholePosition, -1, &PointFloats[0], simx_opmode_blocking);
    		sprintf_s(StrTemp, 20, "%.2f", PointFloats[0]);
    		PointFloats[0] = (float)(atof(StrTemp));
    		sprintf_s(StrTemp, 20, "%.2f", PointFloats[1]);
    		PointFloats[1] = (float)(atof(StrTemp));
    		sprintf_s(StrTemp, 20, "%.2f", PointFloats[2]);
    		PointFloats[2] = (float)(atof(StrTemp));
    		cout << "x  " << PointFloats[0] << " y  " << PointFloats[1] << " z  " << PointFloats[2] << endl;
    
    		simxGetObjectOrientation(clientID, WholePosition, -1, &AngleFloats[0], simx_opmode_blocking);
    		sprintf_s(StrTemp, 20, "%.2f", AngleFloats[0]);
    		AngleFloats[0] = (float)(atof(StrTemp));
    		sprintf_s(StrTemp, 20, "%.2f", AngleFloats[1]);
    		AngleFloats[1] = (float)(atof(StrTemp));
    		sprintf_s(StrTemp, 20, "%.2f", AngleFloats[2]);
    		AngleFloats[2] = (float)(atof(StrTemp));
    		cout << "alpha  " << AngleFloats[0] << " beta  " << AngleFloats[1] << " gamma  " << AngleFloats[2] << endl;
    		Sleep(10);
    	}
    	return 0;
    }
    DWORD WINAPI MoveMent(LPVOID lpparm)
    {
    	while (clientID != -1)
    	{
    		for (int time = 0; time < 3; time++) {
    			Sleep(1000);
    			simxSetJointTargetPosition(clientID, LFD, 45 * M_PI / 180, simx_opmode_oneshot);
    			simxSetJointTargetPosition(clientID, LBD, 45 * M_PI / 180, simx_opmode_oneshot);
    			simxSetJointTargetPosition(clientID, RFD, 45 * M_PI / 180, simx_opmode_oneshot);
    			simxSetJointTargetPosition(clientID, RBD, 45 * M_PI / 180, simx_opmode_oneshot);
    
    			simxSetJointTargetVelocity(clientID, LFL, -5, simx_opmode_oneshot);
    			simxSetJointTargetVelocity(clientID, LBL, -5, simx_opmode_oneshot);
    			simxSetJointTargetVelocity(clientID, RFL, -5, simx_opmode_oneshot);
    			simxSetJointTargetVelocity(clientID, RBL, -5, simx_opmode_oneshot);
    		}
    
    		for (int time = 0; time < 3; time++) {
    			Sleep(1000);
    			simxSetJointTargetPosition(clientID, LFD, 135 * M_PI / 180, simx_opmode_oneshot);
    			simxSetJointTargetPosition(clientID, LBD, 135 * M_PI / 180, simx_opmode_oneshot);
    			simxSetJointTargetPosition(clientID, RFD, 135 * M_PI / 180, simx_opmode_oneshot);
    			simxSetJointTargetPosition(clientID, RBD, 135 * M_PI / 180, simx_opmode_oneshot);
    
    			simxSetJointTargetVelocity(clientID, LFL, -5, simx_opmode_oneshot);
    			simxSetJointTargetVelocity(clientID, LBL, -5, simx_opmode_oneshot);
    			simxSetJointTargetVelocity(clientID, RFL, -5, simx_opmode_oneshot);
    			simxSetJointTargetVelocity(clientID, RBL, -5, simx_opmode_oneshot);
    		}
    
    		for (int time = 0; time < 3; time++) {
    			Sleep(1000);
    			simxSetJointTargetPosition(clientID, LFD, 45 * M_PI / 180, simx_opmode_oneshot);
    			simxSetJointTargetPosition(clientID, LBD, 45 * M_PI / 180, simx_opmode_oneshot);
    			simxSetJointTargetPosition(clientID, RFD, 45 * M_PI / 180, simx_opmode_oneshot);
    			simxSetJointTargetPosition(clientID, RBD, 45 * M_PI / 180, simx_opmode_oneshot);
    
    			simxSetJointTargetVelocity(clientID, LFL, 5, simx_opmode_oneshot);
    			simxSetJointTargetVelocity(clientID, LBL, 5, simx_opmode_oneshot);
    			simxSetJointTargetVelocity(clientID, RFL, 5, simx_opmode_oneshot);
    			simxSetJointTargetVelocity(clientID, RBL, 5, simx_opmode_oneshot);
    		}
    
    		for (int time = 0; time < 3; time++) {
    			Sleep(1000);
    			simxSetJointTargetPosition(clientID, LFD, 135 * M_PI / 180, simx_opmode_oneshot);
    			simxSetJointTargetPosition(clientID, LBD, 135 * M_PI / 180, simx_opmode_oneshot);
    			simxSetJointTargetPosition(clientID, RFD, 135 * M_PI / 180, simx_opmode_oneshot);
    			simxSetJointTargetPosition(clientID, RBD, 135 * M_PI / 180, simx_opmode_oneshot);
    
    			simxSetJointTargetVelocity(clientID, LFL, 5, simx_opmode_oneshot);
    			simxSetJointTargetVelocity(clientID, LBL, 5, simx_opmode_oneshot);
    			simxSetJointTargetVelocity(clientID, RFL, 5, simx_opmode_oneshot);
    			simxSetJointTargetVelocity(clientID, RBL, 5, simx_opmode_oneshot);
    		}
    	}
    
    	return 0;
    }
    
    
    

    6. 实际效果

    ​ 下图中可以看到,坐标和角度信息随着底盘的运动而实时变化。

    在这里插入图片描述

    四. 总结

    ​ 没事的时候,可以翻翻官方的API函数列表,学学有哪些功能,说不定哪一天就能用上,2333。

    展开全文
  • 使用JS检查Discord机器人的令牌信息 当前状态: 在此处安装Nightly版本: 检查清单 渲染画面 渲染index.html 极限尺寸 限制全屏性 删除工具栏? /可能是自定义工具栏。 信息资料 从用户输入获取令牌 显示机器人...
  • 旋转图 关于神奇宝贝最佳电报机器人。 在任何聊天中获取所有信息
  • 在这篇dockerros配置中讲解了如何进行构建带有图形界面docker ros环境。以往都是在模拟器上进行模型有一些问题没有显示出来。最近在baxter真机上进行实验有一些问题出来了。一个比较诡异问题就是docker与baxter...

    1、简介

    这篇dockerros配置中讲解了如何进行构建带有图形界面的docker ros环境。以往都是在模拟器上进行模型有一些问题没有显示出来。最近在baxter真机上进行实验有一些问题出来了。一个比较诡异的问题就是docker与baxter的通信问题。

    2、问题描述

    2.1、使用的环境及配置

    ubuntu 16 + docker + ros k + baxter环境
    baxter真机

    2.2、问题

    以 --network host的方式启动docker 容器。然后设置ROS_IP为宿主ip。启动ros master。然后利用exec方式启动另一个终端启动baxter.sh与机器人进行通信。此时可以建立通信。可以获取rostopic 以及baxter的个关节的状态。但是发送移动手臂指令时候机器人无法响应并且有时无法获取左右臂操作对象。总的问题是可以获取一些信息无法进行操作。

    2.3、尝试解决方法

    1、更改docker的网络配置》》》》》》》结果无效
    2、修改一些相关的配置》》》》》》》》结果无效

    2.4、最终有效的解决方法

    以–privileged=true --network host 方式进行启动docker容器。设置ROS_IP为宿主ip。启动ros master。然后就是解决问题的关键。以exec启动另一个终端,su root 切换到root身份。在执行. baxter.sh 与机器人进行连接。这样就可以进行操纵机器人移动手臂。

    3、原因

    不好意思,目前换没有弄清楚其中的原因。再续

    展开全文
  • 可以在机器人的urdf模型中加入插件。 <!-- Fake localization plugin --> <plugin name="ground_truth_odometry" filename="libgazebo_ros_p3d.so"> <alwaysOn>true</alwaysOn> <...

    以插件形式获取

    可以在机器人的urdf模型中加入插件。

        <!-- Fake localization plugin -->
        <plugin name="ground_truth_odometry" filename="libgazebo_ros_p3d.so">
          <alwaysOn>true</alwaysOn>
          <updateRate>100.0</updateRate>
          <bodyName>base_link</bodyName>
          <topicName>base_pose_ground_truth</topicName>
          <gaussianNoise>0.01</gaussianNoise>
          <frameName>map</frameName>-->
            <!-- initialize odometry for fake localization-->
          <xyzOffsets>0 0 0</xyzOffsets>
          <rpyOffsets>0 0 0</rpyOffsets>
        </plugin>
    

    以订阅者形式获取

    订阅话题/gazebo/model_states,找到对应模型的名称,例如机器人名称为turtlebot3。

    void _modelStatesCallback(const gazebo_msgs::ModelStatesConstPtr &msg)
    {
      int modelCount = msg->name.size();
    
      for(int modelInd = 0; modelInd < modelCount; ++modelInd)
      {
          if(msg->name[modelInd] == "turtlebot3")
          {
              _current_pose.pose = msg->pose[modelInd];
              _current_velocity.twist = msg->twist[modelInd];
              break;
          }
      }
    }
    
    展开全文
  • 柔性肌骨机器人结构在感觉获取方面优势 Shuhei Ikemoto • Yoichi Nishigori • Koh Hosoda Artif Life Robotics 摘要: 形态计算是一个设计良好硬件能够承担部分机器人控制和每次感知所需计算成本概念...
  • Robotics System Toolbox (TM) 提供了 MATLAB (R) 和 Simulink (R) 与机器人操作系统 (ROS) 之间接口,使您能够测试和验证人类支持机器人 (HSR) 硬件和机器人模拟器(如 Gazebo)上应用程序该提交示例展示了...
  • 主题公园机器人 以下是用于创建此项目资源。 表示 指南和最佳实践: 带有NodeDocker 指南和最佳实践: Chrome合金 指南: VS代码 指南:
  • NASA Ames立体管线(ASP)是一套免费和开源自动大地测量和立体测量工具,旨在处理从卫星(围绕地球和其他行星),机器人漫游车,航拍相机和历史图像捕获立体图像(有无)准确相机姿态信息。 ASP生产制图产品...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,050
精华内容 820
关键字:

机器人的信息获取