硬件-EP
- 4-axis palletizing robot arm,四轴机械臂?
- 可灵活夹取的环形爪
- 麦克纳姆轮,全向移动
- 快速无线数据连接:实时视频流,开放的SDK(Software Development Kit)(软件开发工具包)
- external computing platform:NUC(迷你主机)
Model:NUC11PAHI7
CPU:i7-1165G7 (2.8GHz, 8 Cores)
RAM:8GB
SSD:256GB - onboard lidar(机载激光雷达)
- RGB-D cameras(彩色深度相机)(获得彩色图+深度图)
软件架构-模拟
Core (核心)(ROS Master)
ROS系统中的通信中心
Server(服务端)
在阶段1,任务是在模拟场景中执行的
用habitat-sim
和habitat-lab
构造了在实际测试场景中的数字孪生
这个数字孪生容器包括了测试场景和EP的模拟
Server
和Client
的通信接口是ROS topics
Client(客户端)
在本仓库中,为这个任务提供了一个基本的方法。
一个功能镜像可以通过搭建镜像或者是拉取镜像tb5zhh/icra-2023-client:latest
来获得
注意,由于硬件资源约束,一个启动的客户端应该限制使用不超过6个CPU和8192MB内存
这个约束在launch.sh
通过参数--cpus=5.6 -m 8192M
强加上去了,在开发中不要移除!否则在实际测试中的表现远不如本地测试。
这个兜底镜像(或者是你搭建的镜像)要以基础镜像docker.discover-lab.com:55555/rm-sim2real/client-base:v1.4.0
为基础。
这个基础镜像包括了基本的功能包(例如,键盘控制)。参考this repo获得关于这个基础镜像的更多信息。
怎么做
启动服务端和客户端
launch.sh
启动脚本会按顺序创建docker网络
、通信核心
、服务端
、客户端
scripts/launch.sh
可以通过指定环境变量SERVER_IMAGE
、CLIENT_IMAGE
来改变镜像
# 假设客户端为client-test:latest
CLIENT_IMAGE=client-test:latest scripts/launch.sh
在你启动你本地搭建的客户端
的时候这会很有用
通常情况下,如果启动成功,会有3个image-view
窗口和1个cartographer
窗口在屏幕上显示
启动服务端且创建不运行的客户端容器
启动模拟服务端然后创建不自动运行比赛动作的客户端容器,用额外的开始点执行launch.sh
在调试启动客户端前的部分的时候很有用
scripts/launch.sh bash
显示在屏幕的可视化内容与上面的部分的结果应该是一致的(因为服务端也同样地启动了
终止服务端和客户端
下面的脚本会立刻终止所有运行中的容器并且移除创建的网络
scripts/halt.sh
为客户端创建一个shell
在客户端打开一个shell
scripts/shell.sh
默认的ROS命令可以直接用(不需要source setup.bash
在运行中的容器里的任何修改都不会保存(也就是说,建议使用仅仅使用shell来调试
需要修改保存请使用docker build
在客户端执行命令
shell.sh
接受命令作为参数,例如
scripts/shell.sh rostopic list -v
用键盘手动控制EP
用scripts/kbd_control.sh
来手动控制EP
scripts/kbd_control.sh
控制说明:
i
:向前移动
,
:向后移动
j
:逆时针旋转
l
:顺时针旋转
J
:水平向左移动
L
:水平向右移动
k
:停止移动
q
:提高机器人速度
z
:降低机器人速度
1
:降低机器臂
2
:升高机器臂
3
:关闭机械爪
4
:打开机械爪
Ctrl+C
:停止接收键盘输入
显示放置矿石的计时器
judging.sh
调用rostopic echo
用来在屏幕打印ROS话题/judgement/markers_time
scripts/judging.sh
设置矿石的位置
提供了ROS接口用于在虚拟环境中手动放置矿石。默认地,矿石会通过与RM Sim2Real 2022
同样的方式安放。
用于放置矿石在随机生成的位置上:
docker exec -it client /opt/ros/noetic/env.sh /opt/workspace/devel_isolated/env.sh /opt/ep_ws/devel/env.sh rostopic pub -1 /reset geometry_msgs/Point "x: 0.0
y: 0.0
z: 0.0"
x,y,z的值代表矿石的数字标签会被交换。(???)
如果x,y,z的值不在1-5之间或者是相同的话, 那么它们就会随机放置
用于手动放置矿石在指定的位置:(
PoseArray
应该有5个条目)
docker exec -it client /opt/ros/noetic/env.sh /opt/workspace/devel_isolated/env.sh /opt/ep_ws/devel/env.sh rostopic pub -1 /pose_set geometry_msgs/PoseArray "header:
seq: 0
stamp:
secs: 0
nsecs: 0
frame_id: ''
poses:
- position:
x: 3.0
y: 0.0
z: 3.0
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
- position:
x: 3.0
y: 0.0
z: 3.15
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
- position:
x: 3.0
y: 0.0
z: 3.3
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
- position:
x: 3.0
y: 0.0
z: 3.45
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
- position:
x: 3.0
y: 0.0
z: 3.6
orientation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0
"
如果poses的数量少于5个或者是pose无效的,这个pose会设置成随机的数值
用Visual Studio Code来调试
安装一个vscode的插件来远程开发docker容器 (ms-vscode-remote.remote-containers):
点击左下角的远程开发按钮然后选择
Attach to Running Container
:然后选择正在运行的客户端容器(也就是/client)然后打开文件夹
/opt/ep_ws/src
。现在你应该可以直接修改在容器中的文件。注意:通过这种方式进行的任何修改都不会持续地生效。一旦容器被终止并移除,所作的修改会丢失。建议用只用
shell
进行调试,并用docker build
来实现持续生效的修改
搭建一个更新后的客户端镜像
本仓库包含了一个Dockerfile
。为了搭建一个新的客户端镜像,执行:
# Build with name `client-custom` and tag `latest`
docker build . -t client-custom:latest
默认地,用于控制的代码位于src/
(在本仓库的src/
)。当搭建一个新的客户端镜像后,所有在src/
的代码会被复制到镜像中的/opt/ep_ws/src/rmus_solution
。
在镜像中,/opt/ep_ws
是ROS的工作空间目录,之后在dockerfile中,在这个目录下执行catkin_make
。
客户端的入口固定在此仓库根目录下的start.sh
。当这个新的客户端镜像搭建时,这个脚本拷贝到/opt/start.sh
且作为作主要入口为客户端服务。这个文件的内容可以根据需求任意改动,但这个脚本(start.sh
)的名称不能修改。
如果新的镜像需要额外的apt和pip功能包,请修改Dockerfile
来在编译时获得这些功能包。
请修改这几行来添加更多的apt
依赖:
# 用apt安装额外的依赖
RUN apt-get update && \
apt-get install -y --no-install-recommends \
ros-noetic-depthimage-to-laserscan ros-noetic-map-server python3-tf-conversions ros-noetic-global-planner && \
rm -rf /var/lib/apt/lists/* && apt-get clean
请修改这几行来添加更多的pip
依赖:
# 用pip安装额外的依赖
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple scipy
提交镜像
提交镜像需要报名ICRA Robomaster Sim2Real challenges
,在继续进行前请先注册。
如果你想要为了线上测试而提交的话,请先给提交的镜像打标签:
# 假设你的镜像有名称client-custom和标签latest
docker tag client-custom:latest docker.discover-lab.com:55555/[username]/client:[tag]
在注册的时候用你的用户名替换username
,用你喜欢的标签替换tag
。
注意,名称不是client
的镜像会被线上测试系统忽略。
在这之后,推送你的镜像到登记处。
docker push docker.discover-lab.com:55555/[username]/client:[tag]
你可以在这里找到镜像的测试结果。
从服务端/客户端容器拷贝文件,拷贝文件到服务端/客户端容器
你可以参考这个页面来实现在宿主机和容器之间的文件拷贝。
通常,当你需要更新容器里的资源,那么你需要修改在本仓库的源代码然后参考这个页面来搭建一个更新后的镜像。直接拷贝文件进容器中只能在调试时这么干。
例程
为了启动baseline的作为独立组件的例程,请参考routines.md