Creating the palm joint
Currently, rotating the torso controls does not quite give me the result I'm after from the shoulders. To fix this, first select l_shoulder_ctrl_offset and r_shoulder_ctrl_offset and hit Shift+P to un-parent them from the chest_IK_ctrl. Now select spineF_IK_jnt, Shift-select l_shoulder_ctrl_offset and go Constrain > Parent. Repeat the step for the right arm and then we can move on to the hands.
Select l_armEnd_jnt and hit Ctrl+D to duplicate it and then Shift+P to bring it out of its current hierarchy. Rename the joint l_palm_jnt and then with that joint selected, hit Ctrl+D to duplicate it. Rename the new joint l_palmEnd_jnt and translate it along the Y-axis (make sure to set the translate mode to Local when doing this). Now parent l_palmEnd_jnt under l_palm_jnt.
Let's now create the low-res geometry for the hand. Select the main mesh and duplicate it. In Face mode, select all the faces, other than that of the hand, and delete them. Rename this geometry l_hand_proxy_geo and then parent the geometry under l_palm_jnt.
The palm control in place and the low-res mesh parented to it
Creating the palm control
To create the palm control, open up the Script Editor, load the createControls.py and add the following line to the end of the script:
cmds.pointconstraint(ctrl, s, mo=0)
Select l_palm_jnt and then execute the script to create the control. The joint will be both point and orient constrained to the control. Now edit the control in CV mode (F8) to make it more easily selectable.
Add the extra line to the script to both point and orient constraint the palm joint to the control
To get the palm to create the forearm twist, open up the Expression Editor (Windows > Animation Editor) and modify the bottom portion of the l_armTwist_expr to read like so:
l_lowerArmTwistA_jnt.rotateY = l_palm_jnt.rotateY *.25;
l_lowerArmTwistB_jnt.rotateY = l_palm_jnt.rotateY *.5;
l_lowerArmTwistC_jnt.rotateY = l_palm_jnt.rotateY *.75;
Now select l_palm_jnt, open up the Attribute Editor and set the Rotate Order to YZX. Set the Rotate Order for l_palm_ctrl to YZX also.
Editing the l_armTwist_expr to have the palm joint drive the forearm twist
Attaching the hand to the arm
Create 2 locators (Create > Locator) and rename them l_arm_FK_con and l_arm_IK_con. Select l_arm_FK_con and hit Ctrl+G to group it to itself. Rename this group l_arm_FK_con_offset and then do the same for l_arm_IK_con. Now select both l_arm_FK_con_offset and l_arm_IK_con_offset and parent them under l_palm_ctrl. Zero out the translate and rotate attributes in the Channel Box so they snap into place and then hit Shift+P to un-parent them. To make the locators more easily selectable, select them and increase the Local Scale X, Y and Z in the Channel Box (you'll find this setting under SHAPES).
Now select in this order: l_arm_FK_con, l_arm_IK_con, l_palm_ctrl_offset and go Constrain > Parent. Now select in this order: l_armEnd_jnt, l_arm_FK_con and go Constrain > Point and then Constrain > Orient. Then select in this order: l_armEnd_jnt, l_arm_IK_con and go Constrain > Point. The hand should now follow both the FK and the IK arm. We now want to use a Set Driven Key to control which arm chain it should follow.
The locators in place to allow the hand to follow the arm, and editing the Local Scale to increase the locators' size
Open up the SDK window by going Animate > Set Driven Key > Set and with the fkIkSwitch_ctrl selected, hit Load Driver. Then select the parentConstraint node that lives under l_palm_ctrl_offset and hit Load Driven. Then set the L Arm attribute to 0 (FK mode) on the fkIkSwitch_ctrl and on the parentConstraint node, set the L Arm FK Con W0 to 1 and the L Arm IK Con W1 to 0. Hit Key on the SDK window. Now set the fkIkSwitch_ctrl to 1 (IK mode) and on the parentConstraint node, set the L Arm FK Con W0 to 0 and the L Arm IK Con W1 to 1. Hit Key on the SDK window once more. The palm should now follow the arm correctly in both FK and IK modes.
Let's do a quick tidy up of the Outliner now. First, let's rename l_arm_FK_con and l_arm_FK_con_offset to l_palm_FK_con and l_palm_FK_con_offset as that makes more sense (do the same for the IK set). Then, select both l_palm_FK_con_offset and l_palm_IK_con_offset and hit Ctrl+G. Rename this group l_palm_con_grp.
Using the SDK window to have the hand follow the FK or the IK arm