From 90cf68441e89f67fc85797637667ab7444809e30 Mon Sep 17 00:00:00 2001 From: Michael Ripperger Date: Wed, 17 Jan 2024 16:50:57 -0600 Subject: [PATCH] Added README --- README.md | 24 ++++++++++++++++++++++++ docs/panel.png | Bin 0 -> 14054 bytes 2 files changed, 24 insertions(+) create mode 100644 README.md create mode 100644 docs/panel.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..d778cd6 --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +# Trajectory Preview + +ROS-enabled Qt widget and Rviz panel for interactively previewing robot trajectories + +![Trajectory preview panel](docs/panel.png) + +## Usage +The widget subscribes to a `trajectory_msgs/JointTrajectory` definition of a robot trajectory and +publishes a `sensor_msgs/JointState` message corresponding to the state in the trajectory at which the slider is set. + +An Rviz `RobotModel` display can then be used to visualize the preview using the following pipeline: + - The trajectory preview widget publishes joint states (`/trajectory/joint_states`) + - A `JointStatePublisher` node integrates the trajectory preview widget joint states topic (`/trajectory/joint_states`) into a constantly published joint states topic (`/preview/joint_states`) + - A `RobotStatePublisher` node subscribes to the high-level preview joint states topic (`/preview/joint_states`) and creates a TF tree with the prefix `preview` + - The Rviz `RobotModel` display animates the robot model using the `preview`-prefixed TF tree + +This pipeline is provided in the `robot_model_preview_pipeline.launch.xml` file + +## Build +```commandLine +cd +rosdep install --from-paths src -iry +colcon build +``` diff --git a/docs/panel.png b/docs/panel.png new file mode 100644 index 0000000000000000000000000000000000000000..69dcc55179dfd33ba5fc22d049e51ea133cd8a9a GIT binary patch literal 14054 zcmd73gL_=v_dYyH+E|T^rm=0iQDfV-oiw(Z#zteCO=BAq+ctma`F!6$;@#I=b7sz2 zv-fPQea^b?dqw<^mqdccg9m{?NYYYbN+1v<2Jkry77}>xbyar*4p7b_(kig9u;49) zO%R9#BrPVa;*oilFUevUF$PuO981D3dxh00B$fR-gHT2xr?pSy2wS2SPa<4L|jT->M+bh=Nj-K_iCcU~B-udnCc zFs0Gq<7&|gq9mwV8dEv^Q4EZX#`Tr)?k+JM9eljJ zFnBRENyFDSH%Bg^=e)49%L$V67G(5il^U7KJNkh_LuT4}q~UIgyJXi7`S~Kdgq6yB z1&4*cXTS9!xm0KrhM2$P%b%si_q`YXECFFtwFMJB*)7A6uUqe%zOZPKd ziU;ba=^BK2)wTWn8G5++(ad3!1bU3?*w8=IX{w*f1hm9bAiN5AVf$(%B4F^u`S2>x z*->GC{`z$~Gn3fR(6Dl&a;Nt@i(UjX_m3fqCI<%xDEC)fd@!3dl+RCsLeC+VxVSjw zeo48r+)(Nf$_Pp0Vd$jcx~3+GfLoV4lLDUILq-aUGDTUDxy@N$F`h$Zo#@h3=t);# zQdwD9(b1LJP*&$uRLL9hXa)2^Ah}}_SMtKZ_DVb%4jjbdABQGZR_WQczh*IyosR|NG#cDzpZEJxcXWsrFLtwGxO)0YOh5F1H44peUIw~e%5eE0Nv9c;pOMbu2o#;*u zQ5Wa4q7Bs2`nz+bLFXndEiED8rKe}tIn2(0jLcW3p{$h1p6PNEByaA}x&X@cX?y!C=*P4qO50r!sG-_;>8RYY0g-% z?UIpmab4Qj*pMf7w6rYZxuIVt9LHluO3X$@dgU_%rirIE39YRmPQ-umk!X%3-^k+d z{^o8kKD?2A1-y)rvAMSC-VYx5i& l$7|cS!D&v{rSoRhZw*N^ld>3nVE&UZBPXH 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 zat