Torque control MPC of a Panda manipulator with ROS 1 and roscontrol.
mamba
is faster but you can use conda interchangeably.
conda create -n panda_control
conda activate panda_control
mamba env update --file environment.yaml
This process assumes you have installed python3-rosdep
, python3-vcstool
and python3-catkin-tools
.
Warning
Building Pinocchio, HPP-FCL and Crocoddyl is very resource consuming!
In case of 32 Gb of RAM it is suggested not to exceed 12 cores.
If you have less memory, please change value in -j
parameter of catkin build
.
# Inside ROS workspace
vcs import --recursive < src/panda_torque_mpc/panda_torque_mpc.repos src
rosdep update --rosdistro $ROS_DISTRO
rosdep install -y -i --from-paths src --rosdistro $ROS_DISTRO
catkin build -j12 --cmake-args \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_PYTHON_INTERFACE=OFF \
-DBUILD_WITH_URDF_SUPPORT=ON \
-DBUILD_WITH_COLLISION_SUPPORT=ON
Tip
When making changes it is useful to build external dependencies in a separate workspace. This redusces rebuildigng time, but also increases stability, since jrl-cmakemodules might cause ROS path to stop working! To build the package in separate workspace follow:
# Main workspace with the package
mkdir -p ros_ws/src
# Isolated workspace for dependencies
mkdir -p deps_ws/src
git clone https://github.com/ArthurH91/panda_torque_mpc.git ros_ws/src/panda_torque_mpc
vcs import --recursive < ros_ws/src/panda_torque_mpc/panda_torque_mpc.repos deps_ws/src
cd deps_ws
source /opt/ros/noetic/setup.bash
sudo apt update
rosdep update --rosdistro $ROS_DISTRO
rosdep install -y -i --from-paths src --rosdistro $ROS_DISTRO --skip-keys libfranka
catkin build -j12 --cmake-args \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_UNIT_TEST=OFF \
-DBUILD_PYTHON_INTERFACE=OFF \
-DBUILD_WITH_URDF_SUPPORT=ON \
-DBUILD_WITH_COLLISION_SUPPORT=ON
cd ../ros_ws
source ../deps_ws/devel/setup.bash
rosdep install -y -i --from-paths src --rosdistro $ROS_DISTRO
catkin build --cmake-args \
-DCMAKE_BUILD_TYPE=Release
In two different shells:
roslaunch franka_gazebo panda.launch arm_id:=panda
roslaunch panda_torque_mpc sim_controllers.launch controller:=<controller-name>
Set PANDA_IP
env variable, e.g.:
export PANDA_IP=192.168.102.11
(CIIRC 6th floor)
export PANDA_IP=192.168.88.140
(CIIRC 4th floor)
export PANDA_IP=172.17.1.3
(adream)
- Bring robot to init position:
roslaunch panda_torque_mpc move_to_start.launch robot_ip:=$PANDA_IP robot:=panda
- Start one of the controllers:
roslaunch panda_torque_mpc real_controllers.launch controller:=<controller-name> robot_ip:=$PANDA_IP robot:=panda
The parameters of each controller are defined in config/controller_configs.yaml
. To run one of them in simulation or real, replace with:
-
ctrl_model_pinocchio_vs_franka
: print comparison of Rigid Body Dynamics computation between pinocchio+example-robot-data and libfranka -
ctrl_log_update_dt
: logs ::update time and duration parameters in a csv file to investigate RT control -
ctrl_playback_pd_plus
: reads a joint trajectory stored in csv files q.csv, v.csv, tau.csv and plays it back using PD+ -
ctrl_joint_space_ID
: follow joint trajectory reference using different flavors of joint space Inverse Dynamics -
ctrl_task_space_ID
: follow task space end-effector trajectory ($\mathbb{R}^3$ or SE(3)) -
ctrl_mpc_linearized
: asynchronous execution a linearized control reference from OCP solver running in another node (crocoddyl_motion_server_node) using Ricatti gains -> very few computation, no update() skipped
roslaunch panda_torque_mpc simulation.launch arm_id:=panda simulate_camera:=false
roslaunch panda_torque_mpc obstacle_visualizer.launch spawn_in_gz:=true
roslaunch panda_torque_mpc sim_controllers.launch controller:=ctrl_mpc_linearized
roslaunch panda_torque_mpc crocoddyl_motion_server_node.launch
ROS_NAMESPACE=/ctrl_mpc_linearized roslaunch panda_torque_mpc pose_publisher.launch
roslaunch panda_torque_mpc real_controllers.launch controller:=ctrl_mpc_linearized robot_ip:=$PANDA_IP robot:=panda
roslaunch panda_torque_mpc crocoddyl_motion_server_node.launch
ROS_NAMESPACE=/ctrl_mpc_linearized roslaunch panda_torque_mpc pose_publisher.launch
First, check that pose_e_c
and pose_c_o_ref
have sensible values in controller_config.yaml
roslaunch realsense2_camera rs_camera.launch
roslaunch apriltag_ros continuous_detection.launch # check the tag id/tag size etc.
roslaunch panda_torque_mpc real_controllers.launch controller:=ctrl_mpc_linearized robot_ip:=$PANDA_IP robot:=panda
roslaunch panda_torque_mpc crocoddyl_motion_server_node
- Double check if
initialized
topic is streamed when using the real controller (not likely) - Check if latest franka_ros fixes inverted torque measurements in gazebo sim
- Refactor log publishers -> LoggingExperiment class with RTpublishers?
- stream
pose_c_o_ref
from outside source