机器人移动平台是一个包含完整成熟的感知、认知和定位导航能力的轮式机器人底盘产品级平台,产品致力于为各行业细分市场的商用轮式服务机器人提供一站式移动机器人解决方案,让合作伙伴专注在核心业务/人机交互的实现。以下是我司产品双臂机器人以及复合升降机器人,都搭载了移动底盘。
底盘参数
- 轮对
- 六轮(2个驱动轮+4个万向轮)
- 差速驱动+主动悬挂 250W轮毂伺服电机x2个
- 重量
- 50Kg
- 承重能力
- 承重60Kg(过坎能力8mm,爬坡角度5°)
- 承重40Kg(过坎能力12mm,爬坡角度5°)
- 空载(过坎能力20mm,爬坡角度10°)
- 尺寸
- 高:280mm 直径:505mm
- 电源
- 18650锂离子电池组: 25.2V 20Ah(21V-29.4V) 4A适配器
- 可选25.2V 35Ah 6A适配器
- 满电工作时长
- 20Ah电池: 静止(0m/s)可运行20小时, 无负载运行(0.7m/s)可运行11小时
Web示教器界面的进入以及在示教器里面禁行移动测试
连接底盘进入底盘web示教器的方式可以有两种,一种是有线连接然后在浏览器输入对应的ip地址我这里的IP地址为192.168.10.10:9001。一种是通过无线的方式连接底盘的ip,无线连接的WiFi是以admin开头,密码默认为12345678,再在了浏览器输入对应的IP地址即可进入web界面。我这里使用有线连接的方式进入(不用输入密码)web界面如下:
值得注意的是,当我们从新打开地图后,我们进入后先矫正底盘的位置然后再进行操作,矫正完成后再进行所需点位的建立,建立好点所需要的的点位后,我们进入以下的测试工具。
随即会进行url的跳转进入到如下的界面
我们可以进行点位的选取以及循环次数的设置,点击开始执行确保机器人的急停处于打开状态机器人就可以按照点位来进行运动。
调用Api来进行底盘根据点位的运动
首先我们需要提前了解移动底盘的api接口文档,此次demo以两点之间的移动举例
指令: /api/move
参数:
名称 | 说明 | 是否必选 | 备注 | 从以下版本开始 |
marker | 目标点位代号 | 与location 必选其一 | 优先级低于location | |
location | x<地图中x轴坐标>,y<地图 中y轴坐标>,theta<地图中相对theta值> | 与marker 必选其一 | ||
max_continuous_retries | 原地最大连续重试次数(机器人原地不动时,重试次数超过此值则任务失败) | 可选 | 默认30 次 | 0.7.11 |
distance_tolerance | 距离容差,类型float,单位米。 (当目标位置被占据等原因无法到达时,机器人移动到目标此距离之内也算任务成功。) | 可选 | 默认值跟机器人型号相关 | 0.7.12 |
theta_tolerance | 角度容差,类型float,单位弧度。(到达目标点位后,角度小于此值后任务成功) | 可选 | 默认值跟机器人型号相关 | 0.7.12 |
angle_offset | 到达位置后的角度偏移, 例如使用marker=m1发送任务时, 会以m1的角度 +angle_offset的角度作为最终方向执行任务. | 可选 | 单位弧度, 范围[-3.14, 3.14], 默认0 | 0.8.2 |
yaw_goal_reverse_allowed | 双向停靠控制参数,取值1或 0或-1。对于双向行走的机器人,此参数用于机器人停靠到点位时,是否允许尾部跟点位方向一致。 | 可选 | 1:允许; 0:不允许; 其他: 使用默认 | 0.8.7 |
occupied_tolerance | 让步停靠距离参数,单位米。当目标点位被占用时,设置此参数机器人会直接在点位附近停靠以完成任务,而不再尝试移动到点位上。距离以占用物边缘至机器人中心计算。 | 可选 | [0.1, ) | 0.8.7 |
接下来我们在程序当中进行调用:
# demo9
def move_chassis(client, marker):move_command = f'/api/move?marker={marker}'client.send(move_command.encode('utf-8'))chassis_receive_data = client.recv(1024)print("++++++++")response = client.recv(1024).decode()print("Response:", response)data = json.loads(response)move_code = data.get("code")# time.sleep(10)while True:response = client.recv(1024).decode()print("Response:", response)data = json.loads(response)move_code = data.get("code")if move_code == "01002":print("Move completed successfully.")time.sleep(1)break
这段代码主要是与底盘建立连接以及参数的的编写,循环监听返回的状态码来进行到位信息的判断。
在主函数当中调用的代码如下:
#建立与机器人的socoket链接chassis_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)chassis_host = '192.168.10.10'chassis_port = 9001chassis_client.connect((chassis_host, chassis_port))print("-------------")#前往Test_1点位target_marker = 'Test_1'move_chassis(chassis_client,target_marker)time.sleep(10)#前往的Test_2点位target_marker = 'Test_2'move_chassis(chassis_client,target_marker)
这里,我们建立了与底盘的链接以及调用了两个点位具体内容如上程序所示。